При разработке функционала для расчета крайних сроков предоставления документов часто возникает потребность учитывать не календарные, а именно рабочие дни. Обычное прибавление количества секунд к текущей дате не подходит, так как оно не учитывает выходные и праздничные дни, закрепленные в производственном календаре. Давайте разберем, как реализовать этот механизм корректно с использованием типовых возможностей конфигурации.
В конфигурации 1С:ERP (и в других типовых решениях на БСП) уже реализован готовый механизм для работы с датами по графикам. Вам не нужно самостоятельно высчитывать праздники — достаточно воспользоваться функцией ДатаПоКалендарю, которая находится в общем модуле КалендарныеГрафики.
Рассмотрим, как выглядит вызов этой функции в коде:
ГрафикРаботы = Справочники.ПроизводственныеКалендари.НайтиПоКоду("РФ");
ДатаОт = ТекущаяДата();
КоличествоДней = Объект.СрокПредоставленияДокумента;
Объект.До = КалендарныеГрафики.ДатаПоКалендарю(ГрафикРаботы, ДатаОт, КоличествоДней);
Эта функция выполняет всю сложную работу «под капотом»: она обращается к данным производственного календаря, проверяет, какие дни являются рабочими, а какие — выходными или праздничными, и смещает итоговую дату на нужное количество рабочих дней.
При работе с этим механизмом важно учитывать несколько нюансов:
ГрафикРаботы должна указывать на корректный элемент справочника. Будьте осторожны с поиском по коду, так как в системе может быть несколько элементов с одинаковым кодом. Рекомендуется использовать предопределенные элементы или настройки системы.ДатаПоКалендарю внутри себя приводит переданную дату к началу дня. Это означает, что время суток не учитывается — расчет ведется строго по дням.Неопределено или вызвать исключение, в зависимости от параметров.Чтобы убедиться, что ваша реализация работает правильно, проанализируем ситуацию на примере праздничных дней:
Объект.До должна быть первым рабочим днем после праздников (например, 3 мая), а не 1 мая.Если вы получаете «странные» результаты, проверьте через отладчик, какие именно данные передаются в функцию. Вы можете выделить имя функции в конфигураторе и нажать F12, чтобы изучить исходный код и понять логику обработки переданных параметров.
Конструкция вида ТекущаяДата() + (24*60*60) * Срок является грубой ошибкой, так как она работает исключительно в календарных сутках. В бизнес-логике ERP-систем критически важно разделять календарные сроки и рабочие сроки. Применение функции КалендарныеГрафики.ДатаПоКалендарю гарантирует соблюдение производственных норм и делает ваш код профессиональным, устойчивым к изменениям законодательства (переносам праздничных дней), так как все изменения учитываются в справочнике ПроизводственныеКалендари автоматически при его обновлении пользователем.