Как правильно вычислить количество дней между двумя датами в СКД?

Программист 1С v8.3 (Обычные формы) 1С:ERP Управление предприятием Промышленность, строительство и АПК
← На главную

При разработке отчетов в системе компоновки данных (СКД) часто возникает необходимость вычислить количество дней между двумя датами. Однако разработчики нередко сталкиваются с ситуацией, когда вместо ожидаемого числа система выдает странные, очень большие значения, например, 737 837. Давайте разберем, почему это происходит и как правильно настроить вычисления в 1С.

Разбираем причину появления некорректных чисел

Когда вы видите в отчете аномально большое число при использовании функции РАЗНОСТЬДАТ, первым делом следует проверить состояние параметров &ДатаНачала и &ДатаОкончания. Причина кроется в том, что один из аргументов функции интерпретируется системой как «пустая дата» (01.01.0001). В этом случае 1С вычисляет разность между реальной датой и началом летоисчисления, что и дает астрономическое количество дней.

Основные причины ошибки:

Использование функции РАЗНОСТЬДАТ

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

Синтаксис функции выглядит следующим образом:

РАЗНОСТЬДАТ(НачалоПериода, КонецПериода, ЕдиницаИзмерения)

Разберем процесс по шагам:

  1. Убедитесь, что параметры, которые вы используете в запросе, имеют тип Дата.
  2. Проверьте порядок аргументов. Если передать даты «наоборот» (сначала большую, потом меньшую), результат будет отрицательным.
  3. Для получения количества дней используйте третий аргумент ДЕНЬ.

Посмотрим на пример правильного использования в тексте запроса:


ВЫБРАТЬ
    &ДатаНачала КАК ДатаНачала,
    &ДатаОкончания КАК ДатаОкончания,
    РАЗНОСТЬДАТ(&ДатаНачала, &ДатаОкончания, ДЕНЬ) КАК КоличествоДней

Проверка параметров на этапе формирования отчета

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

  1. Откройте модуль отчета и найдите процедуру ПриКомпоновкеРезультата.
  2. Проверьте, не являются ли ваши параметры пустыми перед тем, как передать их в КомпоновщикНастроек.
  3. Если параметры должны быть обязательными, добавьте проверку: если дата не заполнена, присвойте ей текущую дату или выдайте пользователю предупреждение.

Пример программной проверки:


Если ЗначениеЗаполнено(ПараметрыОтчета.ДатаНачала) И ЗначениеЗаполнено(ПараметрыОтчета.ДатаОкончания) Тогда
    // Выполняем расчет
Иначе
    Сообщить("Пожалуйста, заполните параметры периода!");
КонецЕсли;

Альтернативные подходы к расчетам

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

В системе 1С при вычитании одной даты из другой получается число, выраженное в секундах. Чтобы получить количество полных дней, достаточно разделить результат на 86400 (количество секунд в сутках):

Выражение для вычисляемого поля в СКД:

(ДатаОкончания - ДатаНачала) / 86400

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

Подводя итог, всегда начинайте отладку с проверки заполненности параметров. В 90% случаев именно пустой параметр является причиной аномальных результатов в отчетах на базе СКД.

← На главную