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