Почему возникает ошибка «Неверные параметры НАЧАЛОПЕРИОДА» в консоли запросов и как её исправить?

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

При отладке типовых отчетов конфигурации 1С:Зарплата и управление персоналом 3.1 разработчики часто копируют текст запроса из схемы компоновки данных (СКД) в консоль запросов. В процессе выполнения такого запроса платформа 1С может аварийно завершить работу метода Выполнить() с ошибкой вида: «Неверные параметры НАЧАЛОПЕРИОДА», указывая на конструкцию ВЫБОР ... КОНЕЦ внутри функций работы с датами.

Разберем подробнее, почему возникает эта ошибка, как устроена типизация выражений в языке запросов платформы 1С:Предприятие 8.3 и какие шаги нужно предпринять для успешного выполнения запроса.

Анализ проблемы и механизма типизации

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


ВЫБРАТЬ
    Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 КАК чтото
ПОМЕСТИТЬ ПредставленияПериоды
ИЗ
    ВТЦифры КАК Цифры
    ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10
    ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ВЫБОР
                КОГДА &НачалоПериода = ДАТАВРЕМЯ(1, 1, 1)
                    ТОГДА ДАТАВРЕМЯ(1980, 1, 1)
                ИНАЧЕ &НачалоПериода
            КОНЕЦ, МЕСЯЦ), НАЧАЛОПЕРИОДА(ВЫБОР
                КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ)
                    ТОГДА &ОкончаниеИнтервалаПредставленияПериоды
                ИНАЧЕ &КонецПериода
            КОНЕЦ, МЕСЯЦ), МЕСЯЦ) > 9)

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

В приведенном запросе используется параметр &ОкончаниеИнтервалаПредставленияПериоды. В типовом отчете ЗУП этот параметр рассчитывается и подставляется программным кодом перед формированием отчета. Однако при ручной вставке запроса в консоль запросов на управляемых формах значение данного параметра может отображаться в виде строки даты, но фактически иметь системный тип Неопределено или составной тип. Из-за отсутствия жесткой типизации транслятор запросов 1С не может гарантировать, что результат выражения ВЫБОР вернет значение типа Дата, и прерывает разбор с ошибкой.

Способ 1. Явная установка типа параметра в консоли запросов

Разберем по шагам, как исправить ошибку в интерфейсе консоли запросов:

  1. Откроем таблицу параметров запроса в консоли.
  2. Найдем параметр ОкончаниеИнтервалаПредставленияПериоды (а также НачалоПериода и КонецПериода).
  3. Обратим внимание на тип значения. Если в значении отображается дата, но при нажатии на кнопку выбора типа активен флаг Неопределено, снимем его.
  4. Установим явный тип Дата (с составом даты «Дата и время») и укажем корректное значение границы периода.
  5. Повторно нажмем кнопку Выполнить.

Способ 2. Замена служебного параметра в тексте запроса

Если для целей отладки точное значение служебного интервала не принципиально, мы можем упростить текст запроса, заменив неиспользуемый программный параметр на стандартный параметр конца периода.

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


// Было:
КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ)
    ТОГДА &ОкончаниеИнтервалаПредставленияПериоды
ИНАЧЕ &КонецПериода

// Стало:
КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ)
    ТОГДА &КонецПериода
ИНАЧЕ &КонецПериода

Либо можно полностью исключить обращение к параметру &ОкончаниеИнтервалаПредставленияПериоды в соединениях и блоке ГДЕ, передав только явно заполненный параметр &КонецПериода.

Способ 3. Принудительное приведение типов через ВЫРАЗИТЬ

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


НАЧАЛОПЕРИОДА(ВЫБОР
    КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ)
        ТОГДА ВЫРАЗИТЬ(&ОкончаниеИнтервалаПредставленияПериоды КАК ДАТАВРЕМЯ)
    ИНАЧЕ &КонецПериода
КОНЕЦ, МЕСЯЦ)

Как правильно извлекать запросы из типовых отчетов ЗУП 3.1

Рассмотрим особенности архитектуры отчетов подсистемы «Зарплата и кадры»: большинство запросов формируются динамически в общих модулях и модуле объекта отчета, а не хранятся в статическом виде в схеме компоновки данных. Чтобы получить корректный текст запроса и реальные значения параметров для отладки, рекомендуется следующий порядок действий:

  1. Откроем модуль объекта отчета в конфигураторе и найдем предопределенную процедуру ПриКомпоновкеРезультата.
  2. Установим точку останова после вызова процедур формирования компоновщика (например, после вызовов процедур общего модуля ЗарплатаКадрыОтчеты).
  3. В окне табло вычислим выражение МакетКомпоновкиДанных.НаборыДанных.<ИмяНабора>.Запрос — это позволит получить финальный текст запроса с учетом всех программных вставок.
  4. Из коллекции МакетКомпоновкиДанных.ЗначенияПараметров скопируем вычисленные значения и типы параметров в консоль.

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

← На главную