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

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

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

В этой статье мы подробно разберем, почему возникает ошибка «Несоответствие типов (Параметр номер 1)» при обращении к виртуальной таблице СрезПоследних, как правильно настроить параметры компоновки данных и как гарантированно увидеть итоговый текст запроса, который СКД отправляет в СУБД, даже если вы работаете в режиме обычных форм.

Почему возникает ошибка «Несоответствие типов» и откуда берутся параметры &П?

Когда в настройках набора данных СКД включен стандартный флаг «Автозаполнение», система берет на себя управление параметрами виртуальных таблиц. Для оптимизации запросов и наложения отборов непосредственно в СУБД СКД динамически перестраивает исходный текст запроса.

В процессе этой перестройки СКД заменяет ваши исходные параметры (например, &ДатаДляСрезаПоследних) на собственные внутренние переменные, такие как &П, &П1, &П3 и так далее. Ошибка несоответствия типов происходит по нескольким причинам:

  1. Несоответствие типов данных: Вы передаете в параметр виртуальной таблицы период с типом СтандартныйПериод (который состоит из даты начала и даты окончания), в то время как виртуальная таблица СрезПоследних ожидает на входе исключительно одиночное значение с типом Дата.
  2. Конфликт автозаполнения: СКД пытается автоматически связать параметры виртуальной таблицы с доступными полями компоновки, но из-за отсутствия явных указаний сопоставляет их некорректно, передавая пустое значение или системный объект несоответствующего типа.

Проанализируем классический ошибочный запрос:


ВЫБРАТЬ
    РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
    РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК Подразделение
ПОМЕСТИТЬ ТаблПоследнееПодразделение
ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(КОНЕЦПЕРИОДА(&ДатаДляСрезаПоследних, МЕСЯЦ), ) КАК РаботникиОрганизацийСрезПоследних

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

Решение проблемы через вкладку «Компоновка данных» в конструкторе запроса

Чтобы решить эту проблему раз и навсегда, необходимо явно указать СКД, как именно нужно транслировать параметры запроса в параметры компоновки данных. Для этого выполним следующие шаги:

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

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


ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(КОНЕЦПЕРИОДА(&ДатаДляСрезаПоследних, МЕСЯЦ) {(&ПериодКД)}, ) КАК РаботникиОрганизацийСрезПоследних

После этого на вкладке «Параметры» в самой схеме компоновки данных появится новый параметр ПериодКД с типом данных Дата. Теперь мы можем связать его с любым пользовательским параметром (например, вычислять его на основе Период.ДатаОкончания), и СКД корректно передаст значение в СУБД без возникновения ошибок типов.

Как увидеть конечный (преобразованный) текст запроса в обычных формах

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

Способ 1. Использование режима Управляемого приложения

На обычных формах старые консоли СКД часто работают нестабильно: вкладка «Запрос» может оставаться пустой из-за внутренних ошибок инициализации макета в обычном режиме. Самое простое и быстрое решение — запустить базу в режиме управляемого приложения и воспользоваться современной Консолью СКД для управляемых форм.

Для этого выполним запуск базы через конфигуратор или ярлык с дополнительным ключом запуска:

/RunModeManagedApplication

В управляемом режиме современные консоли отчетов СКД без проблем инициализируют схему, выполняют компоновку макета и выводят полный преобразованный текст запроса со всеми подставленными параметрами на соответствующей вкладке.

Способ 2. Программное получение запроса через отладчик

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

Рассмотрим по шагам, как извлечь этот запрос:

  1. Откроем модуль объекта нашего отчета и найдем процедуру ПриКомпоновкеРезультата.
  2. Найдем строку, где выполняется компоновка макета (обычно она выглядит так):

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
  1. Установим точку останова (клавиша F9) на следующую строку после выполнения этого метода.
  2. Запустим отчет в режиме отладки и сформируем его. После остановки программы откроем окно вычисления выражений (сочетание клавиш Shift + F9).
  3. Введем следующее выражение (где НаборДанных1 — это имя вашего набора данных в схеме компоновки):

МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос

В результате мы получим абсолютно точный итоговый текст запроса, который содержит все преобразования СКД, включая раскрытые виртуальные таблицы, наложенные отборы пользователей и реальные имена сгенерированных параметров (те самые &П).

Значения этих сгенерированных параметров мы можем посмотреть здесь же, вычислив выражение:

МакетКомпоновки.ЗначенияПараметров

Для удобства анализа мы также можем временно добавить в код процедуру вывода запроса прямо в окно сообщений пользователю:


МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
#Если Клиент Тогда
Сообщить(МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос);
#КонецЕсли

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

← На главную