Базовый курс. Решение ДЗ №4
Представляем решение четвертого домашнего задания.
16 видео-уроков, рекомендую к просмотру всем участникам базового курса, поскольку в решении рассмотрены несколько подводных камней текущего задания.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.
У меня файлы не качаются ((( И по следующим материалам, связанными с ДЗ базового курса – около этих тем не отображаются картинки, и файлы также не качаются
проверьте еще раз, шли работы на сервере…
Все хорошо, спасибо
Не вопрос.
Sorry за задержку…
С часовыми поясами мощно :) и любопытно. Первый раз вообще про этот момент слышу. Спасибо
Имхо, для проверки простых чисел, оптимальнее использовать теорему Вильсона: p — простое число тогда и только тогда, когда (p − 1)! + 1 делится на p.
Думаю да.
Но я не ставил целью поиск оптимального алгоритма.
не понял что за оператор %
Остаток от деления.
С часовыми поясами, конечно – БРАВО, глубина мысли поражает:)
Не знал про остановку по ошибке, спасибо!
После выполнения домашнего задания № 4,
а потом просмотра Вашего решения ДЗ, я
по Вашему примеру решил навести порядок
и перенес все процедуры в общие модули.
Но, о горе! У меня пропали все сообщения
пользователю, которые я выводил для своего
удобства для проверки своих мыслей. Я вернул
все обратно. Не выводятся! Поковырявшись,
я обратил внимание на то, что сообщения
перестали выводиться после того как я
перенес процедуру ВЫЯСНИТЬВАРИАНТОБЕДА() в
конец блока ПРИНАЧАЛЕРАБОТЫСИСТЕМЫ().
ВОПРОС:
Правда ли, что метод СпискаЗначений
ОТМЕТИТЬЭЛЕМЕНТЫ() в управляемом приложении затирает окно сообщений или у меня где-то неправильные настройки? В обычном приложении все сообщения выводятся на экран нормально.
> в управляемом приложении затирает окно сообщений или у меня где-то неправильные настройки
Скорее всего это не так. Пока нет возможности проверить.
Приветите код события ПриНачалеРаботыСистемы() завтра разберемся.
Для упрощения ситуации я весь код ДЗ закомментировал, оставил самое необходимое.
В модулях управляемого и обычного приложений вставляем один и тот же код.
Сначала:
<code>
Перем глОбед Экспорт;
Процедура ПриНачалеРаботыСистемы()
Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; до выбора варианта обеда.”);
Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; после выбора варианта обеда”);
КонецПроцедуры
</code>
В обоих приложениях выводятся оба сообщения.
После этого между 2-мя СООБЩИТЬ() вставляем выбор варианта обедов и получаем код:
<code>Перем глОбед Экспорт;
Процедура ПриНачалеРаботыСистемы()
Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; до выбора варианта обеда.”);
Обеды = Новый СписокЗначений;
Обеды.Добавить(“Курица”);
Обеды.Добавить(“Рыба”);
Обеды.Добавить(“Мясо”);
глОбед = Новый Массив;
ЕстьОбед = Ложь;
Пока ЕстьОбед = Ложь Цикл
Если Обеды.ОтметитьЭлементы(“Выберите себе варианты обеда”) Тогда
Для каждого Элемент Из Обеды Цикл
Если Элемент.Пометка Тогда
глОбед.Добавить(Элемент.Значение);
ЕстьОбед = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; после выбора варианта обеда”);
КонецПроцедуры
</code>
Наблюдаем результат, о справедливости которого я и спрашивал.
Воспроизводится.
Забавный эффект, проявляется он при открытии любой формы (не только приложения).
Сейчас поведение расследуем..
Похоже, что это ошибка платформы.
У меня лично платформа 13.202 очень глючит, например с вызовом сервера. Пол дня чисто убил и не мог понять почему в модуле управляемого приложения не хочет работать экспортная (серверная +вызов сервера) процедура. Но ладно бы блин вообще не отрабатывала, дак один раз отработает, а захочешь ещё добавить одну процедуру там же, то она не отрабатывает, пишет неопознаный метод…. Но что ещё смешнее когда я у рабочей процедуры просто меняю имя и обращаюсь в модуле управляемого приложения уже по новому имени то она не работает. КОРОЧЕ начмучился, пока не вспомнил про урок где говорилось что просто можно сказать с каким реализом запускать. Попробывал с 12…. всё блин работает, хоть бы гавкнула:))) . Пробую реализ 13.205 тоже всё замечательно отрабатывает. Так и не понял в чём прикол. Может быть просто глюк реализа 13.202.
Порой бывает очень обидно искать косяки, а потом понимать, что это “особенности” такого-то релиза..
Очень полезно было узнать про остановку по ошибке. Спасибо! И еще полезно то, что в ходе объяснения решений даются также и навыки грамотного подхода к решению. Сначала анализ условия, затем … При этом показаны способы не наткнуться на “грабли” разного рода. Минимизируется время разработки … и т.д. Все это очень важно для начинающих и даже для тех, кто опытным себя считает.
Решение задания замечательное, но есть два небольших вопроса:
1. По поводу некорректного сравнения времени реобразованному к строке – думаю функция форматирования с ведущим нулем Формат(ТекущаяДата(),”ДФ=HHmmss; ДЛФ=T”) нас бы от этого избавила.
2. В результате оптимизации функция МестноеВремя(ОбщиеФункцииСервер.ПолучитьДату()) уехала в модуль с признаком компиляции Толстый Клиент. Как же здесь учесть часовые пояса?
1. Все верно.
2. Действительно, оптимизация привела к ошибке.
Спасибо за внимательный просмотр!
а я не понял, почему будет ошибка…
ведь все равно мы получаем “универсальное” время на сервере ОбщиеФункцииСервер.ПолучитьДату(), а потом преобразуем его к местному… какая разница – в тонком клиенте, или в толстом?
Действительно, не проверил.
Разницы нет, ведь универсальная дата в любом случае будет получаться на сервере.
Спасибо за двойную внимательность :)
Смотрел-смотрел, думал-думал и решил замерить производительность (не подумайте что захотелось поумничать :) )
ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();
НачалоРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),9,5,38);
ОкончаниеРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),18,11,42);
входим= (ДатаЗапуска>НачалоРаботы и ДатаЗапуска<ОкончаниеРаботы);
0,000014
0,000005
0,000005
————–
0,000024
Время = Час(ДатаЗапуска)*3600+Минута(ДатаЗапуска)*60+Секунда(ДатаЗапуска);
НачалоВремя=9*3600+5*60+38;
ОкончаниеВремя=18*3600+11*60+42;
входим= (Время>НачалоВремя и Время<ОкончаниеВремя);
0,000008
0,000005
0,000005
0,000004
————–
0,000022
Время = Час(ДатаЗапуска)*3600+Минута(ДатаЗапуска)*60+Секунда(ДатаЗапуска);
входим= (Время>32738 и Время<65502);
0,000008
0,000005
————–
0,000013
А еще в ПередНачаломРаботыСистемы нет передачи переменной ДатаЗапуска
ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы);
Отказ = ОбщиеФункцииКлиент.ЗапускЗапрещен(НачалоРаботы, ДатаЗапуска, ОкончаниеРаботы);
поэтому в ОбщиеФункцииКлиент.ЗапускЗапрещен еще раз вызывается ОбщиеФункцииКлиент.ПолучитьДату();
Если в ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы); добавить еще один параметр
ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы, ДатаЗапуска);
то в ОбщиеФункцииКлиент.ЗапускЗапрещен можно убрать строку ОбщиеФункцииКлиент.ПолучитьДату();
Все правильно говорите.
Здесь как раз тот случай, когда нужно выбрать читаемость кода. Какой вариант на ваш взгляд лучше?
думаю что в данном случае читабельность это
1. не критично – на крайний случай можно комментарий написать откуда взялись числа 32738 и 65502
2. еще вопрос что читабельнее – 4 строки или 2 :)
в общем “на вкус и цвет…”
Я думаю моя рекомендация ясна:
– учитывать не только быстродействие кода, но и его читабельность (комментарии в коде говорят о его сложности для понимания).
– в каждой конкретной ситуации анализировать, что приоритетнее: быстродействие или читаемость.
спасибо за конструктор форматной строки и за “остановиться по ошибке” в отладчике.
вопрос по обычному приложению. в реальных условиях, при создании базы с нуля, нужно ли проектировать систему с учетом него?
Зачем оно вообще нужно на этой платформе
Как я понимаю, оно оставлено исключительно
А. Для совместимости
Б. для тех кто привык работать в 7,7 8,0 8,1 и не хочет отвыкать.
В. тест для будущей новой платформы а-ля SAP
>нужно ли проектировать систему с учетом него
Для новой конфигурации режим обычного приложения можно использоваться только в следующем случае:
Создание специальных форм (АРМ), которые невозможно реализовать на управляемых формах.
Во всех остальных случаях рекомендуется использовать режим управляемого приложения.
присоединяюсь к благодарностям за конструктор форматной строки и остановиться по ошибке! век живи, век учись
Спасибо, было очень познавательно.
а почему бы проверку на обеды устроить не так?
<code>
Сообщение = «Что Вы хотите сегодня на обед?»;
Пока ВашВыбор = Ложь Цикл
ВашВыбор = СписокЗн.ОтметитьЭлементы(Сообщение);
Сообщение = «А я хочу явного ответа. Что Вы хотите сегодня на обед?»;
КонецЦикла;
</code>
Да не все скопировал
перед этим всем нужно
ВашВыбор = Ложь;
ой понял свою ошибку он же не проверяет если просто ОК жмешь.
Да, есть такая проблема в этом алгоритме :)
что мешает сделать таким образом?
<code>
Пока Не глОбед.ОтметитьЭлементы(“Какой вариант обеда предпочитаете?”) Цикл
Предупреждение(“Голодным быть нельзя!”);
КонецЦикла;
</code>
все) тоже понял свою ошибку
Ок )
Браво!
Часовые пояса…. даже в голову не пришло такое развитие сюжета.
поправьте нумерацию :)
Done )
СПАСИБО! Очень много для себя подчерпнул. Конечно хотелось бы это всё запомнить, но почему то забывается, наверное из за нехватки опыта. Или из за дырявой головы :))