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

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

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

Способ №1: Заполнение параметров до вывода области (рекомендуемый)

Прежде чем переходить к редактированию уже выведенных данных, важно проанализировать, почему это нельзя сделать заранее. Стандартная и наиболее производительная практика — это подготовка данных в области макета до её добавления в результирующий документ. Рассмотрим классический пример:


// Получаем область из макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

// Заполняем параметры до вывода
ОбластьШапка.Параметры.ДатаОтчета = ТекущаяДата();
ОбластьШапка.Параметры.Организация = Объект.Организация;

// Выводим уже заполненную область
ТабДок.Вывести(ОбластьШапка);

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

Способ №2: Использование возвращаемого значения функции Вывести()

Многие разработчики воспринимают Вывести() как процедуру, но на самом деле это функция. Проанализируем, что она возвращает. Согласно документации 1С, метод Вывести() возвращает объект типа ОбластьЯчеекТабличногоДокумента. Это именно тот фрагмент в итоговом документе, который был только что создан.

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

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


// Выводим область и сохраняем ссылку на неё в итоговом документе
НоваяОбласть = ТабДок.Вывести(ОбластьШапка);

// Теперь НоваяОбласть указывает на конкретные строки и колонки в ТабДок
// Если мы знаем, что нужный нам текст находится в первой ячейке выведенной области:
НоваяОбласть.ТекущаяОбласть.Текст = "Новое значение, установленное после вывода";

Если выведенная область состоит из нескольких ячеек, мы можем обратиться к конкретной ячейке внутри этой области, используя относительные координаты или методы работы с областями.

Способ №3: Прямое обращение к области по координатам

Если ссылка на область не была сохранена в момент вывода, мы можем вычислить её местоположение. Проанализируем ситуацию: табличный документ растет сверху вниз. Зная высоту документа до и после вывода, мы можем определить границы нужной нам секции. Для прямого редактирования используется метод Область() самого табличного документа.

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


// Предположим, мы знаем, что шапка всегда выводится в первые две строки
// ТабДок.Область(R1, C1, R2, C2)
НужнаяЯчейка = ТабДок.Область(1, 2, 1, 2); // Строка 1, Колонка 2
НужнаяЯчейка.Текст = "Исправленный текст";

Чтобы сделать этот процесс более гибким, можно использовать свойство ТабДок.ВысотаТаблицы, чтобы определить номер последней добавленной строки.

Способ №4: Поиск текста в сформированном документе

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

  1. Вызываем метод НайтиТекст(), передавая в него строку, которую мы хотим заменить (например, значение параметра по умолчанию или специальный маркер).
  2. Если текст найден, метод возвращает объект ОбластьЯчеекТабличногоДокумента.
  3. Меняем свойство Текст у найденной области.

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

Если НайденнаяОбласть <> Неопределено Тогда
    НайденнаяОбласть.Текст = "Обновленные данные";
КонецЕсли;

Внимание: этот метод является самым ресурсозатратным. Если табличный документ содержит тысячи строк, поиск может существенно замедлить работу программы. Используйте его только в крайних случаях.

Особенности работы с типом заполнения «Шаблон»

Разберем ситуацию, когда ячейка в макете имеет тип заполнения Шаблон, например: Заказ № [Номер] от [Дата]. После выполнения ТабДок.Вывести() в итоговой ячейке будет лежать уже готовая строка: Заказ № 123 от 01.01.2023. Связь с параметрами Номер и Дата полностью теряется. Если вам нужно изменить только номер, вам придется программно сформировать новую строку целиком и перезаписать свойство Текст в итоговой ячейке. Платформа 1С не позволяет «достучаться» до части шаблона после вывода.

Резюме для практической работы

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

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

← На главную