При работе с отчетами и печатными формами в системе 1С:Предприятие часто возникает необходимость не просто выводить данные по координатам (строка, колонка), а обращаться к конкретным строкам или группам ячеек по их именам. Это делает код более читаемым, гибким и позволяет динамически изменять структуру документа. В рамках данной статьи мы разберем, как программно управлять именованными областями, рассмотрим тонкости работы со свойством Имя и изучим способы обхода типичных ошибок.
Для начала разберем базовый механизм. В табличном документе любая ячейка или группа ячеек (строки, колонки, прямоугольные области) представляется объектом ОбластьЯчеекТабличногоДокумента. У этого объекта есть важнейшее свойство — Имя. Рассмотрим, как оно работает на практике.
Когда мы работаем в конфигураторе, мы привыкли назначать имена через меню "Таблица — Имена — Назначить имя". Программно этот процесс выглядит идентично. Мы получаем нужную нам область по ее координатам (например, по номеру строки) и записываем в свойство Имя строковое значение.
Проанализируем простейший пример:
// Получаем область всей первой строки
ОбластьСтроки = ТабДок.Область("R1");
// Назначаем ей имя
ОбластьСтроки.Имя = "ЗаголовокОтчета";
Теперь, когда нам понадобится обратиться к этой строке позже в коде, нам не нужно помнить, что это именно первая строка. Мы можем использовать ее имя:
// Обращение по имени
НужнаяОбласть = ТабДок.Область("ЗаголовокОтчета");
НужнаяОбласть.ЦветФона = ЦветаСтиля.ЦветФонаВыделения;
Важно различать секции макета и именованные области. Секции макета (которые мы создаем в конструкторе макета) обычно используются как шаблоны для вывода данных. Именованные области — это механизм самого ТабличногоДокумента (уже сформированного или формируемого), позволяющий идентифицировать части документа.
Секции живут в макете, а именованные области живут в конкретном экземпляре табличного документа. Выясним одну важную деталь: если вы программно меняете имя области в макете перед его выводом, это может повлиять на логику формирования всего отчета. Рассмотрим ситуацию, когда нужно разметить уже готовый документ для последующей обработки.
Одной из главных трудностей, с которой сталкиваются разработчики, является требование уникальности имени в пределах одного документа. В системе 1С нельзя иметь две разные области с одинаковым именем. Если вы попытаетесь присвоить имя, которое уже занято другой областью, платформа может выдать ошибку или проигнорировать действие.
Разберем по шагам правильный алгоритм переименования или перемещения имени, который был предложен в ходе обсуждения специалистами:
Посмотрим на пример кода, который демонстрирует этот подход при вставке областей:
// Предположим, у нас есть макет и мы хотим переместить имя области со строки 1 на строку 2
Стр = 1;
НовСтр = 2;
Кол = 1;
// 1. Сначала убираем имя у старой области
Макет.Область("R" + Стр).Имя = "";
// 2. Теперь назначаем это же имя новой строке или диапазону строк
Макет.Область("R" + НовСтр).Имя = "Область1";
// Если нужно именовать диапазон строк:
Макет.Область("R" + Стр + ":R" + НовСтр).Имя = "ОбщаяОбласть";
Для более продвинутого управления документом полезно знать о существовании коллекции Имена у объекта ТабличныйДокумент. Она содержит список всех именованных областей, существующих в документе в данный момент. Проанализируем, как можно перебрать все имена программно:
Для Каждого ТекущееИмя Из ТабДок.Имена Цикл
Сообщить("Имя области: " + ТекущееИмя.Имя);
// Можно получить саму область, связанную с этим именем
Область = ТекущееИмя.Область;
Сообщить("Координаты: " + Область.Верх + " - " + Область.Низ);
КонецЦикла;
Это крайне удобно, если вы создаете сложный динамический конструктор отчетов, где количество именованных зон заранее неизвестно.
Рассмотрим еще одну интересную особенность платформы 1С. Если вы назначили имя области, состоящей из нескольких строк (например, строкам с 5 по 10), и затем используете метод ВставитьОбласть() для добавления строк внутрь этого диапазона, платформа автоматически раздвинет границы вашей именованной области.
Это избавляет разработчика от необходимости вручную пересчитывать координаты. Вы один раз задаете логическое имя группе строк, и как бы вы ни наполняли ее данными внутри, имя ОбластьДанных будет всегда указывать на актуальный, расширенный диапазон.
При программном именовании строк придерживайтесь следующих правил:
ТабДок.Область("НесуществующееИмя") не вызовет ошибку, но вернет пустую область (одну ячейку R1C1), что может привести к неверному заполнению данных.РисунокТабличногоДокумента (картинки, диаграммы) также имеют свойство Имя. Это позволяет, например, программно находить логотип компании в печатной форме и заменять его на актуальный.НайтиТекст(), а затем всей строке, в которой находится эта ячейка, присвоить имя для дальнейшего вывода подчиненных данных.Выясним, зачем вообще это нужно на практике. Представьте огромную таблицу на 1000 строк, где структура меняется в зависимости от настроек пользователя. Вместо того чтобы высчитывать "R" + НомерСтроки, вы просто помечаете ключевые точки именами. Это делает ваш код устойчивым к изменениям макета: если бухгалтер добавит новую колонку или строку в макет, ваш программный код продолжит работать корректно, так как он ориентируется на имена, а не на жесткие координаты.
Подводя итог, можно сказать, что программное управление именами в табличном документе — это мощный инструмент в руках разработчика 1С. Главное — помнить об уникальности имен в пространстве одного документа и не забывать очищать старые значения при необходимости переназначения.