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