При разработке отчетов в Системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда знакомые функции языка запросов дают сбой при переносе их в вычисляемые поля. Одной из таких частых ошибок является сообщение: Поле не найдено "Секунда" (или "День", "Минута" и т. д.) при вызове функции РазностьДат().
Проанализируем причину возникновения этой проблемы, разберем различия в синтаксисе языков платформы 1С и рассмотрим правильные варианты работы с интервалами дат в выражениях СКД.
Главная причина заключается в том, что в платформе 1С разграничиваются язык запросов и язык выражений СКД (который применяется в вычисляемых полях, ресурсах и пользовательских полях):
СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД) являются зарезервированными ключевыми словами СУБД. Поэтому при вызове РАЗНОСТЬДАТ() в запросе параметр указывается без кавычек.Если опустить кавычки в вычисляемом поле СКД, компоновщик данных принимает имя единицы времени за имя поля набора данных. Не найдя в текущей схеме поле с именем Секунда, система генерирует ошибку.
Рассмотрим выражение, содержащее ошибку:
ВЫБОР КОГДА ДатаУт <> ДатаФайл ТОГДА РазностьДат(ДатаУт, ДатаФайл, Секунда) КОНЕЦ
Для исправления ошибки достаточно заключить наименование периода в кавычки — "Секунда". Корректный вариант выражения для вычисляемого поля выглядит следующим образом:
ВЫБОР КОГДА ДатаУт <> ДатаФайл ТОГДА РазностьДат(ДатаУт, ДатаФайл, "Секунда") КОНЕЦ
Аналогичное правило с кавычками применяется и к другим единицам измерения времени ("Минута", "Час", "День", "Месяц" и т. д.), а также к функции ДобавитьКДате() в языке выражений СКД.
Проанализируем важные нюансы и проверенные практики, которые помогут избежать ошибок при расчете интервалов времени в отчетах:
0001-01-01 или содержит NULL), расчет может вернуть некорректное значение. Рекомендуется добавлять проверку на заполненность:
ВЫБОР
КОГДА ДатаУт ЕСТЬ НЕ NULL И ДатаУт <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РазностьДат(ДатаУт, ДатаФайл, "Секунда")
ИНАЧЕ 0
КОНЕЦ
Дата2 - Дата1). Выражение вызовет ошибку Неверные параметры "-". Вычисление разницы необходимо выполнять только через РазностьДат().
РАЗНОСТЬДАТ(Дата1, Дата2, СЕКУНДА). Это уменьшает нагрузку на сервер приложений при компоновке результата.
МойОбщийМодульСервер.ПосчитатьРабочиеДни(ДатаУт, ДатаФайл)
Сумма(РазницаВСекундах).