Как добавить произвольную колонку в конец отчета СКД перед общими итогами

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача нестандартного расположения колонок. Стандартно СКД выводит сначала измерения группировок, затем ресурсы, и в самом конце — общие итоги. Если нам требуется вставить текстовое поле (например, ДолжностьЗамещения или Комментарий) в самый конец строки, но при этом оставить числовые итоги по горизонтали еще правее, стандартные настройки «Выбранных полей» могут не сработать. Рассмотрим несколько эффективных способов решения этой задачи.

Способ 1. Отключение автопозиции ресурсов

По умолчанию в СКД включен механизм, который принудительно группирует все ресурсы в конце области вывода. Чтобы получить полный контроль над порядком следования колонок, нам необходимо изменить это поведение. Разберем шаги настройки:

  1. Перейдем на закладку Настройки в схеме компоновки данных.
  2. Выберем нужный вариант отчета или конкретную таблицу/группировку в структуре.
  3. В нижней части экрана откроем вкладку Другие настройки.
  4. Найдем параметр Автопозиция ресурсов и установим для него значение Не использовать.
  5. Теперь перейдем на закладку Выбранные поля. Обратим внимание, что теперь мы можем свободно перемещать числовые ресурсы и обычные текстовые поля (реквизиты) относительно друг друга с помощью стрелок «Вверх»/«Вниз».
  6. Разместим поле ДолжностьЗамещения после всех необходимых ресурсов, но перед ресурсом, отвечающим за итоговую сумму (если он добавлен вручную).

Важный нюанс: Если мы используем стандартные «Общие итоги», этот метод может не позволить «вклиниться» перед автоматической колонкой итогов, так как СКД все равно отрисует итоги в самом конце. В этом случае перейдем к следующему методу.

Способ 2. Использование текстового поля как ресурса

Если отчет представляет собой таблицу (кросс-таблицу) и нам нужно, чтобы текст выводился в области данных, мы можем объявить наше текстовое поле ресурсом. Проанализируем, как это сделать правильно, чтобы не испортить структуру данных:

  1. Перейдем на закладку Ресурсы.
  2. Добавим поле ДолжностьЗамещения в список ресурсов.
  3. В качестве выражения укажем агрегатную функцию, работающую со строками, например: Максимум(ДолжностьЗамещения).
  4. Чтобы в ячейках итогов по вертикали или горизонтали не выводился бессмысленный текст, в колонке Рассчитывать по... укажем только те группировки, в которых нам нужно видеть это значение (например, по детальным записям или конкретному сотруднику).

Рассмотрим пример настройки выражения для такого ресурса, если мы хотим избежать дублирования текста в итогах:


Выбор 
    Когда Количество(Различные ДолжностьЗамещения) > 1 
    Тогда "Разные значения" 
    Иначе Максимум(ДолжностьЗамещения) 
Конец

Такой подход заставит СКД воспринимать текст как часть блока показателей, и он будет выводиться в общем ряду с числами.

Способ 3. Структура с детальными записями в колонках

Это один из самых гибких и надежных методов. Суть заключается в том, чтобы в структуре настроек отчета (вкладка «Настройки» -> «Структура») управлять выводом колонок через дополнительные группировки.

Выясним, как настроить иерархию группировок для достижения результата:

  1. В структуре отчета, в ветке Колонки, создадим две группы.
  2. В первую группу добавим измерения, которые формируют основные данные (например, Период или ВидРабот).
  3. Вторую группу создадим на том же уровне (соседнюю), но укажем в ней Детальные записи.
  4. Для этой группировки с детальными записями в Выбранных полях укажем только наше поле ДолжностьЗамещения.
  5. В Других настройках этой группировки установим Расположение общих итогов по горизонтали = Нет, чтобы избежать появления лишних пустых колонок.

Проанализируем ситуацию: теперь СКД сначала выведет все колонки первого блока (основные данные), затем колонку детальных записей (наш текст), и только после этого — финальные общие итоги всей таблицы. Это позволяет четко зафиксировать положение текстовой колонки перед итоговым суммированием.

Способ 4. Программная модификация в ПриКомпоновкеРезультата

Если визуальных настроек недостаточно или отчет строится динамически с очень сложной логикой, разберем программный метод. Мы можем перехватить процесс формирования и программно вставить колонку в готовый ТабличныйДокумент.

Посмотрим на пример кода, который можно разместить в модуле отчета:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Сформируем отчет программно
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ДокументРезультат = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Теперь найдем область итогов и вставим перед ней колонку
    // Это сложный путь, требующий обхода ячеек документа
    // Например, можно найти текст "Итого" и использовать метод ВставитьОбласть()
    
    // Выводим результат пользователю
    Результат.Вывести(ДокументРезультат);
    
КонецПроцедуры

Важно помнить, что программный метод лишает пользователя части интерактивности (например, возможности быстро менять настройки через стандартную форму), поэтому его стоит использовать только тогда, когда возможности самой СКД полностью исчерпаны.

Рекомендации по оформлению

При использовании текстовых колонок в конце отчета, не забывайте про оформление. Чтобы колонка ДолжностьЗамещения визуально не сливалась с итогами, рекомендуется:

Таким образом, мы рассмотрели несколько путей решения задачи. Наиболее предпочтительным является Способ 3 (использование группировок колонок), так как он сохраняет гибкость настроек СКД и не требует написания сложного программного кода.

← На главную