Как получить значение реквизита справочника 1С по его строковому наименованию?

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

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

Способ 1: Использование индексации коллекции объекта

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

Допустим, у нас есть переменная ИмяРеквизита, содержащая строку «ИНН», и переменная Спр, которая является ссылкой или объектом справочника. Реализуем получение значения следующим образом:


ИмяРеквизита = \"ИНН\";
// Получаем объект из ссылки, если у нас только ссылка
ОбъектСправочника = Спр.ПолучитьОбъект();
// Обращаемся к реквизиту динамически
Значение = ОбъектСправочника[ИмяРеквизита];
Сообщить(Значение);

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

Способ 2: Использование стандартной библиотеки подсистем (БСП)

Если вы работаете в конфигурации, где подключена Библиотека Стандартных Подсистем (БСП), рекомендуется использовать типовой метод ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Это «более правильный» подход, так как он стандартизирует получение данных и часто включает в себя дополнительные проверки и механизмы оптимизации.

Разберем, как его использовать:


// Передаем ссылку на объект и имя реквизита в виде строки
ИмяРеквизита = \"Срок\";
Значение = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Спр, ИмяРеквизита);
Сообщить(Значение);

Преимущество данного подхода заключается в том, что функция ОбщегоНазначения.ЗначениеРеквизитаОбъекта корректно работает со ссылками, выполняя обращение к базе данных максимально эффективно. Это позволяет не тратить ресурсы на получение полноценного объекта методом ПолучитьОбъект(), если вам нужно только прочитать одно или несколько значений.

Важные рекомендации по работе с объектами

При выполнении подобных задач важно учитывать несколько технических нюансов:

  1. Различие между Ссылкой и Объектом: Если вам нужно только прочитать данные, используйте СправочникСсылка. Если необходимо изменить значение реквизита и записать его, обязательно используйте СправочникОбъект, полученный методом ПолучитьОбъект().
  2. Не используйте методы 7.7: В современных конфигурациях управляемых форм не используйте конструкцию СоздатьОбъект(\"Справочник...\") и метод ПолучитьАтрибут(). Эти команды относились к устаревшей версии 7.7. В платформе 8.3 для создания элементов используйте менеджеры справочников, например: Справочники.ДоговорыКонтрагентов.СоздатьЭлемент().
  3. Динамическая проверка: Если имена реквизитов могут меняться или вы работаете с разными типами справочников, используйте Метаданные для проверки наличия реквизита у объекта перед обращением к нему. Это поможет избежать критических ошибок при выполнении кода.

Подводя итог, можно сказать, что выбор способа зависит от вашей задачи: если нужно быстро прочитать значение, используйте квадратные скобки Спр[ИмяРеквизита], а если вы стремитесь к стандартизированному коду в рамках типовой конфигурации — используйте методы БСП.

← На главную