Разработка и Конфигурация · 11 мин
Как получить список реквизитов справочника в 1С
Способы получить список реквизитов справочника в 1С: через метаданные, запрос, консоль кода и конфигуратор. Примеры кода, типичные ошибки и FAQ.
Задача получить список реквизитов справочника возникает регулярно: при написании универсальных обработок обмена, при формировании динамических отчётов, при проверке заполнения данных или при выгрузке структуры конфигурации для анализа. В 1С есть несколько рабочих способов решить её — через объект метаданных, через запрос к таблице справочника и через инструменты конфигуратора.
Выбор способа зависит от контекста. Если нужен программный перебор реквизитов в коде — используется коллекция Метаданные.Справочники.ИмяСправочника.Реквизиты. Если нужно быстро посмотреть состав полей без программирования — достаточно конфигуратора или консоли запросов. Для произвольного справочника, имя которого заранее неизвестно, применяется обращение к метаданным через объект или ссылку.
Ниже разобраны все основные варианты с примерами кода, ограничениями каждого подхода и типичными ошибками, которые приводят к неполным или неверным результатам.
Получение реквизитов через метаданные по имени справочника
Основной способ — обращение к дереву метаданных конфигурации. Каждый справочник в дереве имеет коллекцию Реквизиты, элементы которой описывают имя, тип, синоним и другие свойства каждого реквизита.
МетаСправочник = Метаданные.Справочники.Номенклатура;
Для Каждого Реквизит Из МетаСправочник.Реквизиты Цикл
Сообщить(Реквизит.Имя + " — " + Строка(Реквизит.Тип));
КонецЦикла;
Цикл выведет только пользовательские реквизиты, добавленные разработчиком конфигурации. Стандартные реквизиты (Код, Наименование, Ссылка, Владелец, Родитель, ПометкаУдаления и другие) в эту коллекцию не входят — они хранятся в отдельной коллекции СтандартныеРеквизиты.
Если имя справочника хранится в переменной строкой, обращение выполняется через квадратные скобки:
ИмяСпр = "Контрагенты";
МетаСпр = Метаданные.Справочники[ИмяСпр];
КоличествоРеквизитов = МетаСпр.Реквизиты.Количество();
Перед таким обращением полезно проверить существование справочника через Метаданные.Справочники.Найти(ИмяСпр) — иначе при опечатке в имени код выдаст ошибку обращения к несуществующему индексу коллекции.
Для Каждого Реквизит Из Метаданные.Справочники[ИмяСправочника].Реквизиты Цикл
Сообщить(Реквизит.Имя + " : " + Строка(Реквизит.Тип));
КонецЦикла;Получение реквизитов по ссылке или объекту справочника
Когда в коде есть только ссылка на элемент справочника, а имя самого справочника заранее неизвестно, метаданные получают через метод Метаданные(). Это типичный сценарий для универсальных обработок, работающих с любыми объектами.
МетаОбъект = СсылкаНаЭлемент.Метаданные();
Для Каждого Реквизит Из МетаОбъект.Реквизиты Цикл
Значение = СсылкаНаЭлемент[Реквизит.Имя];
Сообщить(Реквизит.Имя + " = " + Значение);
КонецЦикла;
Такой подход позволяет одновременно прочитать и значения реквизитов конкретного элемента — обращением по имени через квадратные скобки. Это удобно для выгрузки данных в произвольную структуру, JSON или таблицу значений.
Учтите, что чтение значений реквизитов через ссылку выполняется обращением к базе данных. При переборе большого количества элементов в цикле это создаёт нагрузку — для массовой обработки эффективнее запрос, где нужные поля выбираются одним обращением.
Стандартные и пользовательские реквизиты: в чём разница
Частая причина «неполного» списка — разработчик перебирает только коллекцию Реквизиты и не видит Код, Наименование и другие системные поля. Эти поля являются стандартными реквизитами и хранятся отдельно.
МетаСпр = Метаданные.Справочники.Номенклатура;
// Стандартные реквизиты
Для Каждого СтдРеквизит Из МетаСпр.СтандартныеРеквизиты Цикл
Сообщить("Стандартный: " + СтдРеквизит.Имя);
КонецЦикла;
// Пользовательские реквизиты
Для Каждого Реквизит Из МетаСпр.Реквизиты Цикл
Сообщить("Пользовательский: " + Реквизит.Имя);
КонецЦикла;
Состав стандартных реквизитов зависит от настроек справочника. Например, реквизит Владелец присутствует только у подчинённых справочников, Родитель — только у иерархических. Если справочник не иерархический, обращение к полю «Родитель» в запросе вызовет ошибку.
Код, Наименование, Ссылка, ПометкаУдаления, Предопределенный, а также Владелец и Родитель — если включены подчинение и иерархия
Создаются разработчиком в конфигураторе; коллекция может быть пустой
Имеют собственные коллекции реквизитов внутри каждой табличной части
Получение реквизитов табличных частей
Табличные части справочника имеют собственные реквизиты, которые в общую коллекцию Реквизиты не входят. Для их перебора нужно сначала получить коллекцию табличных частей, затем — реквизиты каждой из них.
МетаСпр = Метаданные.Справочники.Номенклатура;
Для Каждого ТабЧасть Из МетаСпр.ТабличныеЧасти Цикл
Сообщить("Табличная часть: " + ТабЧасть.Имя);
Для Каждого РеквизитТЧ Из ТабЧасть.Реквизиты Цикл
Сообщить(" " + РеквизитТЧ.Имя + " : " + Строка(РеквизитТЧ.Тип));
КонецЦикла;
КонецЦикла;
Этот приём нужен при построении универсальных выгрузок: если про табличные части забыть, выгрузка элемента окажется неполной, и данные (например, дополнительные единицы измерения или контактные данные) потеряются при переносе.
Просмотр реквизитов без программирования
Если требуется просто посмотреть состав полей, писать код не обязательно. Есть несколько штатных путей.
В конфигураторе откройте дерево конфигурации, найдите ветку «Справочники», разверните нужный объект — реквизиты, табличные части и их состав видны прямо в дереве. Двойной щелчок по реквизиту открывает палитру свойств с типом, длиной и признаками обязательности.
В режиме предприятия структуру можно посмотреть через консоль запросов (в типовых конфигурациях — через «Все функции» → обработки разработчика, если они включены): достаточно написать запрос ВЫБРАТЬ * ИЗ Справочник.Номенклатура — конструктор покажет все доступные поля таблицы, включая стандартные.
Сравнение способов
Подходит для универсальных обработок и выгрузок; требует прав на выполнение кода
Быстрый визуальный просмотр; недоступен пользователям без прав разработчика
Показывает поля таблицы включая стандартные; не отображает свойства типа длины и обязательности
Единственный вариант, когда имя справочника заранее неизвестно
Формирование полного списка с типами и свойствами
На практике часто нужен не просто перечень имён, а таблица «имя — тип — синоним», например для документирования структуры или сопоставления при обмене. Удобно собрать её в таблицу значений.
ТаблицаРеквизитов = Новый ТаблицаЗначений;
ТаблицаРеквизитов.Колонки.Добавить("Имя");
ТаблицаРеквизитов.Колонки.Добавить("Синоним");
ТаблицаРеквизитов.Колонки.Добавить("Тип");
МетаСпр = Метаданные.Справочники.Номенклатура;
Для Каждого Реквизит Из МетаСпр.Реквизиты Цикл
Строка = ТаблицаРеквизитов.Добавить();
Строка.Имя = Реквизит.Имя;
Строка.Синоним = Реквизит.Синоним;
Строка.Тип = Строка(Реквизит.Тип);
КонецЦикла;
Объект «ОписаниеТипов» реквизита позволяет копнуть глубже: метод Типы() возвращает массив типов (важно для составных реквизитов), а квалификаторы содержат длину строки или точность числа. Для проверки, является ли реквизит ссылочным, используют проверку типа через ТипЗнч или анализ содержимого описания типов.
- 1Определите справочник: по известному имени или через Ссылка.Метаданные()
- 2Переберите коллекцию СтандартныеРеквизиты для системных полей
- 3Переберите коллекцию Реквизиты для пользовательских полей
- 4При необходимости переберите ТабличныеЧасти и их реквизиты
- 5Сохраните результат в таблицу значений или структуру и проверьте полноту
Типичные ошибки и ограничения
Первая ошибка — ожидание стандартных полей в коллекции Реквизиты. Код и Наименование там отсутствуют по замыслу платформы, и «потерянные» поля нужно искать в СтандартныеРеквизиты.
Вторая ошибка — обращение к метаданным несуществующего объекта без проверки. Вызов Метаданные.Справочники[Имя] с неверным именем завершится исключением; безопасный вариант — предварительный Найти() с проверкой на Неопределено.
Третья ошибка — игнорирование прав доступа. В режиме предприятия чтение метаданных обычно доступно, но чтение значений реквизитов элементов может быть ограничено RLS или правами на объект. Универсальная обработка, работающая под администратором, может у пользователя с ограниченными правами вернуть пустые значения.
Наконец, в управляемых формах на клиенте обращение к Метаданные недоступно — это серверный контекст. Код получения реквизитов размещайте в серверной процедуре модуля формы или в общем серверном модуле.
Как проверить результат
В списке есть и стандартные (Код, Наименование), и пользовательские реквизиты
Отсутствуют системные поля — перебрана только коллекция Реквизиты
Для каждой табличной части выведены её реквизиты
Табличные части отсутствуют, хотя в конфигураторе они есть
Код корректно отрабатывает для любого справочника
Ошибка на справочниках без иерархии или владельцев
Часто задаваемые вопросы
Как получить список реквизитов всех справочников конфигурации сразу?
Переберите коллекцию Метаданные.Справочники внешним циклом, а внутри — коллекции Реквизиты каждого справочника. Результат удобно складывать в таблицу значений с колонками «Справочник», «Реквизит», «Тип» — так получается полная карта структуры данных конфигурации.
Можно ли получить реквизиты справочника запросом?
Запрос возвращает значения полей конкретных элементов, а не описание метаданных. Но консоль запросов с конструктором показывает все доступные поля таблицы справочника, включая стандартные — это быстрый способ посмотреть состав без кода. Программно список имён полей можно извлечь из текста построителя запроса, но проще использовать метаданные.
Почему в коллекции Реквизиты нет полей Код и Наименование?
Это стандартные реквизиты, которые платформа создаёт автоматически. Они хранятся в отдельной коллекции СтандартныеРеквизиты объекта метаданных. Для полного списка перебирайте обе коллекции.
Как узнать тип конкретного реквизита — строка это или ссылка?
Свойство Реквизит.Тип возвращает объект ОписаниеТипов. Вызов Реквизит.Тип.Типы() даёт массив типов; если в нём один элемент и это ссылочный тип, реквизит ссылочный. Для составных реквизитов массив содержит несколько типов.
Доступны ли метаданные на клиенте в управляемом приложении?
Нет, объект Метаданные доступен только на сервере. В управляемой форме получение списка реквизитов оформляют серверной процедурой, которая возвращает результат на клиент в виде массива структур или таблицы значений.
Как получить реквизиты, если известно только имя справочника строкой?
Используйте обращение по строковому индексу: Метаданные.Справочники[ИмяСтрокой].Реквизиты. Перед этим проверьте существование объекта через Метаданные.Справочники.Найти(ИмяСтрокой) — метод вернёт Неопределено, если такого справочника в конфигурации нет.
Что важно запомнить
Пользовательские реквизиты перебираются через Метаданные.Справочники[Имя].Реквизиты, стандартные — через СтандартныеРеквизиты, реквизиты табличных частей — отдельно. Для произвольной ссылки используйте Ссылка.Метаданные(). Код с метаданными выполняйте на сервере и проверяйте существование объектов методом Найти().