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