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

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

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

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

Выясняем причину: почему СКД генерирует параметр &П и ругается на типы?

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

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

Параллельно с этим в отчете практически всегда присутствует стандартный параметр Период с типом СтандартныйПериод, который пользователи используют в режиме предприятия для выбора интервала (например, «Прошлый месяц» или «Текущий год»).

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

Почему ошибка проявляется именно при ЛЕВОЕ СОЕДИНЕНИЕ?

Если виртуальная таблица выбирается как основной источник в секции ИЗ, СКД часто успевает перехватить управление и неявно преобразовать типы данных. Однако при использовании конструкции ЛЕВОЕ СОЕДИНЕНИЕ СУБД требует абсолютно жесткого и однозначного описания типов связей и параметров на этапе компиляции запроса. Любая неоднозначность в типах параметров приводит к моментальному отказу построителя запросов 1С.

---

Способ 1. Профессиональное решение: Связывание параметров (Рекомендуется)

Этот способ является наиболее правильным с точки зрения архитектуры разработки в 1С. Он позволяет предоставить пользователю удобный выбор периода через стандартный интерфейс, но при этом передать в виртуальную таблицу корректный тип данных (конкретную дату).

Разберем этот метод по шагам:

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

    Важный нюанс: использование функции КонецПериода с точностью до "Дня" гарантирует, что если пользователь выберет дату окончания, например, 31.12.2023, СКД приведет её к времени 23:59:59, и все данные за последний день гарантированно попадут в срез последних.

  6. Теперь вернемся в текст нашего запроса и явно укажем созданный параметр в скобках виртуальной таблицы:

ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    ФИОСрезПоследних.Фамилия КАК Фамилия,
    ФИОСрезПоследних.Имя КАК Имя,
    ФИОСрезПоследних.Отчество КАК Отчество
ИЗ
    Справочник.Сотрудники КАК Сотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних(&КонецПериода, ) КАК ФИОСрезПоследних
    ПО Сотрудники.ФизЛицо = ФИОСрезПоследних.ФизическоеЛицо

Явное указание &КонецПериода блокирует автоматическую генерацию скрытого параметра &П. СКД видит конкретную переменную с типом Дата, и запрос отрабатывает корректно и быстро.

---

Способ 2. Быстрое решение: Переименование конфликтующего параметра

Если в вашем отчете нет необходимости использовать сложный параметр типа СтандартныйПериод, а нужна только одна дата, или если вы хотите решить проблему максимально оперативно без создания цепочек параметров, выполните следующие действия:

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

Поскольку имя параметра больше не совпадает со стандартным словом Период, СКД перестанет осуществлять неверное автоматическое сопоставление типов, и ошибка исчезнет.

---

Способ 3. Локальное управление автозаполнением в Конструкторе запросов

Иногда разработчики полностью отключают автозаполнение схемы на первой вкладке, чтобы решить эту проблему. Однако это крайняя мера, так как при отключенном автозаполнении вам придется вручную прописывать все доступные поля, роли и связи наборов данных, что сильно замедляет разработку.

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

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

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

Резюме

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

← На главную