Как вывести надпись в правом верхнем углу таблицы СКД

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

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

Способ 1: Программное управление выводом в процедуре ПриКомпоновкеРезультата

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

Рассмотрим алгоритм действий:

  1. Устанавливаем свойство СтандартнаяОбработка в значение Ложь.
  2. Инициализируем все необходимые объекты СКД: КомпоновщикМакета, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.
  3. Выводим отчет во временный табличный документ.
  4. Находим нужную ячейку и вставляем текст.

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


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

Важный нюанс: В примере из обсуждения использовался поиск через НайтиТекст и парсинг имени области типа "R5C10". Мы крайне не рекомендуем полагаться на строковое имя области, так как при увеличении индексов строк (свыше 9) или колонок логика обрезания строки Лев() или Прав() может сломаться. Всегда используйте свойства Верх, Низ, Лево, Право объекта ОбластьТабличногоДокумента.

Способ 2: Использование макетов компоновки данных

Если мы не хотим писать сложный программный код, можно воспользоваться вкладкой Макеты в схеме СКД. Этот способ более «правильный» с точки зрения идеологии платформы 1С.

Выполним следующие шаги:

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

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

Способ 3: Использование «Рисунков» (текстовых полей)

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

Разберем, как это реализовать программно в той же процедуре ПриКомпоновкеРезультата:


// После вывода основного результата
ТекстовоеПоле = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
ТекстовоеПоле.Текст = "ед. изм.: тыс. руб.";
ТекстовоеПоле.ГраницаСверху = Ложь;
ТекстовоеПоле.ГраницаСлева = Ложь;
ТекстовоеПоле.ГраницаСправа = Ложь;
ТекстовоеПоле.ГраницаСнизу = Ложь;

// Позиционируем в районе последней колонки
НомерПоследнейКолонки = ДокументРезультат.ШиринаТаблицы;
ОбластьЯкорь = ДокументРезультат.Область(1, НомерПоследнейКолонки);

ТекстовоеПоле.Расположить(ОбластьЯкорь);
ТекстовоеПоле.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;

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

Способ 4: Настройка через пользовательские поля

Иногда задачу можно решить без программирования вообще. Рассмотрим ситуацию, когда надпись должна быть частью заголовка последней колонки:

  1. В настройках СКД создадим Вычисляемое поле с пустым выражением "".
  2. В макете оформления заголовка этого поля укажем текст «тыс. руб.».
  3. Добавим это поле в выбранные поля последним в списке.

Однако, проанализировав ситуацию, мы увидим, что этот метод привяжет надпись к конкретной колонке данных, и если колонки будут динамически добавляться в кросс-таблице, надпись может «уехать» со своего места. Поэтому для типа группировки Таблица лучше использовать Способ 1 или Способ 2.

Типичные ошибки при реализации

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

Выясним, какой метод оптимален: для простых отчетов достаточно Макетов оформления, а для сложных динамических таблиц с переменным количеством колонок — программная вставка в ПриКомпоновкеРезультата через свойство ШиринаТаблицы является наиболее надежным и универсальным решением.

← На главную