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

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

В процессе разработки в среде 1С:Предприятие часто возникают ситуации, когда необходимо обработать группу однотипных реквизитов. Например, в документе может быть создано несколько полей для хранения данных, именованных по шаблону д1, д2, ..., д30. Прописывать обращение к каждому такому реквизиту вручную через точку (например, Объект.д1, Объект.д2) — задача трудоемкая и делающая код громоздким. В этой статье мы подробно разберем, как автоматизировать этот процесс и обращаться к свойствам объекта программно.

Основной способ: использование квадратных скобок

Разберем самый эффективный и общепринятый метод. Платформа 1С позволяет обращаться к свойствам объектов не только через прямую ссылку (через точку), но и через коллекцию свойств, используя квадратные скобки []. Внутри скобок указывается строковое имя реквизита.

Если у нас есть переменная н, которая принимает значения от 1 до 30, мы можем сконструировать имя реквизита «на лету». Рассмотрим пример кода:


Для н = 1 По 30 Цикл
    ИмяРеквизита = "д" + Формат(н, "ЧГ=");
    ЗначениеРеквизита = Объект[ИмяРеквизита];
    // Выполняем действия с полученным значением
КонецЦикла;

В данном примере мы используем переменную ИмяРеквизита, которая на каждой итерации цикла принимает значения "д1", "д2" и так далее. Обратите внимание на важный нюанс: использование функции Формат.

Зачем нужна функция Формат при работе с именами?

Проанализируем ситуацию, которая часто становится причиной ошибок у начинающих разработчиков. По умолчанию при преобразовании числа в строку (например, Строка(1000)) система может добавлять неразрывные пробелы для разделения групп разрядов (получится "1 000"). Если ваш реквизит называется д1000, а система попытается найти д1 000, возникнет ошибка «Поле объекта не обнаружено».

Чтобы избежать этого, мы используем параметр "ЧГ=" (ЧГ — группировка разрядов). Установка этого параметра в пустое значение гарантирует, что число будет преобразовано в строку без лишних пробелов. Это критически важно для корректного формирования имени реквизита.

Проверка существования реквизита через Метаданные

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

Рассмотрим, как выполнить такую проверку программно:


ИмяНужногоРеквизита = "д" + Формат(н, "ЧГ=");
Если Метаданные.Документы.ИмяВашегоДокумента.Реквизиты.Найти(ИмяНужногоРеквизита) <> Неопределено Тогда
    Объект[ИмяНужногоРеквизита] = "Новое значение";
Иначе
    Сообщить("Реквизит с именем " + ИмяНужногоРеквизита + " не найден в метаданных!");
КонецЕсли;

Такой подход делает ваш код более отказоустойчивым и профессиональным.

Работа с табличными частями

Выясним, применим ли этот метод для табличных частей. Ответ — да. Если вам нужно перебрать колонки в конкретной строке табличной части, синтаксис остается идентичным. Посмотрим на пример:


Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    Для н = 1 По 5 Цикл
        ИмяКолонки = "ДопПоле" + Формат(н, "ЧГ=");
        СтрокаТЧ[ИмяКолонки] = "Значение " + н;
    КонецЦикла;
КонецЦикла;

Здесь мы видим двухуровневый обход: сначала перебираем строки таблицы, а внутри каждой строки обращаемся к нужным колонкам по их именам.

Универсальный обход всех реквизитов объекта

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


МетаданныеОбъекта = Объект.Метаданные();
Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
    Имя = Реквизит.Имя;
    Значение = Объект[Имя];
    // Здесь можно добавить логику фильтрации, например по префиксу "д"
    Если Лев(Имя, 1) = "д" Тогда
        // Обрабатываем только нужные нам реквизиты
    КонецЕсли;
КонецЦикла;

Этот способ позволяет создавать по-настоящему универсальные обработки, которые будут работать с любыми документами без изменения исходного кода.

Альтернативные методы и их недостатки

Существуют и другие способы обращения к реквизитам, однако они имеют свои ограничения:

  1. Функция Выполнить(). Можно собрать строку кода "Объект.д" + н + " = 10" и запустить ее через Выполнить(). Однако этот метод считается "плохим тоном", так как его сложно отлаживать, он работает медленнее и может быть небезопасен.
  2. ЗаполнитьЗначенияСвойств(). Если ваша цель — просто скопировать данные из одного объекта в другой с такими же именами полей, используйте метод ЗаполнитьЗначенияСвойств(Приемник, Источник). Это встроенная системная функция, работающая максимально быстро.

Вопросы производительности

Важно помнить, что обращение через квадратные скобки Объект["Имя"] работает немного медленнее, чем прямое обращение через точку Объект.Имя. Это связано с тем, что системе требуется время на поиск строки в хеш-таблице свойств объекта. В обычных формах документов это незаметно, но в циклах на сотни тысяч итераций разница может стать существенной. Поэтому используйте динамическое обращение только там, где это действительно необходимо для сокращения кода.

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

← На главную