Как правильно использовать внешнюю таблицу значений в СКД и исправить ошибку в запросе

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

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

Причина возникновения ошибки «Неверные параметры»

Рассмотрим типичную ситуацию: программист создает «Набор данных — запрос» и пишет код, аналогичный стандартному запросу в 1С:


ВЫБРАТЬ
    ТЗ_Период.МесяцТЗ КАК МесяцТЗ
ПОМЕСТИТЬ ВТ
ИЗ
    &ТЗ_Период КАК ТЗ_Период

При попытке сохранить такой запрос СКД выдает ошибку: {(5, 2)}: Неверные параметры "ТЗ_Период". Проблема заключается в том, что в конструкторе запроса СКД нельзя использовать таблицы значений как параметры (через &), в отличие от обычного объекта Запрос в коде 1С. Система компоновки данных ожидает, что внешние данные будут переданы через специально выделенный механизм — «Набор данных — объект».

Шаг 1. Настройка схемы компоновки данных (СКД)

Для решения задачи нам необходимо изменить структуру схемы. Вместо «Набора данных — запрос» (или в дополнение к нему) мы создадим объектный набор данных. Разберем этот процесс по шагам:

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

Шаг 2. Программное формирование отчета

Поскольку данные во внешний набор нельзя передать простым установлением параметра, нам придется формировать отчет программно. Рассмотрим ситуацию, когда мы переопределяем обработчик ПриКомпоновкеРезультата в модуле объекта отчета.

Проанализируем пример кода, который позволяет инициализировать схему данными из внешней ТЗ:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отменяем стандартный вывод, так как будем все делать вручную
    СтандартнаяОбработка = Ложь;
    
    // 1. Получаем или формируем нашу таблицу значений (ТЗ)
    // Допустим, она уже сформирована в переменной ТЗ_ДляОтчета
    
    // 2. Подготавливаем внешние наборы данных
    // Ключ структуры должен СОВПАДАТЬ с "Именем объекта" в схеме СКД
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ВнешняяТаблицаПериодов", ТЗ_ДляОтчета);
    
    // 3. Настраиваем компоновщик макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Выполняем компоновку макета
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    // 4. Инициализируем процессор компоновки данных
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
    
    // 5. Выводим результат в табличный документ
    ДокументРезультат.Очистить();
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
КонецПроцедуры

Разбор критических ошибок при программном выводе

Выясним причины, по которым даже при наличии кода может возникнуть ошибка «Не найден внешний набор данных»:

1. Ошибка в именах. Если в коде вы написали ВнешниеНаборыДанных.Вставить("ТЗ", Выгрузка), а в схеме СКД в поле «Имя объекта» указано ВнешняяТаблицаИсточника, то система выдаст ошибку. СКД ищет данные по строковому ключу в переданной структуре.

2. Типизация колонок. Выясним, почему важно типизировать ТаблицуЗначений. Если колонка в ТЗ не имеет четкого описания типов (например, создана просто через Колонки.Добавить("Месяц")), СКД может некорректно обрабатывать итоги или группировки. Рекомендуется использовать ОписаниеТипов при создании таблицы:


ТЗ = Новый ТаблицаЗначений;
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Дата"));
ОписаниеДаты = Новый ОписаниеТипов(МассивТипов);
ТЗ.Колонки.Добавить("МесяцТЗ", ОписаниеДаты);

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

Совместное использование запросов и внешних таблиц

Иногда требуется объединить данные из реальных таблиц базы данных и внешней ТЗ. В этом случае в схеме СКД сосуществуют два набора: «Набор данных — запрос» и «Набор данных — объект». Чтобы они работали вместе, выполним следующие действия:

Посмотрим на это со стороны производительности: если внешняя таблица содержит десятки тысяч строк, соединение в памяти может работать медленнее, чем SQL-запрос. В таких случаях стоит рассмотреть возможность предварительной загрузки данных во временную таблицу (если используется версия платформы 8.3.20+) или оптимизацию состава передаваемых полей.

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

← На главную