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

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

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

Основы работы с именованными областями

Для начала разберем базовый механизм. В табличном документе любая ячейка или группа ячеек (строки, колонки, прямоугольные области) представляется объектом ОбластьЯчеекТабличногоДокумента. У этого объекта есть важнейшее свойство — Имя. Рассмотрим, как оно работает на практике.

Когда мы работаем в конфигураторе, мы привыкли назначать имена через меню "Таблица — Имена — Назначить имя". Программно этот процесс выглядит идентично. Мы получаем нужную нам область по ее координатам (например, по номеру строки) и записываем в свойство Имя строковое значение.

Проанализируем простейший пример:


// Получаем область всей первой строки
ОбластьСтроки = ТабДок.Область("R1");
// Назначаем ей имя
ОбластьСтроки.Имя = "ЗаголовокОтчета";

Теперь, когда нам понадобится обратиться к этой строке позже в коде, нам не нужно помнить, что это именно первая строка. Мы можем использовать ее имя:


// Обращение по имени
НужнаяОбласть = ТабДок.Область("ЗаголовокОтчета");
НужнаяОбласть.ЦветФона = ЦветаСтиля.ЦветФонаВыделения;

Различие между секциями макета и именованными областями

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

Секции живут в макете, а именованные области живут в конкретном экземпляре табличного документа. Выясним одну важную деталь: если вы программно меняете имя области в макете перед его выводом, это может повлиять на логику формирования всего отчета. Рассмотрим ситуацию, когда нужно разметить уже готовый документ для последующей обработки.

Решение проблемы уникальности имен

Одной из главных трудностей, с которой сталкиваются разработчики, является требование уникальности имени в пределах одного документа. В системе 1С нельзя иметь две разные области с одинаковым именем. Если вы попытаетесь присвоить имя, которое уже занято другой областью, платформа может выдать ошибку или проигнорировать действие.

Разберем по шагам правильный алгоритм переименования или перемещения имени, который был предложен в ходе обсуждения специалистами:

  1. Очистка старого имени. Перед тем как назначить имя новой строке (например, при переносе области или итеративном изменении), необходимо "освободить" это имя у той области, которая им владела ранее.
  2. Назначение имени новой области. Только после того, как имя стало свободным, его можно присваивать новому диапазону ячеек.

Посмотрим на пример кода, который демонстрирует этот подход при вставке областей:


// Предположим, у нас есть макет и мы хотим переместить имя области со строки 1 на строку 2
Стр = 1;
НовСтр = 2;
Кол = 1;

// 1. Сначала убираем имя у старой области
Макет.Область("R" + Стр).Имя = "";

// 2. Теперь назначаем это же имя новой строке или диапазону строк
Макет.Область("R" + НовСтр).Имя = "Область1";

// Если нужно именовать диапазон строк:
Макет.Область("R" + Стр + ":R" + НовСтр).Имя = "ОбщаяОбласть";

Работа с коллекцией Имена

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


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

Это крайне удобно, если вы создаете сложный динамический конструктор отчетов, где количество именованных зон заранее неизвестно.

Автоматическое расширение именованных областей

Рассмотрим еще одну интересную особенность платформы 1С. Если вы назначили имя области, состоящей из нескольких строк (например, строкам с 5 по 10), и затем используете метод ВставитьОбласть() для добавления строк внутрь этого диапазона, платформа автоматически раздвинет границы вашей именованной области.

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

Практические советы и рекомендации

При программном именовании строк придерживайтесь следующих правил:

Выясним, зачем вообще это нужно на практике. Представьте огромную таблицу на 1000 строк, где структура меняется в зависимости от настроек пользователя. Вместо того чтобы высчитывать "R" + НомерСтроки, вы просто помечаете ключевые точки именами. Это делает ваш код устойчивым к изменениям макета: если бухгалтер добавит новую колонку или строку в макет, ваш программный код продолжит работать корректно, так как он ориентируется на имена, а не на жесткие координаты.

Подводя итог, можно сказать, что программное управление именами в табличном документе — это мощный инструмент в руках разработчика 1С. Главное — помнить об уникальности имен в пространстве одного документа и не забывать очищать старые значения при необходимости переназначения.

← На главную