Как исправить ошибку несоответствия типов в параметрах виртуальных таблиц СКД

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

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

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

Проанализируем ситуацию: когда мы используем виртуальную таблицу, например, РегистрНакопления.РасчетыСКлиентами.Остатки, платформа ожидает, что в качестве первого параметра (Период) будет передана конкретная точка во времени — значение типа Дата, МоментВремени или Граница.

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

Решение 1: Простое изменение типа данных

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

  1. Перейдем в схему компоновки данных на вкладку Параметры.
  2. Найдем параметр Период.
  3. В колонке Тип заменим СтандартныйПериод на Дата.
  4. Убедимся, что в тексте запроса параметр передается в виртуальную таблицу корректно:

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

Решение 2: Использование выражений (Профессиональный подход)

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

Разберем алгоритм настройки:

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

Вариант выражения: &ПериодОтчета.ДатаОкончания

В этом случае, когда пользователь выберет "Январь 2024", в параметр виртуальной таблицы автоматически попадет дата 31.01.2024 23:59:59.

Решение 3: Учет границы периода

Проанализируем тонкий момент: в 1С дата 31.01.2024 23:59:59 может не включать движения, совершенные ровно в эту секунду, если не использовать специальный объект Граница. Чтобы получить максимально точные остатки, включая последнюю секунду, в поле Выражение лучше использовать следующую конструкцию:

ВЫЧИСЛИТЬВЫРАЖЕНИЕ("Граница(&ПериодОтчета.ДатаОкончания, ВключаяГраницу)")

Или более простой, но эффективный метод через функцию КонецПериода:

КонецПериода(&ПериодОтчета.ДатаОкончания, "ДЕНЬ")

Особенности работы с временными таблицами и расширением языка запросов

Посмотрим на пример запроса, который вызывал ошибку у автора темы. В нем используется временная таблица ВТ и секция {ГДЕ ...}. Важно понимать, что СКД пытается автоматически управлять параметрами.

Если вы используете конструкцию:


{ГДЕ
    (ЗаказыКлиентов.ЗаказКлиента.Дата >= &ПериодНачалоОтчета
            И ЗаказыКлиентов.ЗаказКлиента.Дата <= &ПериодКонецОтчета)}

И при этом в другом месте запроса обращаетесь к Остатки(&Период), система может запутаться в типах, если параметры &ПериодНачалоОтчета и &ПериодКонецОтчета не определены явно на вкладке параметров.

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

Почему важны скобки в виртуальных таблицах?

Обратите внимание на синтаксис обращения к виртуальной таблице. Рассмотрим разницу:

  1. РегистрНакопления.РасчетыСКлиентами.Остатки — допустимая форма, СКД сама попытается подставить параметры.
  2. РегистрНакопления.РасчетыСКлиентами.Остатки() — явное указание вызова функции.
  3. РегистрНакопления.РасчетыСКлиентами.Остатки(&ДатаОстатков, ) — жесткое управление параметрами.

При использовании временных таблиц автоматика СКД часто дает сбой. Поэтому наиболее надежным способом является явное указание параметров в скобках. Если вы указываете скобки, обязательно заполните в них нужные позиции. Помните: Параметр №1 — это всегда Дата (Период), а Параметр №2 — это Условие (Отбор).

Если вы написали Остатки(&Контрагент), система воспримет &Контрагент как дату, что и приведет к ошибке несоответствия типов. Правильно будет: Остатки(, Контрагент = &Контрагент).

Итоги

Для устранения ошибки "несоответствие типов параметр номер 1" выполните три действия:

← На главную