Почему возникает ошибка «Поле не найдено» при использовании функции РазностьДат в вычисляемом поле СКД и как ее исправить?

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

При разработке отчетов в Системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда знакомые функции языка запросов дают сбой при переносе их в вычисляемые поля. Одной из таких частых ошибок является сообщение: Поле не найдено "Секунда" (или "День", "Минута" и т. д.) при вызове функции РазностьДат().

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

Выясним причину ошибки

Главная причина заключается в том, что в платформе 1С разграничиваются язык запросов и язык выражений СКД (который применяется в вычисляемых полях, ресурсах и пользовательских полях):

  1. В языке запросов единицы времени (СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД) являются зарезервированными ключевыми словами СУБД. Поэтому при вызове РАЗНОСТЬДАТ() в запросе параметр указывается без кавычек.
  2. В языке выражений СКД единица измерения времени не является зарезервированным словом. Она должна передаваться исключительно как строковый литерал (в кавычках).

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

Исправляем синтаксис в вычисляемом поле

Рассмотрим выражение, содержащее ошибку:


ВЫБОР КОГДА ДатаУт <> ДатаФайл ТОГДА РазностьДат(ДатаУт, ДатаФайл, Секунда) КОНЕЦ

Для исправления ошибки достаточно заключить наименование периода в кавычки — "Секунда". Корректный вариант выражения для вычисляемого поля выглядит следующим образом:


ВЫБОР КОГДА ДатаУт <> ДатаФайл ТОГДА РазностьДат(ДатаУт, ДатаФайл, "Секунда") КОНЕЦ

Аналогичное правило с кавычками применяется и к другим единицам измерения времени ("Минута", "Час", "День", "Месяц" и т. д.), а также к функции ДобавитьКДате() в языке выражений СКД.

Рекомендации по работе с датами в выражениях СКД

Проанализируем важные нюансы и проверенные практики, которые помогут избежать ошибок при расчете интервалов времени в отчетах:

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