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