При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с малопонятной ошибкой: «Ошибка обработки представления... Несоответствие типов (Параметр номер "1")». Эта проблема обычно возникает при работе с виртуальными таблицами регистров накопления (Остатки, ОстаткиИОбороты) или регистров сведений (СрезПоследних). Давайте подробно разберем, почему это происходит и как правильно настроить параметры запроса, чтобы отчет работал стабильно.
Проанализируем ситуацию. В 1С существует два принципиально разных подхода к работе с параметрами в запросах СКД: стандартный механизм запросов платформы и расширение языка запросов компоновки данных. Когда мы обращаемся к виртуальной таблице, например, РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ДатаОстатков, ), система ожидает, что в первый параметр будет передано значение типа Дата.
Однако в настройках СКД на вкладке «Параметры» разработчики часто используют тип СтандартныйПериод. Этот тип является объектом, содержащим две даты (начало и конец) и вариант периода (день, месяц, произвольный период). Когда процессор компоновки данных пытается подставить объект типа СтандартныйПериод напрямую в параметр виртуальной таблицы, требующей тип Дата, возникает конфликт типов. Именно на него указывает система, называя это «Параметром номер 1» (так как период — это первый обязательный параметр для большинства виртуальных таблиц).
Также стоит обратить внимание на системный параметр &П, который часто мелькает в текстах подобных ошибок. Это внутреннее имя, которое СКД присваивает параметрам при автоматической генерации запроса. Его появление — явный признак того, что система пытается «самостоятельно» сопоставить настройки компоновки с текстом запроса, но делает это неудачно из-за неопределенности типов.
Самый эффективный и «чистый» способ решения проблемы — использование фигурных скобок в тексте запроса. Рассмотрим подробнее, как это работает. Фигурные скобки сообщают процессору СКД, что данный фрагмент запроса является расширением, которым система должна управлять самостоятельно.
Вместо жесткого написания параметра:
ИЗ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ДатаОстатков, ) КАК ТоварыВРезервеНаСкладахОстатки
Мы используем конструкцию расширения:
ИЗ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки({(&ДатаОстатков)}, ) КАК ТоварыВРезервеНаСкладахОстатки
Что это дает? Когда СКД видит параметр в фигурных скобках, она включает механизм интеллектуального приведения типов. Если в настройках отчета &ДатаОстатков связана с концом стандартного периода, СКД сама извлечет нужную дату из объекта и подставит ее в SQL-запрос в правильном формате. Это избавляет разработчика от необходимости вручную следить за преобразованием типов.
Если по каким-то причинам вы не хотите менять текст запроса, ситуацию можно исправить на уровне метаданных самой схемы компоновки. Разберем этот метод по шагам:
&Период).СтандартныйПериод с соответствующим типом.&Период пропишем формулу получения даты из пользовательского периода.Пример выражения для получения даты окончания (актуально для остатков):
&СтандартныйПериод.ДатаОкончания
Пример выражения для получения даты начала (актуально для оборотов или среза на начало):
&СтандартныйПериод.ДатаНачала
Проанализируем этот подход: система сначала вычислит значение выражения (которое вернет тип Дата), а затем подставит результат в запрос. Ошибка «Несоответствие типов» исчезнет, так как в запрос попадет чистое значение даты.
Посмотрим на ситуацию, когда используются таблицы остатков и оборотов. У таких таблиц параметров больше, и ошибка может возникать как в первом (Начало периода), так и во втором (Конец периода) параметрах. Рассмотрим пример правильного оформления виртуальной таблицы в тексте запроса:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.ОстаткиИОбороты({(&ДатаНачала)}, {(&ДатаОкончания)}, Авто, , ) КАК Резервы
Здесь использование фигурных скобок {(&ДатаНачала)} и {(&ДатаОкончания)} позволяет СКД гибко управлять периодом. Если пользователь не заполнит даты в отчете, СКД просто проигнорирует эти фильтры в виртуальной таблице, и запрос не выдаст ошибку пустого значения или неверного типа.
Если вы внесли изменения, но ошибка сохраняется, воспользуйтесь Консолью системы компоновки данных. Рассмотрим, как это поможет:
PARAMETERS в этом тексте. Если вместо даты там передается сложная структура или пустое значение NULL, значит, связь параметров в схеме настроена неверно.Важный момент: всегда проверяйте тип данных в колонке «Тип» на вкладке параметров. Если там указано «Составной тип», убедитесь, что в списке доступных типов выбрана Дата и она является приоритетной при заполнении.
Подводя итог, использование {(&ВашПараметр)} является «золотым стандартом» разработки в 1С. Это делает ваш запрос устойчивым к изменениям пользовательских настроек и гарантирует отсутствие ошибок несоответствия типов при работе с виртуальными таблицами регистров.