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