При контроле дебиторской задолженности и определении статуса накладных часто возникает задача расчета крайнего срока оплаты не в календарных, а в рабочих или банковских днях. Стандартная функция языка запросов ДОБАВИТЬКДАТЕ прибавляет календарные дни без исключения выходных и праздников. Разберем, как построить запрос к производственному календарю для корректного учета рабочих дней.
В языке запросов 1С отсутствуют встроенные функции для циклического прибавления рабочих смен или вызова процедур общего модуля. Прямое соединение документов с регистром календаря по условию ДатаКалендаря МЕЖДУ Регистратор.Дата И ДОБАВИТЬКДАТЕ(...) не дает нужного результата: такой фильтр отбирает только рабочие дни внутри фиксированного календарного отрезка, а не смещает дату на заданное число рабочих дней вперед.
Для решения задачи применяются два основных подхода в запросах:
Проанализируем практический вариант, когда требуется определить, просрочена ли накладная на определенную дату. Для этого сформируем пакетный запрос:
Документы соберем реализации и их суммы из регистра накопления взаиморасчетов.ДатыКалендаря отберем список только рабочих и предпраздничных дней.КОЛИЧЕСТВО.Посмотрим на пример реализации запроса:
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход КАК Сумма,
НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.Дата, ДЕНЬ) КАК РегистраторДата,
ВзаиморасчетыСКонтрагентамиОбороты.Регистратор КАК Регистратор
ПОМЕСТИТЬ Документы
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
,
&ДатаСреза,
Регистратор,
Контрагент = &Контрагент
И ДоговорКонтрагента = &ДоговорКонтрагента
И Организация = &Организация) КАК ВзаиморасчетыСКонтрагентамиОбороты
ГДЕ
ВзаиморасчетыСКонтрагентамиОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК ДатаКалендаря
ПОМЕСТИТЬ ДатыКалендаря
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ВидДня В (
ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий),
ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Документы.Сумма КАК Сумма,
Документы.РегистраторДата КАК РегистраторДата,
Документы.Регистратор КАК Регистратор,
КОЛИЧЕСТВО(ДатыКалендаря.ДатаКалендаря) КАК ПрошлоРабочихДней,
ВЫБОР
КОГДА КОЛИЧЕСТВО(ДатыКалендаря.ДатаКалендаря) <= &Отсрочка
ТОГДА "Не просрочена"
ИНАЧЕ "Просрочена"
КОНЕЦ КАК СтатусНакладной
ИЗ
Документы КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ ДатыКалендаря КАК ДатыКалендаря
ПО (ДатыКалендаря.ДатаКалендаря МЕЖДУ ДОБАВИТЬКДАТЕ(Документы.РегистраторДата, ДЕНЬ, 1) И &ДатаСреза)
СГРУППИРОВАТЬ ПО
Документы.Сумма,
Документы.РегистраторДата,
Документы.Регистратор
Разберем детали, влияющие на точность расчета:
00:00:00. Применение конструкции НАЧАЛОПЕРИОДА(Регистратор.Дата, ДЕНЬ) гарантирует корректное вхождение дат в условие МЕЖДУ.ДОБАВИТЬКДАТЕ(Документы.РегистраторДата, ДЕНЬ, 1). Если считать саму дату документа рабочим днем, срок отсрочки сократится на 1 день.В конфигурациях на базе БСП (1С:ERP, КА 2, УТ 11, БП 3.0) структура календарей хранится в справочнике ПроизводственныеКалендари и регистрах сведений ДанныеПроизводственногоКалендаря и КалендарныеГрафики. Для программного расчета срока платежа на встроенном языке рекомендуется использовать функции общего модуля КалендарныеГрафики:
// Получение точной даты платежа с учетом рабочих дней календаря
КрайнийСрок = КалендарныеГрафики.ПолучитьДатуПоКалендарю(Календарь, ДатаДокумента, ДниОтсрочки);
// Получение количества рабочих дней между двумя датами
РабочихДнейПрошло = КалендарныеГрафики.КоличествоДнейПоКалендарю(Календарь, ДатаДокумента, ДатаСреза);
При необходимости массовой обработки данных в запросе целесообразно рассчитать крайние сроки на встроенном языке, поместить их во временную таблицу и затем соединить с оборотами или остатками взаиморасчетов.