Как правильно рассчитать дату окончания срока с учетом рабочих дней в 1С:ERP?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке функционала для расчета крайних сроков предоставления документов часто возникает потребность учитывать не календарные, а именно рабочие дни. Обычное прибавление количества секунд к текущей дате не подходит, так как оно не учитывает выходные и праздничные дни, закрепленные в производственном календаре. Давайте разберем, как реализовать этот механизм корректно с использованием типовых возможностей конфигурации.

Использование типовой функции ДатаПоКалендарю

В конфигурации 1С:ERP (и в других типовых решениях на БСП) уже реализован готовый механизм для работы с датами по графикам. Вам не нужно самостоятельно высчитывать праздники — достаточно воспользоваться функцией ДатаПоКалендарю, которая находится в общем модуле КалендарныеГрафики.

Рассмотрим, как выглядит вызов этой функции в коде:


ГрафикРаботы = Справочники.ПроизводственныеКалендари.НайтиПоКоду("РФ");
ДатаОт = ТекущаяДата();
КоличествоДней = Объект.СрокПредоставленияДокумента;
Объект.До = КалендарныеГрафики.ДатаПоКалендарю(ГрафикРаботы, ДатаОт, КоличествоДней);

Эта функция выполняет всю сложную работу «под капотом»: она обращается к данным производственного календаря, проверяет, какие дни являются рабочими, а какие — выходными или праздничными, и смещает итоговую дату на нужное количество рабочих дней.

Особенности работы с календарями

При работе с этим механизмом важно учитывать несколько нюансов:

  1. Выбор календаря: Переменная ГрафикРаботы должна указывать на корректный элемент справочника. Будьте осторожны с поиском по коду, так как в системе может быть несколько элементов с одинаковым кодом. Рекомендуется использовать предопределенные элементы или настройки системы.
  2. Начало отсчета: Функция ДатаПоКалендарю внутри себя приводит переданную дату к началу дня. Это означает, что время суток не учитывается — расчет ведется строго по дням.
  3. Заполнение данных: Механизм будет работать корректно только в том случае, если производственный календарь (или график работы) актуален и заполнен данными на текущий и будущий периоды. Если данные в регистре не заполнены, функция может вернуть Неопределено или вызвать исключение, в зависимости от параметров.

Как проверить корректность расчетов

Чтобы убедиться, что ваша реализация работает правильно, проанализируем ситуацию на примере праздничных дней:

Если вы получаете «странные» результаты, проверьте через отладчик, какие именно данные передаются в функцию. Вы можете выделить имя функции в конфигураторе и нажать F12, чтобы изучить исходный код и понять логику обработки переданных параметров.

Почему прямой расчет даты — это ошибка?

Конструкция вида ТекущаяДата() + (24*60*60) * Срок является грубой ошибкой, так как она работает исключительно в календарных сутках. В бизнес-логике ERP-систем критически важно разделять календарные сроки и рабочие сроки. Применение функции КалендарныеГрафики.ДатаПоКалендарю гарантирует соблюдение производственных норм и делает ваш код профессиональным, устойчивым к изменениям законодательства (переносам праздничных дней), так как все изменения учитываются в справочнике ПроизводственныеКалендари автоматически при его обновлении пользователем.

← На главную