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

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

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

Постановка задачи и симптомы проблемы

Рассмотрим классический пример. У нас есть запрос к виртуальной таблице регистра сведений, куда мы пытаемся явно передать параметр на начало периода. Текст запроса выглядит примерно так:


ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    МАКСИМУМ(ЦеныНоменклатурыСрезПоследних.Цена) КАК Цена
ПОМЕСТИТЬ ВТ_Цены
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&НачалоПериода, ) КАК ЦеныНоменклатурыСрезПоследних
СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Номенклатура

При попытке сформировать отчет платформа выдает ошибку несоответствия типов. Разработчик уверен, что передает дату (например, используя выражение Период.ДатаНачала для параметра с типом СтандартныйПериод), однако СКД отказывается корректно обрабатывать запрос. Почему так происходит? Выясним причину.

Разберем причины возникновения ошибки

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

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

Давайте подробно разберем несколько способов элегантного решения этой проблемы.

Решение 1: Правильная настройка выражений для Стандартного Периода

Посмотрим на самое простое и популярное решение. Если на форме вы используете тип СтандартныйПериод, нужно корректно извлечь из него дату для регистра.

В настройках параметров СКД (вкладка «Параметры») выполним следующие действия:

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

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

Решение 2: Использование необязательных параметров (Синтаксис СКД)

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

Модифицируем вызов виртуальной таблицы, заключив параметр в фигурные скобки:


ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних({(&Период)}, ) КАК ЦеныНоменклатурыСрезПоследних

Теперь СКД будет анализировать: если параметр передан, он подставится в запрос. Если параметр пуст или отключен пользователем, система просто проигнорирует его, и виртуальная таблица вернет данные на текущую дату (или конец времен. оси). Ошибка типов возникать не будет.

Решение 3: Обход зарезервированных имен и настройка «Компоновки данных»

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

  1. Переименуем наш параметр во что-то уникальное, не зарезервированное платформой. Например, вместо &НачалоПериода назовем его &ДатаСрезаЦен. Это отключает скрытые системные алгоритмы.
  2. Избегаем явного написания параметров в круглых скобках виртуальной таблицы в тексте запроса. Вместо этого оставляем параметры пустыми: РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних.
  3. Переходим на вкладку «Компоновка данных» в конструкторе запроса и задаем параметры виртуальной таблицы именно там.

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

Подведение итогов

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

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

← На главную