Базовый курс. Решение ДЗ №4

Представляем решение четвертого домашнего задания.

16 видео-уроков, рекомендую к просмотру всем участникам базового курса, поскольку в решении рассмотрены несколько подводных камней текущего задания.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментария 43 на “Базовый курс. Решение ДЗ №4”

  1. У меня файлы не качаются ((( И по следующим материалам, связанными с ДЗ базового курса – около этих тем не отображаются картинки, и файлы также не качаются

  2. С часовыми поясами мощно :) и любопытно.  Первый раз вообще про этот момент слышу. Спасибо

  3. Максим Ефимов 06.02.2011 в 14:16

    Имхо, для проверки простых чисел, оптимальнее использовать теорему Вильсона: p — простое число тогда и только тогда, когда (p − 1)! + 1 делится на p.
     

    • Думаю да.
      Но я не ставил целью поиск оптимального алгоритма.

  4. не понял что за оператор %
     

  5. С часовыми поясами, конечно –  БРАВО,  глубина мысли поражает:)
    Не знал про остановку по ошибке, спасибо!

  6. После выполнения домашнего задания № 4, 
    а потом просмотра Вашего решения ДЗ, я 
    по Вашему примеру решил навести порядок
    и перенес все процедуры в общие модули.
    Но, о горе! У меня пропали все сообщения
    пользователю, которые я выводил для своего
    удобства для проверки своих мыслей. Я вернул
    все обратно. Не выводятся! Поковырявшись,
    я обратил внимание на то, что сообщения
    перестали выводиться после того как я
    перенес процедуру ВЫЯСНИТЬВАРИАНТОБЕДА() в
    конец блока ПРИНАЧАЛЕРАБОТЫСИСТЕМЫ().
    ВОПРОС:
    Правда ли, что метод СпискаЗначений
    ОТМЕТИТЬЭЛЕМЕНТЫ() в управляемом приложении затирает окно сообщений или у меня где-то неправильные настройки? В обычном приложении все сообщения выводятся на экран нормально.

    • > в управляемом приложении затирает окно сообщений или у меня где-то неправильные настройки
      Скорее всего это не так. Пока нет возможности проверить.
      Приветите код события ПриНачалеРаботыСистемы() завтра разберемся.

      • Для упрощения ситуации я весь код ДЗ закомментировал, оставил самое необходимое.
        В модулях управляемого и обычного приложений вставляем один и тот же код.
        Сначала:
        <code>
        Перем глОбед Экспорт;
        Процедура ПриНачалеРаботыСистемы()
        Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; до выбора варианта обеда.”);
        Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; после выбора варианта обеда”);
        КонецПроцедуры
        </code>
        В обоих приложениях выводятся оба сообщения.
        После этого между 2-мя СООБЩИТЬ() вставляем выбор варианта обедов и получаем код:
        <code>Перем глОбед Экспорт;
        Процедура ПриНачалеРаботыСистемы()
        Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; до выбора варианта обеда.”);

        Обеды = Новый СписокЗначений;
        Обеды.Добавить(“Курица”);
        Обеды.Добавить(“Рыба”);
        Обеды.Добавить(“Мясо”);
        глОбед = Новый Массив;
        ЕстьОбед = Ложь;

        Пока ЕстьОбед = Ложь Цикл
        Если Обеды.ОтметитьЭлементы(“Выберите себе варианты обеда”) Тогда
        Для каждого Элемент Из Обеды Цикл
        Если Элемент.Пометка Тогда
        глОбед.Добавить(Элемент.Значение);
        ЕстьОбед = Истина;
        КонецЕсли;
        КонецЦикла;
        КонецЕсли;
        КонецЦикла;

        Сообщить(“Рабочий день начался! “+ТекущаяДата()+”; после выбора варианта обеда”);
        КонецПроцедуры
        </code>
        Наблюдаем результат, о справедливости которого я и спрашивал.

        • Воспроизводится.
          Забавный эффект, проявляется он при открытии любой формы (не только приложения).
          Сейчас поведение расследуем..

        • Похоже, что это ошибка платформы.

          • У меня лично платформа 13.202 очень глючит, например с вызовом сервера. Пол дня чисто убил и не мог понять почему в модуле управляемого приложения не хочет работать экспортная (серверная +вызов сервера) процедура. Но ладно бы блин вообще не отрабатывала, дак один раз отработает, а захочешь ещё добавить одну процедуру там же, то она не отрабатывает, пишет неопознаный метод…. Но что ещё смешнее когда я у рабочей процедуры просто меняю имя и обращаюсь в модуле управляемого приложения уже по новому имени то она не работает. КОРОЧЕ начмучился, пока не вспомнил про урок где говорилось что просто можно сказать с каким реализом запускать. Попробывал с 12…. всё блин работает, хоть бы гавкнула:))) . Пробую реализ 13.205 тоже всё замечательно отрабатывает. Так и не понял в чём прикол. Может быть просто глюк реализа 13.202.

            • Порой бывает очень обидно искать косяки, а потом понимать, что это “особенности” такого-то релиза..

  7. Очень полезно было узнать про остановку по ошибке.  Спасибо! И еще полезно то, что в  ходе объяснения решений даются также и навыки грамотного подхода к решению. Сначала анализ условия, затем … При этом показаны способы не наткнуться на “грабли” разного рода. Минимизируется время разработки … и т.д. Все это очень важно для начинающих и даже для тех, кто опытным себя считает.

  8. Решение задания замечательное, но есть два небольших вопроса:
    1. По поводу некорректного сравнения времени реобразованному к строке – думаю функция форматирования с ведущим нулем Формат(ТекущаяДата(),”ДФ=HHmmss; ДЛФ=T”) нас бы от этого избавила.
    2. В результате оптимизации  функция МестноеВремя(ОбщиеФункцииСервер.ПолучитьДату())  уехала в модуль с признаком компиляции Толстый Клиент. Как же здесь учесть часовые пояса?

    • 1. Все верно.
      2. Действительно, оптимизация привела к ошибке.
      Спасибо за внимательный просмотр!

      • а я не понял, почему будет ошибка…
        ведь все равно мы получаем “универсальное” время на сервере ОбщиеФункцииСервер.ПолучитьДату(), а потом преобразуем его к местному… какая разница – в тонком клиенте, или в толстом?

        • Действительно, не проверил.
          Разницы нет, ведь универсальная дата в любом случае будет получаться на сервере.
          Спасибо за двойную внимательность :)

  9. Смотрел-смотрел, думал-думал и решил замерить производительность (не подумайте что захотелось поумничать :) )

     ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();
     
     НачалоРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),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 :)
        в общем “на вкус и цвет…”

        • Я думаю моя рекомендация ясна:
          – учитывать не только быстродействие кода, но и его читабельность (комментарии в коде говорят о его сложности для понимания).
          – в каждой конкретной ситуации анализировать, что приоритетнее: быстродействие или читаемость.

  10. Павел Конов 01.02.2011 в 23:17

    спасибо за конструктор форматной строки и за “остановиться по ошибке” в отладчике.
    вопрос по обычному приложению. в реальных условиях, при создании базы с нуля, нужно ли проектировать систему с учетом него?
    Зачем оно вообще нужно на этой платформе
    Как я понимаю, оно оставлено исключительно
    А. Для совместимости
    Б. для тех кто привык работать в 7,7 8,0 8,1 и не хочет отвыкать.
    В. тест для будущей новой платформы а-ля SAP

    • >нужно ли проектировать систему с учетом него
      Для новой конфигурации режим обычного приложения можно использоваться только в следующем случае:
      Создание специальных форм (АРМ), которые невозможно реализовать на управляемых формах.
      Во всех остальных случаях рекомендуется использовать режим управляемого приложения.

    • присоединяюсь к благодарностям за конструктор форматной строки и остановиться по ошибке! век живи, век учись

  11. Спасибо, было очень познавательно.

  12. Гуляев Алексей 01.02.2011 в 19:03

    а почему бы проверку на обеды устроить не так?
    <code>
    Сообщение = «Что Вы хотите сегодня на обед?»;
    Пока ВашВыбор = Ложь Цикл
    ВашВыбор = СписокЗн.ОтметитьЭлементы(Сообщение);
    Сообщение = «А я хочу явного ответа. Что Вы хотите сегодня на обед?»;
    КонецЦикла;
    </code>

    • Гуляев Алексей 01.02.2011 в 19:06

      Да не все скопировал
      перед этим всем нужно
      ВашВыбор = Ложь;

    • Гуляев Алексей 01.02.2011 в 19:08

      ой понял свою ошибку он же не проверяет если просто ОК жмешь.

      • Да, есть такая проблема в этом алгоритме :)

        • что мешает сделать таким образом?
          <code>
          Пока Не глОбед.ОтметитьЭлементы(“Какой вариант обеда предпочитаете?”) Цикл
          Предупреждение(“Голодным быть нельзя!”);
          КонецЦикла;

          </code>

  13. Браво!
    Часовые пояса…. даже в голову не пришло такое развитие сюжета.

  14. поправьте нумерацию :)

  15. СПАСИБО! Очень много для себя подчерпнул. Конечно хотелось бы это всё запомнить, но почему то забывается, наверное из за нехватки опыта. Или из за дырявой головы :))