Базовый курс. Решение ДЗ №3
Представляем решение третьего домашнего задания.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись — напишите нам на e-mail поддержки.
Добрый день, уважаемые коллеги! Немного опоздал с решением . Укатали меня клиенты 1С по области. Ездил долго и много (конец квартала, однако). Однако попробую по рассуждать над решением домашнего задания..
Безусловно, необходимо творить цикл
Для Год=2010 По 2019 Цикл
Платформа знает номер каждого дня в ГОДУ. Следовательно, номер последнего дня года может стать для нас количеством дней в году. Соответственно, определяем дату конца года.
КонецГода = Дата(Год,12,31);
КоличествоДнейВГоду =ДеньГода(КонецГода);
Вычисляем количество целых недель и, соответственно, количество рабочих дней в данном количестве целых недель.
ПолныхНедель = Цел(КоличествоДнейВГоду/7);
РабочихДней = ПолныхНедель*5;
Помним, что год – не целое количество недель, а n- количество дней + количество дней меньше целой недели. Вычисляем этот остаток дней
ОстатокДней = КоличествоДнейВГоду%7;
Создаем цикл для вычисления рабочих дней в остатке дней не полной недели.. Не знаю, как у кого, но я не сразу догадался (старею, видно), что речи не идет о понедельниках, вторниках и т.д. Платформа знает нумерацию дней недели.
Для Сч=1 По ОстатокДней Цикл
ТекДень = Дата(Год,1, Сч);
Если ДеньНедели(ТекДень)<6 Тогда
РабочихДней = РабочихДней+1;
КонецЕсли;
КонецЦикла;
Прописываем даты наших праздников (спасибо, что хоть эти оставили)
Янврь01 = Дата(Год,1,1);
Февраль23 = Дата(Год,2,23);
Март08 = Дата(Год,3,8);
Для того, что бы конечная формула расчета рабочих дней выглядела просто, создаем отдельную функцию, которая бы отслеживала «попадания» наших праздников на рабочие дни. Это ещё удобно тем, что потом в данну функцию в качестве параметра передадим праздники.
Функция РабочийДень(День)
Если ДеньНедели(День)<6 Тогда
Возврат 1 ;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Затем после цикла с ОстатокДней, можно написать формулу рабочих дней.
РабочихДней = РабочихДней – РабочийДень(Янврь01) – РабочийДень(Февраль23) – РабочийДень(Март08);
И вывести сообщение
Сообщить(Строка(Год) + “Год – ” + РабочихДней + ” рабочих дней”);
Хм:):) Привычка никогда не считать в алгоритме константные значения сыграла злую шутку. Может мой алгоритм и пооптимальней, но большей части функций работы с датами я не задействовал.
Один вопрос по разбору. Есть-ли причина по которой следует предпочитать с точки зрения оптимальности возвращать значения из функции и оперировать им, а не изменять передаваемое по ссылке значение в процедуре?
С точки зрения производительности разницы нет.
Однако, на мой взгляд, фукнция возвращающая значение более читаема.
Евгений, я обратил внимание, что в первом видео текст домашнего задания продолжается “создайте структуру “ВыходныеДни” …” На сайте выложена другая версия, в которой этого условия нет. Я понимаю, что это не особо важно, но все-таки, на сайте в PDF правильная версия?
На сайте версия правильная.
Работа со структурой перенесена в задание №4.