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

Программист 1С v7.7 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

Получение списка реквизитов через метаданные

Если нам нужно просто узнать структуру справочника, то есть получить список всех полей, определенных в Конфигураторе, мы должны обратиться к объекту Метаданные. Это позволяет автоматизировать создание отчетов или выгрузку данных.

Рассмотрим пример кода, который выводит в окно сообщений идентификаторы всех реквизитов заданного справочника:


СпрКонтрагенты = Метаданные.Справочник("Контрагенты");

Для Ном = 1 По СпрКонтрагенты.Реквизит() Цикл
    Сообщить("Имя реквизита: " + СпрКонтрагенты.Реквизит(Ном).Идентификатор);
КонецЦикла;

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

Нюанс реквизитов неопределенного вида

Часто разработчики сталкиваются с проблемой: реквизит справочника имеет тип Справочник, но без указания конкретного вида (например, поле «ЮрФизЛицо» в ТиС 9.2). В этом случае система на этапе метаданных не может сказать, какие именно поля содержатся внутри, так как структура зависит от выбранного конкретного справочника.

Важно понимать следующее:

  1. Метаданные описывают структуру самого справочника-контейнера, а не структуру того объекта, на который ссылается неопределенный реквизит.
  2. Для того чтобы «заглянуть» внутрь такого реквизита, сначала необходимо определить, какой именно справочник в нем сейчас выбран. Для этого используем метод Вид() у значения реквизита.
  3. Как только мы определили тип, мы можем обратиться к Метаданные.Справочник(ИмяСправочника) и перебрать его реквизиты, как показано в примере выше.

Динамический доступ к значениям реквизитов

Если наша задача — не просто получить список имен, а считать значение поля, имя которого мы получили в строковой переменной, на помощь приходит метод ПолучитьАтрибут().

Рассмотрим пример, как реализовать универсальный цикл по объекту, если нам известен список имен реквизитов:


// Предположим, у нас есть список имен реквизитов в массиве или строке
// Объект справочника уже позиционирован на нужной записи
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.НайтиПоКоду("00001");

// Имя реквизита, полученное из метаданных или другого источника
ИмяПоля = "Наименование";

// Получение значения динамически
Значение = Спр.ПолучитьАтрибут(ИмяПоля);
Сообщить("Значение поля " + ИмяПоля + " равно " + Значение);

Метод ПолучитьАтрибут() является «секретным оружием» разработчика 1С 7.7 для создания гибких алгоритмов. Он позволяет передать строку, содержащую имя реквизита, и получить его значение так же, как если бы мы обратились через точку: Спр.Наименование.

Заключение и рекомендации

Работа с динамическими структурами в 1С 7.7 требует четкого разделения между Метаданными (описанием структуры) и Объектами (данными). Мы выяснили, что:

Помните, что платформа 1С 7.7 не поддерживает итераторы коллекций «из коробки» так, как это реализовано в современных языках, поэтому использование счетчиков цикла Для...Цикл в связке с методами метаданных является единственным верным и надежным способом решения поставленной задачи.

← На главную