При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести подряд два разных блока информации. Например, первой таблицей вывести остатки номенклатуры, а второй — взаиморасчеты с контрагентами. Когда данные передаются из кода с помощью внешних таблиц значений через модуль отчета в процедуре ПриКомпоновкеРезультата, разработчик создает два отдельных набора данных типа «Объект». При попытке вывести их по очереди компоновщик выдает ошибку: «Наборы данных не связаны».
В этом материале мы подробнее разберем причины этой проблемы и проанализируем решения, позволяющие вывести две раздельные таблицы с несвязанными данными.
Платформа 1С пытается сопоставить наборы данных в следующих ситуациях:
Разберем по шагам, как правильно настроить схему компоновки данных без изменения логики получения данных:
Отчет, одна под другой.Рассмотрим пример кода в модуле объекта отчета (в процедуре ПриКомпоновкеРезультата), который обеспечивает передачу двух внешних таблиц значений в схему компоновки:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ИмеющиесяДанные, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Формируем или получаем две независимые таблицы значений
ТЗ_Номенклатура = ПолучитьТаблицуНоменклатуры();
ТЗ_Контрагенты = ПолучитьТаблицуКонтрагентов();
// Имена ключей структуры должны точно совпадать с именами наборов данных "Объект" в СКД
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("НаборДанныхНоменклатура", ТЗ_Номенклатура);
ВнешниеНаборыДанных.Вставить("НаборДанныхКонтрагенты", ТЗ_Контрагенты);
СхемаКомпоновки = ПолучитьМакет();
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ИмеющиесяДанные);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ИмеющиесяДанные);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Проанализируем альтернативный вариант настройки схемы. Если требуется выводить данные в едином потоке, в схеме компоновки данных можно создать один родительский «Набор данных — Объединение» и поместить в него два набора данных типа «Объект».
В этом случае платформа формирует общий список полей. Для отсутствующих колонок в одной из таблиц значение будет равно NULL. Это позволяет выводить данные как единой группировкой, так и отдельными блоками, не вызывая ошибок о несвязанных наборах.
При работе с независимыми наборами данных важно учитывать особенности платформы 1С: