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