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