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