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