Как правильно рассчитать разность дат в пользовательских полях отчета СКД?

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

При работе с отчетами, построенными на базе системы компоновки данных (СКД), часто возникает необходимость вычислить количество дней между двумя датами. Например, для анализа просрочки товаров по срокам годности или расчета длительности хранения. Рассмотрим, как правильно реализовать эту задачу и избежать типичных ошибок при написании формул.

Разбираем синтаксис функции РАЗНОСТЬДАТ

В выражениях СКД для получения разности между двумя датами используется встроенная функция РАЗНОСТЬДАТ. Согласно справке 1С, синтаксис функции выглядит следующим образом:

РазностьДат(Выражение1, Выражение2, ТипРазности)

Где:

Типичные ошибки при написании формулы

Рассмотрим самые частые трудности, с которыми сталкиваются разработчики при попытке применить эту функцию в пользовательских полях:

  1. Отсутствие кавычек у типа разности: Функция ожидает, что параметр ТипРазности будет передан как строковое значение. Если написать РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ), система выдаст ошибку, так как попытается найти поле с именем \"ДЕНЬ\". Правильно писать: "ДЕНЬ".
  2. Неверное обращение к полям: При работе с полями набора данных, особенно если это дополнительные свойства или поля из сложных путей, необходимо использовать квадратные скобки. Например: [Серия.ДатаОкончания].
  3. Путаница между запросом и выражением СКД: Важно понимать контекст: если вы пишете код в консоли запросов, кавычки не нужны (так как ДЕНЬ является ключевым словом языка запросов), но в пользовательских полях СКД вы работаете с языком выражений, где строковые литералы обязаны быть в кавычках.

Пошаговое решение задачи

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

  1. Откройте настройки отчета и перейдите на вкладку Пользовательские поля.
  2. Добавьте новое поле и в поле Выражение введите корректную формулу.
  3. Убедитесь, что вы используете параметр текущей даты. Рекомендуется создать параметр Параметры.ТекущаяДата с типом Дата, чтобы отчет был предсказуемым.

Правильная формула будет выглядеть так:


РАЗНОСТЬДАТ([Серия.ДатаОкончания], [Параметры.ТекущаяДата], "ДЕНЬ")

Как исключить некорректные значения

Иногда результат вычислений может приводить к странным данным или отрицательным числам, если срок годности товара еще не наступил. Чтобы отчет выглядел аккуратно и не отображал «отрицательную просрочку», воспользуйтесь функцией МАКСИМУМ.

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


МАКСИМУМ(РАЗНОСТЬДАТ([Параметры.ТекущаяДата], [Серия.ДатаОкончания], "ДЕНЬ"), 0)

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

Важные замечания по работе с датами в СКД

Помните, что РАЗНОСТЬДАТ считает количество переходов через границы выбранного периода. Если сравнивать дату 31 декабря и 1 января, разность составит 1 день, даже если между ними прошло всего несколько часов. Это особенность архитектуры платформы, которую необходимо учитывать при построении аналитических отчетов.

Всегда проверяйте доступность полей: если система пишет, что поле не найдено, убедитесь, что свойство или реквизит включены в состав набора данных, выбранного в настройках СКД. Если поле не выбрано в запросе, никакая формула к нему обратиться не сможет.

Следуя этим простым шагам, вы сможете настроить любые расчеты дат в пользовательских полях, сделав ваши отчеты информативными и безошибочными.

← На главную