При разработке отчетов в системе компоновки данных (СКД) часто возникает необходимость вычислить количество дней между двумя датами. Однако разработчики нередко сталкиваются с ситуацией, когда вместо ожидаемого числа система выдает странные, очень большие значения, например, 737 837. Давайте разберем, почему это происходит и как правильно настроить вычисления в 1С.
Когда вы видите в отчете аномально большое число при использовании функции РАЗНОСТЬДАТ, первым делом следует проверить состояние параметров &ДатаНачала и &ДатаОкончания. Причина кроется в том, что один из аргументов функции интерпретируется системой как «пустая дата» (01.01.0001). В этом случае 1С вычисляет разность между реальной датой и началом летоисчисления, что и дает астрономическое количество дней.
Основные причины ошибки:
Неопределено.Для корректного расчета дней между датами в запросе СКД используется стандартная функция РАЗНОСТЬДАТ. Рассмотрим правильный синтаксис:
Синтаксис функции выглядит следующим образом:
РАЗНОСТЬДАТ(НачалоПериода, КонецПериода, ЕдиницаИзмерения)
Разберем процесс по шагам:
Дата.ДЕНЬ.Посмотрим на пример правильного использования в тексте запроса:
ВЫБРАТЬ
&ДатаНачала КАК ДатаНачала,
&ДатаОкончания КАК ДатаОкончания,
РАЗНОСТЬДАТ(&ДатаНачала, &ДатаОкончания, ДЕНЬ) КАК КоличествоДней
Если вы уверены, что синтаксис верный, но ошибка сохраняется, значит, данные не доходят до запроса. Рекомендуем проанализировать, как заполняются параметры перед выполнением кода:
ПриКомпоновкеРезультата.КомпоновщикНастроек.Пример программной проверки:
Если ЗначениеЗаполнено(ПараметрыОтчета.ДатаНачала) И ЗначениеЗаполнено(ПараметрыОтчета.ДатаОкончания) Тогда
// Выполняем расчет
Иначе
Сообщить("Пожалуйста, заполните параметры периода!");
КонецЕсли;
Если по каким-то причинам стандартная функция РАЗНОСТЬДАТ кажется вам нестабильной или требуется более сложная логика, вы можете воспользоваться математическим вычитанием дат.
В системе 1С при вычитании одной даты из другой получается число, выраженное в секундах. Чтобы получить количество полных дней, достаточно разделить результат на 86400 (количество секунд в сутках):
Выражение для вычисляемого поля в СКД:
(ДатаОкончания - ДатаНачала) / 86400
Этот метод удобен тем, что позволяет избежать проблем с типами данных в параметрах, так как СКД автоматически приводит даты к числовому значению. Однако помните, что при использовании деления может потребоваться округление результата с помощью функции ВЫРАЗИТЬ или ОКРУГЛ, чтобы получить целое количество дней.
Подводя итог, всегда начинайте отладку с проверки заполненности параметров. В 90% случаев именно пустой параметр является причиной аномальных результатов в отчетах на базе СКД.