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

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

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

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

Почему нельзя изменить параметр после вывода секции

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

Попытка повторно изменить значение в объекте ОбластьСпецификация.Параметры никак не повлияет на уже добавленные в документ строки.

Способ 1. Использование уникального маркера и метода НайтиТекст()

Разберем популярный и простой способ подстановки: вывод временной строки-метки (маркера) с последующим поиском и заменой текста после завершения формирования документа.

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

Посмотрим на пример реализации данного алгоритма:


// 1. Формируем шапку с маркером-заполнителем
ОбластьСпецификация = Макет.ПолучитьОбласть("Спецификация");
ОбластьСпецификация.Параметры.ТоварНаименование = "Товар согласно приложения на #КоличествоСтраниц#";
ТабДокумент.Вывести(ОбластьСпецификация);

// 2. Выводим остальные разделы и строки документа
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицы");
Для Каждого Стр Из ТаблицаТоваров Цикл
    ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, Стр);
    ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

// 3. Вычисляем общее количество страниц
ВсегоСтраниц = ТабДокумент.КоличествоСтраниц();
ТекстСтраниц = Строка(ВсегоСтраниц) + " листах";

// 4. Находим маркер и выполняем замену текста
НайденнаяОбласть = ТабДокумент.НайтиТекст("#КоличествоСтраниц#");
Если НайденнаяОбласть <> Неопределено Тогда
    НайденнаяОбласть.Текст = СтрЗаменить(НайденнаяОбласть.Текст, "#КоличествоСтраниц#", ТекстСтраниц);
КонецЕсли;

Способ 2. Точная адресация ячейки через свойство ВысотаТаблицы

Если в документе выводится большой объем данных, сканирование всего документа через НайтиТекст() может занимать дополнительное время. Более производительный и надежный способ — зафиксировать номер строки в момент вывода целевой секции.

Рассмотрим пошагово, как реализовать обращение к конкретной ячейке по координатам:

  1. Перед выводом области запоминаем текущую высоту документа с помощью свойства ВысотаТаблицы.
  2. Выводим область в документ.
  3. Вычисляем номер строки, в которой оказалась целевая ячейка.
  4. После завершения формирования печатной формы обращаемся напрямую к ячейке через метод Область(НомерСтроки, НомерКолонки).

// 1. Фиксируем начальную позицию строки
НомерСтроки = ТабДокумент.ВысотаТаблицы + 1;
НомерКолонки = 2; // Номер колонки, где выводится текст

ОбластьСпецификация = Макет.ПолучитьОбласть("Спецификация");
ТабДокумент.Вывести(ОбластьСпецификация);

// 2. Выводим оставшуюся часть документа
// ... вывод других секций ...

// 3. Получаем итоги и обновляем значение в известной ячейке
ВсегоСтраниц = ТабДокумент.КоличествоСтраниц();
ЯчейкаДляЗамены = ТабДокумент.Область(НомерСтроки, НомерКолонки);
ЯчейкаДляЗамены.Текст = "Товар согласно приложения на " + Строка(ВсегоСтраниц) + " листах";

Особенности расчета количества страниц и склонения текста

При использовании метода КоличествоСтраниц() важно учитывать технические особенности платформы 1С:

  1. Зависимость от настроек печати: метод КоличествоСтраниц() производит расчет на основе параметров страницы (ПолеСверху, ПолеСнизу, ОриентацияСтраницы, АвтоМасштаб). Если эти свойства настраиваются программно, их необходимо задать до вызова метода расчета.
  2. Особенности серверного вызова: при выполнении кода на стороне сервера (особенно под управлением ОС Linux) для корректного расчета разбиения на страницы требуются установленные шрифты и настроенная графическая подсистема печати.
  3. Склонение числительных: чтобы текст формировался грамматически корректно для любого числа страниц (например, «на 1 листе», «на 2 листах», «на 5 листах»), рекомендуется использовать функцию ЧислоПрописью() с параметрами предмета исчисления:

ФорматнаяСтрока = "L=ru_RU; ДП=Истина";
ПараметрыПредмета = "лист, листа, листов, м, , , , , 0";
Склонение = ЧислоПрописью(ВсегоСтраниц, ФорматнаяСтрока, ПараметрыПредмета);
// Результат для 2: "два листа", для 5: "пять листов"
← На главную