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