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

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

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

Постановка задачи

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

Метод 1: Использование квадратных скобок []

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


Параметр = "Индекс";
// Если Запись — это Структура или СтрокаТаблицыЗначений
Значение = Запись[Параметр];

Важное ограничение: этот метод работает не для всех типов объектов. Квадратные скобки поддерживаются в следующих случаях:

  1. Структуры и Соответствия.
  2. Строки таблицы значений и Строки дерева значений.
  3. Коллекция "Параметры" табличного документа.
  4. ДанныеФормыСтруктура (на стороне тонкого клиента).

Однако, как было замечено в обсуждении, для объектов типа РегистрСведенийМенеджерЗаписи или строк набора записей некоторых регистров такой способ может вызвать ошибку "Ожидается идентификатор". Это происходит потому, что платформа 1С не для всех объектов данных реализовала интерфейс обращения через квадратные скобки.

Метод 2: Использование функции Вычислить()

Если прямой доступ через [] не работает, можно воспользоваться встроенной функцией Вычислить(). Она позволяет выполнить произвольную строку кода как выражение и вернуть результат. Это именно то решение, которое помогло автору темы в сообщении 16.

Разберем пример реализации:


Параметр = "Индекс";
// Формируем строку вида "Запись.Индекс" и вычисляем ее
Значение = Вычислить("Запись." + Параметр);

Почему этот метод стоит использовать с осторожностью? Проанализируем недостатки:

  1. Производительность: Функция Вычислить() работает значительно медленнее, чем прямое обращение. Если этот код выполняется внутри цикла по тысячам записей, общее время работы программы заметно увеличится.
  2. Сложность отладки: Конфигуратор не может проверить синтаксическую корректность выражения внутри строки до момента выполнения.
  3. Безопасность: Использование Вычислить() на данных, введенных пользователем, потенциально опасно (хотя в контексте имен полей это редко является проблемой).

Метод 3: Использование функции ЗаполнитьЗначенияСвойств()

Существует элегантный и безопасный способ получить значение любого свойства, даже если объект не поддерживает квадратные скобки. Этот метод основан на использовании временной структуры.

Рассмотрим пошагово этот алгоритм:

  1. Создаем пустую Структуру.
  2. Используем функцию ЗаполнитьЗначенияСвойств(), указав в качестве источника наш объект, а в качестве приемника — структуру. В третьем параметре (список полей) передаем нашу переменную.
  3. Извлекаем значение из структуры по ключу.

Пример кода:


ВременнаяСтруктура = Новый Структура(Параметр); 
ЗаполнитьЗначенияСвойств(ВременнаяСтруктура, Запись, Параметр);
Значение = ВременнаяСтруктура[Параметр];

Этот метод считается более "чистым" с точки зрения стандартов разработки 1С, так как он избегает медленной компиляции выражений в Вычислить() и работает с любыми объектами, у которых есть открытые свойства (справочники, документы, записи регистров).

Метод 4: Динамическое заполнение параметров Табличного Документа

В исходном вопросе упоминалось заполнение областей табличного документа. Если ваша задача — вывести значение в параметр макета, имя которого совпадает с именем поля в выборке данных, то обращаться к самому объекту Запись динамически может и не потребоваться.

Можно использовать коллекцию Параметры конкретной области. Посмотрите на этот пример:


// ОбластьР — это область ячеек макета
// ПараметрСтрока — строковая переменная с именем параметра в макете
// Значение — данные, которые нужно записать

ОбластьР.Параметры[ПараметрСтрока] = Запись[ПараметрСтрока];

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

Выводы и рекомендации

Выясним, какой метод выбрать в зависимости от ситуации:

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

← На главную