При программном формировании сложных отчетов или печатных форм часто возникает необходимость не просто вывести данные в ТабличныйДокумент, но и запомнить координаты выведенных областей. Это может понадобиться для последующего форматирования, установки расшифровок или динамического изменения данных в уже сформированном документе. В этой статье мы подробно разберем, как эффективно получать адреса ячеек и работать с координатами областей.
Многие начинающие разработчики полагают, что методы Вывести() и Присоединить() просто копируют данные из макета в итоговый документ. Однако эти методы возвращают крайне полезный объект типа ОбластьЯчеекТабличногоДокумента. Этот объект представляет собой фрагмент уже заполненного итогового документа.
Проанализируем ситуацию: когда мы вызываем метод вывода, система автоматически вычисляет, в какое место документа попадет область. Рассмотрим пример кода:
// Получаем область из макета
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаДанных");
// Выводим её в итоговый табличный документ
НоваяОбласть = ТабДок.Вывести(ОбластьМакета);
// Теперь в переменной НоваяОбласть содержатся координаты в итоговом документе
Сообщить("Область выведена в строки с " + НоваяОбласть.Верх + " по " + НоваяОбласть.Низ);
Важно помнить: свойства Верх, Низ, Лево и Право у объекта НоваяОбласть будут содержать абсолютные номера строк и колонок в ТабДок, а не те, что были в макете. Это самый простой и надежный способ узнать "координаты приземления" ваших данных.
Если для вашей задачи требуется адрес в строковом формате (например, "R1C1:R5C10"), наиболее быстрым способом будет обращение к свойству Имя выведенной области. Рассмотрим, как это работает на практике:
Разберем по шагам процесс получения строкового адреса:
Имя полученного объекта.
ОбластьДня = ТабДок.Присоединить(Макет.ПолучитьОбласть("КолонкаДень"));
АдресЯчейки = ОбластьДня.Имя; // Получим строку вида "R10C5:R10C6"
Важный нюанс: Иногда свойство Имя может не содержать адреса, если области было присвоено пользовательское имя в макете. Однако при использовании методов Вывести() и Присоединить() для анонимных областей макета, 1С возвращает именно адрес.
В некоторых случаях разработчику требуется собрать адрес вручную, например, для формирования формул или специфических структур данных. Проанализируем, как составить строку адреса, используя числовые координаты границ области:
// Пример формирования адреса одной ячейки (левый верхний угол области)
ТекстАдреса = "R" + Формат(МояОбласть.Верх, "ЧГ=0") + "C" + Формат(МояОбласть.Лево, "ЧГ=0");
// Пример формирования полного диапазона области
ПолныйАдрес = "R" + Формат(МояОбласть.Верх, "ЧГ=0") + "C" + Формат(МояОбласть.Лево, "ЧГ=0") +
":R" + Формат(МояОбласть.Низ, "ЧГ=0") + "C" + Формат(МояОбласть.Право, "ЧГ=0");
Обратите внимание на использование Формат(Значение, "ЧГ=0"). Это критически важно, так как при больших номерах строк (более 1000) система может вставить разделитель групп разрядов (неразрывный пробел), что сделает адрес невалидным для методов 1С.
Как показывает практика и обсуждения опытных разработчиков, использование строковых адресов в формате R1C1 зачастую менее удобно и более подвержено ошибкам, чем работа с числовыми индексами. Рассмотрим метод Область() самого табличного документа.
Вместо того чтобы хранить строку "R10C5", гораздо эффективнее хранить структуру или массив с числами. Обратиться к нужной ячейке можно так:
// Обращение по координатам: Строка1, Колонка1, Строка2, Колонка2
НужнаяЯчейка = ТабДок.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
НужнаяЯчейка.Текст = "Новое значение";
НужнаяЯчейка.ЦветФона = ЦветаСтиля.ОсобыйТекст;
Такой подход работает быстрее, так как платформе не нужно парсить строку адреса для определения координат ячеек.
Выясним еще один изящный способ организации доступа к ячейкам. Вместо хранения таблицы соответствий "Дата - Адрес", мы можем присваивать уникальные имена областям прямо в момент их вывода в ТабличныйДокумент.
Рассмотрим алгоритм:
Имя выведенной области.ТабДок.Области.
Для Каждого ТекущаяДата Из СписокДат Цикл
Область = ТабДок.Присоединить(Макет.ПолучитьОбласть("День"));
Область.Параметры.Дата = ТекущаяДата;
// Присваиваем уникальное имя для последующего поиска
ИмяОбласти = "Область_Дата_" + Формат(ТекущаяДата, "ДФ=yyyyMMdd");
Область.Имя = ИмяОбласти;
КонецЦикла;
// Где-то в другой части кода нам нужно найти ячейку конкретной даты:
ПоискОбласти = ТабДок.Области.Найти("Область_Дата_20231025");
Если ПоискОбласти <> Неопределено Тогда
ПоискОбласти.ЦветТекста = ЦветаСтиля.ЦветОтрицательногоПоказателя;
КонецЕсли;
Проанализируем ситуацию, когда в макете используются объединенные ячейки. При ручном расчете координат часто совершают ошибку, прибавляя единицу к номеру колонки для перехода к следующей. Однако, если область состоит из двух объединенных колонок, следующий вывод должен быть смещен на две колонки.
Чтобы не считать это вручную, всегда используйте свойства ВысотаТаблицы и ШиринаТаблицы у объекта выведенной области (а не всего документа). Они покажут фактический размер фрагмента с учетом всех объединений.
Разберем пример автоматического расчета следующей позиции:
Область1 = ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
// Высота выведенной части:
ВысотаШапки = Область1.ВысотаТаблицы;
Область2 = ТабДок.Присоединить(Макет.ПолучитьОбласть("КолонкаСОбъединением"));
// Ширина присоединенной части:
ШиринаКолонки = Область2.ШиринаТаблицы;
Подводя итог, можно сказать, что наиболее надежным и современным способом работы с адресами в 1С является использование возвращаемых объектов от методов Вывести() и Присоединить(). Это дает полный контроль над координатами Верх, Лево, Низ, Право и позволяет избежать сложных математических расчетов и ошибок при формировании строковых адресов.