В разработке на платформе 1С:Предприятие 7.7 часто возникает задача, аналогичная перебору ассоциативного массива в других языках программирования: как получить все поля записи справочника, не прописывая каждое имя реквизита вручную? Давайте разберем, как устроена работа с метаданными и почему доступ к динамическим типам данных требует особого подхода.
Если нам нужно просто узнать структуру справочника, то есть получить список всех полей, определенных в Конфигураторе, мы должны обратиться к объекту Метаданные. Это позволяет автоматизировать создание отчетов или выгрузку данных.
Рассмотрим пример кода, который выводит в окно сообщений идентификаторы всех реквизитов заданного справочника:
СпрКонтрагенты = Метаданные.Справочник("Контрагенты");
Для Ном = 1 По СпрКонтрагенты.Реквизит() Цикл
Сообщить("Имя реквизита: " + СпрКонтрагенты.Реквизит(Ном).Идентификатор);
КонецЦикла;
Здесь мы используем метод Реквизит() объекта Метаданные. Передавая в него порядковый номер, мы получаем доступ к объекту описания реквизита, у которого свойство Идентификатор возвращает имя этого поля в конфигурации.
Часто разработчики сталкиваются с проблемой: реквизит справочника имеет тип Справочник, но без указания конкретного вида (например, поле «ЮрФизЛицо» в ТиС 9.2). В этом случае система на этапе метаданных не может сказать, какие именно поля содержатся внутри, так как структура зависит от выбранного конкретного справочника.
Важно понимать следующее:
Вид() у значения реквизита.Метаданные.Справочник(ИмяСправочника) и перебрать его реквизиты, как показано в примере выше.Если наша задача — не просто получить список имен, а считать значение поля, имя которого мы получили в строковой переменной, на помощь приходит метод ПолучитьАтрибут().
Рассмотрим пример, как реализовать универсальный цикл по объекту, если нам известен список имен реквизитов:
// Предположим, у нас есть список имен реквизитов в массиве или строке
// Объект справочника уже позиционирован на нужной записи
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.НайтиПоКоду("00001");
// Имя реквизита, полученное из метаданных или другого источника
ИмяПоля = "Наименование";
// Получение значения динамически
Значение = Спр.ПолучитьАтрибут(ИмяПоля);
Сообщить("Значение поля " + ИмяПоля + " равно " + Значение);
Метод ПолучитьАтрибут() является «секретным оружием» разработчика 1С 7.7 для создания гибких алгоритмов. Он позволяет передать строку, содержащую имя реквизита, и получить его значение так же, как если бы мы обратились через точку: Спр.Наименование.
Работа с динамическими структурами в 1С 7.7 требует четкого разделения между Метаданными (описанием структуры) и Объектами (данными). Мы выяснили, что:
Метаданные.ПолучитьАтрибут().Вид() для идентификации, и только после этого приступать к разбору метаданных нужного справочника.Помните, что платформа 1С 7.7 не поддерживает итераторы коллекций «из коробки» так, как это реализовано в современных языках, поэтому использование счетчиков цикла Для...Цикл в связке с методами метаданных является единственным верным и надежным способом решения поставленной задачи.