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