Как программно перезаполнить параметр у уже выведенной области табличного документа

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

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

Метод 1. Сбор данных через Дерево Значений (Рекомендуемый подход)

Прежде всего проанализируем совет из обсуждения: «Сначала готовим данные, потом выводим». Это золотое правило разработки отчетов. Если данные в итоговой строке зависят от последующих вычислений, лучшим решением будет использование промежуточного контейнера — ДеревоЗначений.

Рассмотрим по шагам, как это реализовать:

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

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

Метод 2. Прямое обращение к ячейке по координатам

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

Разберем, как зафиксировать положение ячейки и изменить ее значение позже:


// В момент вывода области запоминаем номер строки
НомерСтрокиСИтогом = ТабДок.ВысотаТаблицы + 1;
ТабДок.Вывести(ОбластьИтога);

// ... далее идет код получения данных из второго запроса ...
НовоеЗначениеИтога = РезультатВторогоЗапроса.Сумма;

// Теперь обращаемся к конкретной ячейке (например, в колонке 5)
// Обратите внимание, что мы работаем со свойством Текст или Значение
Ячейка = ТабДок.Область(НомерСтрокиСИтогом, 5);
Ячейка.Текст = НовоеЗначениеИтога;

Важный нюанс: Если в ячейке макета стоял тип «Параметр», то после вывода он преобразуется в обычный текст. Чтобы сохранить возможность расшифровки, нам нужно будет обновить и ее.

Метод 3. Использование именованных областей в результирующем документе

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

Проанализируем пример кода:


// При выводе области назначаем ей уникальное имя
ИмяОбласти = "ИтогПоГруппе_" + СтрЗаменить(Новый УникальныйИдентификатор(), "-", "");
ОбластьДляВывода = Макет.ПолучитьОбласть("Строка");
ТабДок.Вывести(ОбластьДляВывода);

// Назначаем имя последней выведенной строке
ВыведеннаяОбласть = ТабДок.Область(ТабДок.ВысотаТаблицы, , ТабДок.ВысотаТаблицы, );
ВыведеннаяОбласть.Имя = ИмяОбласти;

// Позже, когда данные получены, находим область по имени
НужнаяОбласть = ТабДок.Области.Найти(ИмяОбласти);
Если НужнаяОбласть <> Неопределено Тогда
    // Обращаемся к конкретной колонке внутри найденной области
    НужнаяОбласть.Область(1, 5, 1, 5).Текст = РассчитанныйИтог;
КонецЕсли;

Метод 4. Поиск по тексту-маркеру

В ситуациях, когда отчет крайне сложный, можно применить метод «маркеров». При выводе области, итог которой пока неизвестен, мы записываем в параметр уникальную строковую метку (например, #Итог_Группы_1#).

После завершения всех расчетов воспользуемся методом НайтиТекст():


Маркер = "#Итог_Группы_1#";
НайденнаяОбласть = ТабДок.НайтиТекст(Маркер);

Пока НайденнаяОбласть <> Неопределено Цикл
    НайденнаяОбласть.Текст = Формат(ИтоговаяСумма, "ЧДЦ=2");
    // Ищем следующий, если маркеры могут повторяться
    НайденнаяОбласть = ТабДок.НайтиТекст(Маркер);
КонецЦикла;

Этот метод прост в реализации, но следует учитывать производительность: при очень больших объемах данных (десятки тысяч строк) поиск текста может занять значительное время.

Работа с расшифровкой при программном заполнении

Выясним важную деталь: если ваш отчет предполагает интерактивность (двойной клик по сумме открывает детальный отчет или документ), то простой замены текста в ячейке недостаточно. Нам необходимо также перезаполнить свойство Расшифровка.

Рассмотрим пример комплексного обновления ячейки:


ОбластьЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки);
ОбластьЯчейки.Текст = РассчитанныйИтог;

// Формируем структуру или значение для расшифровки
СтруктураРасшифровки = Новый Структура;
СтруктураРасшифровки.Вставить("Группа", ТекущаяГруппа);
СтруктураРасшифровки.Вставить("ТипДанных", "ИтогВторойСекции");

ОбластьЯчейки.Расшифровка = СтруктураРасшифровки;

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

← На главную