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

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

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

Понимание возвращаемого значения методов Вывести и Присоединить

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

Проанализируем ситуацию: когда мы вызываем метод вывода, система автоматически вычисляет, в какое место документа попадет область. Рассмотрим пример кода:


// Получаем область из макета
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаДанных");

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

// Теперь в переменной НоваяОбласть содержатся координаты в итоговом документе
Сообщить("Область выведена в строки с " + НоваяОбласть.Верх + " по " + НоваяОбласть.Низ);

Важно помнить: свойства Верх, Низ, Лево и Право у объекта НоваяОбласть будут содержать абсолютные номера строк и колонок в ТабДок, а не те, что были в макете. Это самый простой и надежный способ узнать "координаты приземления" ваших данных.

Использование свойства Имя для получения адреса в формате R1C1

Если для вашей задачи требуется адрес в строковом формате (например, "R1C1:R5C10"), наиболее быстрым способом будет обращение к свойству Имя выведенной области. Рассмотрим, как это работает на практике:

Разберем по шагам процесс получения строкового адреса:

  1. Выводим область в документ.
  2. Обращаемся к свойству Имя полученного объекта.
  3. Система возвращает адрес в формате R1C1 (на русском языке это может выглядеть как "С1К1:С5К10" в зависимости от настроек локализации, но программно 1С понимает оба варианта).

ОбластьДня = ТабДок.Присоединить(Макет.ПолучитьОбласть("КолонкаДень"));
АдресЯчейки = ОбластьДня.Имя; // Получим строку вида "R10C5:R10C6"

Важный нюанс: Иногда свойство Имя может не содержать адреса, если области было присвоено пользовательское имя в макете. Однако при использовании методов Вывести() и Присоединить() для анонимных областей макета, 1С возвращает именно адрес.

Ручное формирование адреса области

В некоторых случаях разработчику требуется собрать адрес вручную, например, для формирования формул или специфических структур данных. Проанализируем, как составить строку адреса, используя числовые координаты границ области:


// Пример формирования адреса одной ячейки (левый верхний угол области)
ТекстАдреса = "R" + Формат(МояОбласть.Верх, "ЧГ=0") + "C" + Формат(МояОбласть.Лево, "ЧГ=0");

// Пример формирования полного диапазона области
ПолныйАдрес = "R" + Формат(МояОбласть.Верх, "ЧГ=0") + "C" + Формат(МояОбласть.Лево, "ЧГ=0") +
              ":R" + Формат(МояОбласть.Низ, "ЧГ=0") + "C" + Формат(МояОбласть.Право, "ЧГ=0");

Обратите внимание на использование Формат(Значение, "ЧГ=0"). Это критически важно, так как при больших номерах строк (более 1000) система может вставить разделитель групп разрядов (неразрывный пробел), что сделает адрес невалидным для методов 1С.

Метод Область() как альтернатива формату R1C1

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

Вместо того чтобы хранить строку "R10C5", гораздо эффективнее хранить структуру или массив с числами. Обратиться к нужной ячейке можно так:


// Обращение по координатам: Строка1, Колонка1, Строка2, Колонка2
НужнаяЯчейка = ТабДок.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
НужнаяЯчейка.Текст = "Новое значение";
НужнаяЯчейка.ЦветФона = ЦветаСтиля.ОсобыйТекст;

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

Динамическое именование областей для быстрого поиска

Выясним еще один изящный способ организации доступа к ячейкам. Вместо хранения таблицы соответствий "Дата - Адрес", мы можем присваивать уникальные имена областям прямо в момент их вывода в ТабличныйДокумент.

Рассмотрим алгоритм:

  1. При выводе области в цикле генерируем уникальное имя (например, на основе идентификатора данных или даты).
  2. Присваиваем это имя свойству Имя выведенной области.
  3. В дальнейшем находим область в коллекции ТабДок.Области.

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

// Где-то в другой части кода нам нужно найти ячейку конкретной даты:
ПоискОбласти = ТабДок.Области.Найти("Область_Дата_20231025");
Если ПоискОбласти <> Неопределено Тогда
    ПоискОбласти.ЦветТекста = ЦветаСтиля.ЦветОтрицательногоПоказателя;
КонецЕсли;

Учет смещений и объединенных ячеек

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

Чтобы не считать это вручную, всегда используйте свойства ВысотаТаблицы и ШиринаТаблицы у объекта выведенной области (а не всего документа). Они покажут фактический размер фрагмента с учетом всех объединений.

Разберем пример автоматического расчета следующей позиции:


Область1 = ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
// Высота выведенной части:
ВысотаШапки = Область1.ВысотаТаблицы; 

Область2 = ТабДок.Присоединить(Макет.ПолучитьОбласть("КолонкаСОбъединением"));
// Ширина присоединенной части:
ШиринаКолонки = Область2.ШиринаТаблицы;

Подводя итог, можно сказать, что наиболее надежным и современным способом работы с адресами в 1С является использование возвращаемых объектов от методов Вывести() и Присоединить(). Это дает полный контроль над координатами Верх, Лево, Низ, Право и позволяет избежать сложных математических расчетов и ошибок при формировании строковых адресов.

← На главную