При работе с отчетами, построенными на базе системы компоновки данных (СКД), часто возникает необходимость вычислить количество дней между двумя датами. Например, для анализа просрочки товаров по срокам годности или расчета длительности хранения. Рассмотрим, как правильно реализовать эту задачу и избежать типичных ошибок при написании формул.
В выражениях СКД для получения разности между двумя датами используется встроенная функция РАЗНОСТЬДАТ. Согласно справке 1С, синтаксис функции выглядит следующим образом:
РазностьДат(Выражение1, Выражение2, ТипРазности)
Где:
Выражение1 — дата, из которой мы вычитаем (обычно это поле с датой окончания).Выражение2 — исходная дата, которую мы вычитаем (например, текущая дата).ТипРазности — строка, определяющая единицу измерения (секунда, минута, час, день, месяц, квартал, год).Рассмотрим самые частые трудности, с которыми сталкиваются разработчики при попытке применить эту функцию в пользовательских полях:
ТипРазности будет передан как строковое значение. Если написать РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ), система выдаст ошибку, так как попытается найти поле с именем \"ДЕНЬ\". Правильно писать: "ДЕНЬ".[Серия.ДатаОкончания].ДЕНЬ является ключевым словом языка запросов), но в пользовательских полях СКД вы работаете с языком выражений, где строковые литералы обязаны быть в кавычках.Чтобы рассчитать количество дней просрочки товара относительно текущей даты, выполним следующие действия:
Параметры.ТекущаяДата с типом Дата, чтобы отчет был предсказуемым.Правильная формула будет выглядеть так:
РАЗНОСТЬДАТ([Серия.ДатаОкончания], [Параметры.ТекущаяДата], "ДЕНЬ")
Иногда результат вычислений может приводить к странным данным или отрицательным числам, если срок годности товара еще не наступил. Чтобы отчет выглядел аккуратно и не отображал «отрицательную просрочку», воспользуйтесь функцией МАКСИМУМ.
Рассмотрим вариант реализации, который нормализует вывод:
МАКСИМУМ(РАЗНОСТЬДАТ([Параметры.ТекущаяДата], [Серия.ДатаОкончания], "ДЕНЬ"), 0)
Данный подход гарантирует, что если дата окончания еще в будущем, система вернет 0, а не отрицательное число. Это делает отчет гораздо более наглядным для пользователя.
Помните, что РАЗНОСТЬДАТ считает количество переходов через границы выбранного периода. Если сравнивать дату 31 декабря и 1 января, разность составит 1 день, даже если между ними прошло всего несколько часов. Это особенность архитектуры платформы, которую необходимо учитывать при построении аналитических отчетов.
Всегда проверяйте доступность полей: если система пишет, что поле не найдено, убедитесь, что свойство или реквизит включены в состав набора данных, выбранного в настройках СКД. Если поле не выбрано в запросе, никакая формула к нему обратиться не сможет.
Следуя этим простым шагам, вы сможете настроить любые расчеты дат в пользовательских полях, сделав ваши отчеты информативными и безошибочными.