Как переместить колонку с итогами в нужное место в отчете СКД 1С 8.3?

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

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

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

Выясняем причину: почему ресурсы уходят в конец?

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

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

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

  1. Откроем нашу схему компоновки данных (макет СКД) и перейдем на вкладку Настройки.
  2. В структуре отчета выберем самый верхний уровень (весь отчет) или конкретную группировку, внутри которой необходимо изменить порядок колонок.
  3. В нижней части экрана перейдем на вкладку Другие настройки.
  4. Найдем параметр Авто позиция ресурсов. По умолчанию он установлен в значение Авто или После всех полей. Нам необходимо принудительно изменить это значение на Не использовать.
  5. Перейдем на соседнюю вкладку Выбранные поля.
  6. Обратим внимание на наличие поля Авто в списке выбранных полей. Если оно там присутствует, его необходимо удалить или снять с него флажок, так как оно продолжает использовать автоматический порядок вывода.
  7. Теперь вручную перетащим из левого списка (доступные поля) в правый список (выбранные поля) все нужные реквизиты и ресурсы в строгом соответствии с желаемым порядком. Например:
    • Контрагент (Группировка)
    • СуммаОборота (Ресурс/Итог) — теперь он встанет ровно посередине таблицы.
    • ОсновнойМенеджер (Реквизит)
    • Телефон (Реквизит)

После выполнения этих простых шагов при формировании отчета колонка с итоговыми суммами отобразится ровно в указанном месте, не улетая в самый конец документа.

Способ 2. Использование вычисляемых полей для кросс-таблиц (Сложные случаи)

Предыдущий способ отлично работает для линейных списков, но если наш отчет построен в виде кросс-таблицы (таблицы с динамическими колонками, разворачивающимися по периодам, складам или номенклатурным группам), стандартное отключение автопозиции ресурсов может не дать нужного результата. В кросс-таблицах общие итоги по горизонтали всё равно будут стремиться в крайний правый угол.

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

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

Этот изящный метод позволяет обмануть стандартный алгоритм компоновки и жестко зафиксировать суммарные показатели в любой части кросс-таблицы.

Способ 3. Программный перенос колонок в табличном документе (Постобработка)

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

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отменяем стандартный вывод отчета, чтобы управлять процессом вручную
    СтандартнаяОбработка = Ложь;
    
    // Инициализируем схему, настройки и компоновщик макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    // Запускаем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // Выводим результат во временный табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Начинаем постобработку полученной таблицы.
    // Допустим, колонка с итогами вывелась в 10-й столбец, а мы хотим вставить её на место 5-й колонки.
    ИндексИсточника = 10;
    ИндексПриемника = 5;
    
    // Проверяем, что в документе действительно есть колонки для переноса
    Если ДокументРезультат.ШиринаТаблицы >= ИндексИсточника Тогда
        
        // Получаем область колонки, которую нужно переместить
        ОбластьИтогов = ДокументРезультат.Область(, ИндексИсточника, , ИндексИсточника);
        
        // Вставляем область перед целевой колонкой
        ДокументРезультат.ВставитьОбласть(ОбластьИтогов, ДокументРезультат.Область(, ИндексПриемника, , ИндексПриемника), ТипСмещенияТабличногоДокумента.ПоГоризонтали);
        
        // Удаляем старую исходную колонку (обратите внимание, что после вставки индекс источника сместился на +1)
        ДокументРезультат.УдалитьОбласть(ДокументРезультат.Область(, ИндексИсточника + 1, , ИндексИсточника + 1), ТипСмещенияТабличногоДокумента.ПоГоризонтали);
        
    КонецЕсли;

КонецПроцедуры

Этот метод гарантирует стопроцентный результат работы, так как мы манипулируем уже готовыми ячейками сформированного отчета. Вы можете программно находить номера нужных колонок, выполняя поиск по тексту в ячейках шапки с помощью метода НайтиТекст объекта ТабличныйДокумент, что сделает алгоритм переноса абсолютно динамическим и независимым от изменения состава колонок пользователем.

Таким образом, мы рассмотрели все возможные варианты решения проблемы позиционирования итогов в СКД. Для большинства повседневных задач вам будет достаточно первого способа с отключением параметра Авто позиция ресурсов. В более сложных отчетах и кросс-таблицах используйте вычисляемые поля или программную постобработку табличного документа.

← На главную