В процессе разработки отчетов или печатных форм на платформе 1С:Предприятие 8 часто возникает ситуация, когда часть данных (например, итоговые суммы или сложные расчетные показатели) становится известна только после того, как основной массив документа уже выведен на экран или в объект ТабличныйДокумент. Попытка записать данные "задним числом" в уже сформированную шапку часто оборачивается неудачей: код выполняется без ошибок, но текст в ячейке не появляется. В этой статье мы подробно разберем, почему так происходит, и изучим правильные методы работы с областями табличного документа.
Проанализируем ситуацию, с которой сталкиваются многие разработчики. Допустим, мы вывели шапку документа, затем программно заполнили многострочную часть и в самом конце получили некое итоговое число, которое должно красоваться в верхнем блоке отчета. Типичная ошибка заключается в использовании метода ПолучитьОбласть() для обращения к уже выведенным данным.
Рассмотрим, почему метод ПолучитьОбласть() не подходит для редактирования готового документа:
ПолучитьОбласть() предназначен для работы с макетом. Он создает копию фрагмента (объекта) в памяти.ТабличныйДокумент.ПолучитьОбласть(), отобразились, эту область нужно снова вывести методом Вывести() или Присоединить(), что приведет к дублированию строк внизу документа, а не к изменению шапки.Для решения задачи нам необходим метод Область(). В отличие от своего "собрата", он возвращает прямую ссылку на конкретный диапазон ячеек в текущем табличном документе. Любое изменение свойства Текст у объекта, полученного через Область(), мгновенно отражается в документе.
Если нам точно известны координаты ячейки (строка и колонка), мы можем обратиться к ней напрямую. Это самый быстрый, но требующий внимательности способ. Выясним, как правильно вычислить номер строки, если шапка имеет динамическую высоту.
Проанализируем пример кода, где мы записываем значение в 6-ю колонку строки, которая была актуальна на момент вывода шапки:
// Предположим, переменная НомерСтрокиШапки была сохранена сразу после вывода заголовка
НомерСтрокиШапки = 1;
// ... какой-то сложный расчет ...
ИтогРасчета = 15500;
// Используем метод Область для записи значения
ТД.Область(НомерСтрокиШапки, 6).Текст = Формат(ИтогРасчета, "ЧЦ=15; ЧДЦ=2");
Обратите внимание на использование метода Область(НомерСтроки, НомерКолонки). Если вы попытаетесь добавить свойство ТекущаяОбласть (как это часто делают по привычке из Excel), это может привести к путанице. Метод Область() сам по себе возвращает объект типа ОбластьЯчеекТабличногоДокумента, с которым можно работать напрямую.
Работа с жестко заданными номерами строк (например, ТД.ВысотаТаблицы()) — это "хрупкий" метод. Если структура отчета изменится, расчет координат может сломаться. Более надежный подход — использование именованных областей в макете.
Разберем по шагам, как реализовать этот механизм:
ИтогПоДокументу.Теперь мы можем обратиться к ячейке по её имени, не заботясь о том, на какой строке она в итоге оказалась:
// Обращаемся к ячейке по имени, заданному в макете
Попытка
ТД.Область("ИтогПоДокументу").Текст = Строка(ИтогРасчета);
Исключение
Сообщить("Область с таким именем не найдена в документе!");
КонецПопытки;
Важное ограничение: если вы выводите одну и ту же именованную область несколько раз (например, в цикле вывода строк товаров), метод Область("Имя") вернет либо первую найденную область, либо совокупный диапазон, что может привести к ошибке при попытке записи текста. Данный метод идеально подходит именно для уникальных ячеек в шапке или подвале.
Иногда возникают ситуации, когда мы заранее не знаем ни координат, ни имен (например, при редактировании внешних печатных форм). В этом случае можно воспользоваться методом НайтиТекст(). Мы можем оставить в ячейке шапки "маркер" — специальный текст, который позже заменим на расчетные данные.
Посмотрим на пример реализации такого поиска:
// В макете в нужной ячейке написано: [ИтоговоеЗначение]
Маркер = "[ИтоговоеЗначение]";
НайденнаяОбласть = ТД.НайтиТекст(Маркер);
Если НайденнаяОбласть <> Неопределено Тогда
// Заменяем маркер реальным значением
НайденнаяОбласть.Текст = Формат(ИтогРасчета, "ЧДЦ=2");
// Дополнительно можно изменить оформление
НайденнаяОбласть.ЦветТекста = WebЦвета.Красный;
КонецЕсли;
Многие начинающие программисты пытаются использовать свойство Параметры уже после вывода документа, полагая, что связь между параметром макета и ячейкой сохраняется. Выясним, почему это заблуждение.
Когда выполняется метод Вывести(ОбластьМакета), 1С берет значения из ОбластьМакета.Параметры, подставляет их в текстовые поля и "рисует" статичные ячейки в итоговом документе ТД. После завершения метода Вывести() связь разрывается. Изменение ТД.Параметры.Сумма = 100 не приведет к обновлению уже напечатанного текста. Единственный способ изменить текст в уже выведенной ячейке — это прямое обращение к Область().Текст.
Если ваша целевая ячейка в шапке является частью объединенной области (например, ячейки с 1 по 5 колонку объединены), при записи текста через Область() нужно учитывать следующее:
платформа 1С достаточно интеллектуальна. Если вы укажете координаты любой ячейки, входящей в объединение, текст будет записан во всю объединенную область. Однако хорошим тоном считается обращение к левой верхней ячейке объединения.
Используя объект, возвращаемый методом Область(), мы можем не только записывать текст, но и управлять визуальным представлением данных в зависимости от результата расчета. Рассмотрим пример динамического форматирования:
ОбластьРезультата = ТД.Область(НомерСтрокиШапки, 6);
ОбластьРезультата.Текст = ИтогРасчета;
Если ИтогРасчета < 0 Тогда
// Если результат отрицательный, выделим его жирным и красным
ОбластьРезультата.Шрифт = Новый Шрифт(ОбластьРезультата.Шрифт, , , Истина);
ОбластьРезультата.ЦветТекста = ЦветаСтиля.ОсобыйТекст;
Иначе
ОбластьРезультата.ЦветТекста = ЦветаСтиля.ТекстФигуры;
КонецЕсли;
Подведем итоги нашего анализа. Выбор метода зависит от архитектуры вашего отчета:
ВысотаТаблицы().Помните: ПолучитьОбласть() — это для подготовки данных к выводу, а Область() — для редактирования уже выведенного результата. Понимание этой разницы сэкономит вам немало времени при отладке отчетов.