При отладке типовых отчетов конфигурации 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, 1), МЕСЯЦ)
ТОГДА &ОкончаниеИнтервалаПредставленияПериоды
ИНАЧЕ &КонецПериода
// Стало:
КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ)
ТОГДА &КонецПериода
ИНАЧЕ &КонецПериода
Либо можно полностью исключить обращение к параметру &ОкончаниеИнтервалаПредставленияПериоды в соединениях и блоке ГДЕ, передав только явно заполненный параметр &КонецПериода.
В ситуациях, когда структуру параметров изменять нельзя, рекомендуется использовать явное приведение типа параметра в самом запросе с помощью функции ВЫРАЗИТЬ. Это исключает двусмысленность при компиляции запроса СУБД:
НАЧАЛОПЕРИОДА(ВЫБОР
КОГДА &КонецПериода = КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(1, 1, 1), МЕСЯЦ)
ТОГДА ВЫРАЗИТЬ(&ОкончаниеИнтервалаПредставленияПериоды КАК ДАТАВРЕМЯ)
ИНАЧЕ &КонецПериода
КОНЕЦ, МЕСЯЦ)
Рассмотрим особенности архитектуры отчетов подсистемы «Зарплата и кадры»: большинство запросов формируются динамически в общих модулях и модуле объекта отчета, а не хранятся в статическом виде в схеме компоновки данных. Чтобы получить корректный текст запроса и реальные значения параметров для отладки, рекомендуется следующий порядок действий:
ПриКомпоновкеРезультата.ЗарплатаКадрыОтчеты).МакетКомпоновкиДанных.НаборыДанных.<ИмяНабора>.Запрос — это позволит получить финальный текст запроса с учетом всех программных вставок.МакетКомпоновкиДанных.ЗначенияПараметров скопируем вычисленные значения и типы параметров в консоль.Соблюдение правил строгой типизации параметров в функциях работы с датами позволяет избежать ошибок выполнения запросов и обеспечивает стабильную работу алгоритмов при отладке.