Как исправить ошибку СКД «Несоответствие типов (Параметр номер 1)» в запросах к регистрам

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с малопонятной ошибкой: «Ошибка обработки представления... Несоответствие типов (Параметр номер "1")». Эта проблема обычно возникает при работе с виртуальными таблицами регистров накопления (Остатки, ОстаткиИОбороты) или регистров сведений (СрезПоследних). Давайте подробно разберем, почему это происходит и как правильно настроить параметры запроса, чтобы отчет работал стабильно.

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

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

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

Также стоит обратить внимание на системный параметр &П, который часто мелькает в текстах подобных ошибок. Это внутреннее имя, которое СКД присваивает параметрам при автоматической генерации запроса. Его появление — явный признак того, что система пытается «самостоятельно» сопоставить настройки компоновки с текстом запроса, но делает это неудачно из-за неопределенности типов.

Решение №1: Использование фигурных скобок (Расширение СКД)

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

Вместо жесткого написания параметра:


ИЗ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ДатаОстатков, ) КАК ТоварыВРезервеНаСкладахОстатки

Мы используем конструкцию расширения:


ИЗ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки({(&ДатаОстатков)}, ) КАК ТоварыВРезервеНаСкладахОстатки

Что это дает? Когда СКД видит параметр в фигурных скобках, она включает механизм интеллектуального приведения типов. Если в настройках отчета &ДатаОстатков связана с концом стандартного периода, СКД сама извлечет нужную дату из объекта и подставит ее в SQL-запрос в правильном формате. Это избавляет разработчика от необходимости вручную следить за преобразованием типов.

Решение №2: Настройка выражений в параметрах СКД

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

  1. Откроем схему компоновки данных и перейдем на закладку «Параметры».
  2. Найдем параметр, который используется в виртуальной таблице (например, &Период).
  3. Установим у него флаг «Ограничение доступности». Это нужно для того, чтобы пользователь не видел «технический» параметр в настройках.
  4. Создадим новый параметр, доступный пользователю, например, СтандартныйПериод с соответствующим типом.
  5. В поле «Выражение» для нашего технического параметра &Период пропишем формулу получения даты из пользовательского периода.

Пример выражения для получения даты окончания (актуально для остатков):

&СтандартныйПериод.ДатаОкончания

Пример выражения для получения даты начала (актуально для оборотов или среза на начало):

&СтандартныйПериод.ДатаНачала

Проанализируем этот подход: система сначала вычислит значение выражения (которое вернет тип Дата), а затем подставит результат в запрос. Ошибка «Несоответствие типов» исчезнет, так как в запрос попадет чистое значение даты.

Решение №3: Работа с виртуальными таблицами «Остатки и Обороты»

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


ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.ОстаткиИОбороты({(&ДатаНачала)}, {(&ДатаОкончания)}, Авто, , ) КАК Резервы

Здесь использование фигурных скобок {(&ДатаНачала)} и {(&ДатаОкончания)} позволяет СКД гибко управлять периодом. Если пользователь не заполнит даты в отчете, СКД просто проигнорирует эти фильтры в виртуальной таблице, и запрос не выдаст ошибку пустого значения или неверного типа.

Рекомендации по отладке

Если вы внесли изменения, но ошибка сохраняется, воспользуйтесь Консолью системы компоновки данных. Рассмотрим, как это поможет:

Важный момент: всегда проверяйте тип данных в колонке «Тип» на вкладке параметров. Если там указано «Составной тип», убедитесь, что в списке доступных типов выбрана Дата и она является приоритетной при заполнении.

Подводя итог, использование {(&ВашПараметр)} является «золотым стандартом» разработки в 1С. Это делает ваш запрос устойчивым к изменениям пользовательских настроек и гарантирует отсутствие ошибок несоответствия типов при работе с виртуальными таблицами регистров.

← На главную