Как вывести две независимые таблицы из разных наборов данных в 1С СКД?

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

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

В этом материале мы подробнее разберем причины этой проблемы и проанализируем решения, позволяющие вывести две раздельные таблицы с несвязанными данными.

Выясним причину ошибки связывания наборов данных

Платформа 1С пытается сопоставить наборы данных в следующих ситуациях:

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

Способ 1. Корректная настройка структуры отчета в СКД

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

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

Способ 2. Программный передача внешних наборов данных

Рассмотрим пример кода в модуле объекта отчета (в процедуре ПриКомпоновкеРезультата), который обеспечивает передачу двух внешних таблиц значений в схему компоновки:


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

Способ 3. Использование «Набора данных — Объединение»

Проанализируем альтернативный вариант настройки схемы. Если требуется выводить данные в едином потоке, в схеме компоновки данных можно создать один родительский «Набор данных — Объединение» и поместить в него два набора данных типа «Объект».

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

Ограничения и особенности вывода

При работе с независимыми наборами данных важно учитывать особенности платформы 1С:

  1. Последовательный вывод: Без использования связей или специальных алгоритмов с вычислением номеров строк СКД выводит независимые таблицы только друг под другом. Вывести две несвязанные таблицы «бок о бок» (в соседних колонках) встроенными средствами структуры настроек нельзя.
  2. Отсутствие общих итогов: Рассчитать сквозной итог или общий ресурс по всему отчету для несвязанных наборов данных единым выражением невозможно. Итоги рассчитываются отдельно внутри каждого блока данных.
← На главную