При формировании сложных отчетов или печатных форм программисты 1С часто сталкиваются с необходимостью узнать точные координаты ячеек, в которые только что была выведена область макета. Это может потребоваться для создания гиперссылок внутри документа, постобработки конкретных строк (например, изменения цвета или шрифта в зависимости от условий) или для корректного управления разрывами страниц. В этой статье мы подробно разберем, как получить адреса ячеек и работать с координатами выведенных областей.
Самая распространенная ошибка начинающих разработчиков заключается в представлении метода Вывести() как простой процедуры, которая просто «отправляет» данные в табличный документ. На самом деле, в платформе 1С:Предприятие 8 метод Вывести() является функцией. Она не только переносит данные, но и возвращает объект типа ОбластьЯчеекТабличногоДокумента. Этот возвращаемый объект соответствует той самой области, которая только что появилась в вашем итоговом документе.
Рассмотрим стандартную ситуацию, описанную в вопросе. Проанализируем код, который позволяет мгновенно получить доступ к координатам:
// Создаем объекты для работы
Макет = ПолучитьМакет("Макет");
ТД = Новый ТабличныйДокумент;
Обл = Макет.ПолучитьОбласть("Обл");
Для й = 1 По 10 Цикл
// Заполняем параметры области
Обл.Параметры.Знач1 = й;
Обл.Параметры.Знач2 = 10 - й;
// Ключевой момент: получаем результат выполнения метода
ВыведеннаяОбласть = ТД.Вывести(Обл);
// Теперь у нас есть доступ к координатам
НомерСтрокиНачала = ВыведеннаяОбласть.Верх;
НомерСтрокиКонца = ВыведеннаяОбласть.Низ;
НомерКолонкиНачала = ВыведеннаяОбласть.Лево;
НомерКолонкиКонца = ВыведеннаяОбласть.Право;
Сообщить("Область выведена в строки с " + НомерСтрокиНачала + " по " + НомерСтрокиКонца);
КонецЦикла;
В этом примере переменная ВыведеннаяОбласть содержит ссылку на конкретный диапазон ячеек в объекте ТД. Важно понимать, что это уже не та область, которую мы брали из макета (Обл), а её «оттиск» в результирующем документе.
Аналогичная логика работает и для метода Присоединить(). Если вы формируете таблицу не только сверху вниз, но и вправо (например, создаете динамические колонки), вам критически важно знать, куда именно «приклеилась» новая секция. Так как высота таблицы при использовании метода Присоединить() может не меняться, использование свойства ВысотаТаблицы будет бесполезным.
Разберем пример с горизонтальным выводом:
ОбластьКолонки = Макет.ПолучитьОбласть("Колонка");
Для кл = 1 По 5 Цикл
ОбластьКолонки.Параметры.ИмяКолонки = "Колонка №" + кл;
НоваяКолонка = ТД.Присоединить(ОбластьКолонки);
// Получаем адрес первой ячейки присоединенной области
АдресR1C1 = "R" + НоваяКолонка.Верх + "C" + НоваяКолонка.Лево;
Сообщить("Новая секция начинается в: " + АдресR1C1);
КонецЦикла;
В 1С адресация ячеек часто строится на числовых индексах строк и колонок. Если вам нужно получить строковое представление адреса (например, для записи в лог или для программной установки формул), вы можете собрать его вручную. Помните, что свойства Верх, Низ, Лево и Право возвращают порядковые номера, начинающиеся с 1.
Выясним, как собрать полный адрес всей области:
ВыведеннаяОбласть = ТД.Вывести(Обл);
ПолныйАдрес = "R" + Формат(ВыведеннаяОбласть.Верх, "ЧГ=0") +
"C" + Формат(ВыведеннаяОбласть.Лево, "ЧГ=0") +
":R" + Формат(ВыведеннаяОбласть.Низ, "ЧГ=0") +
"C" + Формат(ВыведеннаяОбласть.Право, "ЧГ=0");
Использование функции Формат с параметром ЧГ=0 необходимо для того, чтобы платформа не вставляла разделитель групп разрядов (пробел) в номера строк, если их количество превышает 999.
Иногда координаты нужны не для сиюминутной справки, а для того, чтобы обратиться к ячейкам позже, после завершения цикла вывода. В этом случае хорошей практикой считается присвоение уникального имени выведенной области. Это позволит вам работать с ТД.Области, не храня массивы числовых координат.
Проанализируем этот подход:
Для Каждого СтрокаДанных Из СписокТоваров Цикл
Секция = Макет.ПолучитьОбласть("Строка");
ЗаполнитьЗначенияСвойств(Секция.Параметры, СтрокаДанных);
ТекОбласть = ТД.Вывести(Секция);
// Назначаем имя области, чтобы потом найти её
ТекОбласть.Имя = "Товар_" + СтрокаДанных.Артикул;
КонецЦикла;
// Позже в коде...
Попытка
ОбластьНужногоТовара = ТД.Области.Товар_А123;
ОбластьНужногоТовара.ЦветФона = ЦветаСтиля.ОсобыйТекст;
Исключение
// Область не найдена
КонецПопытки;
Если по каким-то причинам вы не сохранили результат функции Вывести(), можно воспользоваться свойством самого табличного документа ВысотаТаблицы. Оно возвращает номер последней заполненной строки. Однако этот метод менее точен, так как:
Присоединить().ВысотаТаблицы, чтобы найти начало.Посмотрим на пример использования этого свойства:
ТД.Вывести(Обл);
НомерПоследнейСтроки = ТД.ВысотаТаблицы;
// Если мы знаем, что в области Обл ровно 3 строки:
НомерНачальнойСтроки = НомерПоследнейСтроки - 3 + 1;
Как мы видим, этот способ требует «ручного» контроля размеров областей, что делает код более хрупким при изменениях в макете. Использование возвращаемого значения функции Вывести() гораздо надежнее.
1. Расчет относительных координат. Если ваша область в макете — это не одна ячейка, а целый блок (например, шапка с логотипом), и вам нужно найти адрес конкретной внутренней ячейки внутри этого блока в итоговом документе, используйте простую математику. Координата будет равна: (ВерхВыведеннойОбласти + ИндексВнутриМакета - 1).
2. Проверка вывода. Зная координаты через Вывести(), вы можете более гибко управлять разрывами страниц. Хотя для этого есть метод ПроверитьВывод(), знание свойства Низ выведенной области позволяет программно вставлять ВывестиГоризонтальныйРазрывСтраницы(), если отчет должен строго следовать определенной логике разбиения.
3. Поиск текста. Если координаты потеряны окончательно, вы можете использовать метод ТД.НайтиТекст(). Он вернет объект типа ОбластьЯчеекТабличногоДокумента, из которого снова можно извлечь Верх и Лево. Но помните, что этот метод работает значительно медленнее и может вернуть не ту ячейку, если значения в таблице дублируются.
Таким образом, использование возвращаемого значения методов Вывести() и Присоединить() — это самый эффективный и правильный путь для получения адресов ячеек в 1С. Это избавляет от лишних вычислений и делает код устойчивым к изменениям структуры макета.