При работе с Системой компоновки данных (СКД) начинающие разработчики часто сталкиваются с ошибкой «Неверные параметры» при попытке передать таблицу значений (ТЗ) напрямую в текст запроса через символ &. В этой статье мы разберем, почему возникает эта проблема, как правильно настроить внешний набор данных и какие нюансы программного кода нужно учесть, чтобы отчет работал корректно.
Рассмотрим типичную ситуацию: программист создает «Набор данных — запрос» и пишет код, аналогичный стандартному запросу в 1С:
ВЫБРАТЬ
ТЗ_Период.МесяцТЗ КАК МесяцТЗ
ПОМЕСТИТЬ ВТ
ИЗ
&ТЗ_Период КАК ТЗ_Период
При попытке сохранить такой запрос СКД выдает ошибку: {(5, 2)}: Неверные параметры "ТЗ_Период". Проблема заключается в том, что в конструкторе запроса СКД нельзя использовать таблицы значений как параметры (через &), в отличие от обычного объекта Запрос в коде 1С. Система компоновки данных ожидает, что внешние данные будут переданы через специально выделенный механизм — «Набор данных — объект».
Для решения задачи нам необходимо изменить структуру схемы. Вместо «Набора данных — запрос» (или в дополнение к нему) мы создадим объектный набор данных. Разберем этот процесс по шагам:
ВнешняяТаблицаПериодов. Важно: это имя должно точно совпадать с ключом в структуре, которую мы передадим позже программно.ТаблицеЗначений. Например, если в ТЗ есть колонка МесяцТЗ, то и в наборе данных поле должно называться МесяцТЗ.Поскольку данные во внешний набор нельзя передать простым установлением параметра, нам придется формировать отчет программно. Рассмотрим ситуацию, когда мы переопределяем обработчик ПриКомпоновкеРезультата в модуле объекта отчета.
Проанализируем пример кода, который позволяет инициализировать схему данными из внешней ТЗ:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отменяем стандартный вывод, так как будем все делать вручную
СтандартнаяОбработка = Ложь;
// 1. Получаем или формируем нашу таблицу значений (ТЗ)
// Допустим, она уже сформирована в переменной ТЗ_ДляОтчета
// 2. Подготавливаем внешние наборы данных
// Ключ структуры должен СОВПАДАТЬ с "Именем объекта" в схеме СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ВнешняяТаблицаПериодов", ТЗ_ДляОтчета);
// 3. Настраиваем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Выполняем компоновку макета
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// 4. Инициализируем процессор компоновки данных
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
// 5. Выводим результат в табличный документ
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Выясним причины, по которым даже при наличии кода может возникнуть ошибка «Не найден внешний набор данных»:
1. Ошибка в именах. Если в коде вы написали ВнешниеНаборыДанных.Вставить("ТЗ", Выгрузка), а в схеме СКД в поле «Имя объекта» указано ВнешняяТаблицаИсточника, то система выдаст ошибку. СКД ищет данные по строковому ключу в переданной структуре.
2. Типизация колонок. Выясним, почему важно типизировать ТаблицуЗначений. Если колонка в ТЗ не имеет четкого описания типов (например, создана просто через Колонки.Добавить("Месяц")), СКД может некорректно обрабатывать итоги или группировки. Рекомендуется использовать ОписаниеТипов при создании таблицы:
ТЗ = Новый ТаблицаЗначений;
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Дата"));
ОписаниеДаты = Новый ОписаниеТипов(МассивТипов);
ТЗ.Колонки.Добавить("МесяцТЗ", ОписаниеДаты);
3. Свойство СтандартнаяОбработка. Проанализируем ситуацию: если вы пишете код в ПриКомпоновкеРезультата, но забываете установить СтандартнаяОбработка = Ложь, платформа попытается сформировать отчет автоматически по нажатию кнопки «Сформировать». Но автоматический механизм ничего не знает о вашей структуре ВнешниеНаборыДанных, что приведет к ошибке еще до того, как сработает ваш код.
Иногда требуется объединить данные из реальных таблиц базы данных и внешней ТЗ. В этом случае в схеме СКД сосуществуют два набора: «Набор данных — запрос» и «Набор данных — объект». Чтобы они работали вместе, выполним следующие действия:
Номенклатура или Период).Посмотрим на это со стороны производительности: если внешняя таблица содержит десятки тысяч строк, соединение в памяти может работать медленнее, чем SQL-запрос. В таких случаях стоит рассмотреть возможность предварительной загрузки данных во временную таблицу (если используется версия платформы 8.3.20+) или оптимизацию состава передаваемых полей.
Таким образом, мы разобрали основные этапы работы с внешними источниками в СКД. Главное правило — строгое соответствие имен объектов в схеме и ключей в программном коде, а также обязательное управление процессом вывода через ПроцессорКомпоновкиДанных.