К статье
Практический материал

Справочники и Данные · 10 мин

Как получить список справочников в 1С

Как программно и вручную получить список справочников 1С: через метаданные, запрос, консоль кода и конфигуратор. Примеры кода, проверки и типичные ошибки.

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

Выбор способа зависит от цели. Если нужен перечень видов справочников (Номенклатура, Контрагенты, Склады и т.д.) — работают метаданные или конфигуратор. Если нужен список элементов конкретного справочника — используется запрос или менеджер объекта. Эти задачи часто путают, поэтому ниже они разведены по отдельным разделам.

Все примеры приведены для управляемого приложения на встроенном языке 1С:Предприятие 8.3. Код выполняется на сервере или в толстом клиенте; в тонком клиенте обращение к метаданным также доступно, но с ограничениями по контексту.

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

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

bsl
Для Каждого Справочник Из Метаданные.Справочники Цикл
    Сообщить(Справочник.Имя + " — " + Справочник.Синоним);
КонецЦикла;

Цикл перебирает все объекты коллекции. Свойство Имя возвращает имя, заданное в конфигураторе (латиницей или кириллицей, без пробелов), а Синоним — представление для пользователя. Если синоним не заполнен, платформа автоматически формирует его из имени, разделяя слова по заглавным буквам.

Для подсчёта количества справочников используется метод Метаданные.Справочники.Количество(), а доступ по индексу — Метаданные.Справочники.Получить(Индекс). Поиск по имени выполняется через Метаданные.Справочники.Найти("Номенклатура"): если справочник с таким именем не найден, метод вернёт Неопределено, что удобно для проверки существования объекта перед обращением к нему.

Какие свойства справочника можно прочитать из метаданных

Объект метаданных справочника даёт больше, чем просто имя. Из него извлекаются характеристики, которые нужны при построении универсальных механизмов: признак иерархии, вид иерархии (групп и элементов или только элементов), подчинённость владельцу, длина кода и наименования, состав реквизитов и табличных частей.

bsl
Спр = Метаданные.Справочники.Найти("Номенклатура");
Если Спр <> Неопределено Тогда
    Сообщить("Иерархический: " + Спр.Иерархический);
    Сообщить("Длина наименования: " + Спр.ДлинаНаименования);
    Для Каждого Реквизит Из Спр.Реквизиты Цикл
        Сообщить("Реквизит: " + Реквизит.Имя);
    КонецЦикла;
КонецЕсли;

Обращение к несуществующему свойству или попытка прочитать реквизиты у объекта, полученного без проверки на Неопределено, — частая причина ошибок времени выполнения. Всегда проверяйте результат метода Найти() перед дальнейшей работой.

Получение списка элементов конкретного справочника

Когда известен вид справочника и нужны его элементы, применяется запрос или метод Выбрать(). Запрос предпочтительнее: он выполняется на сервере СУБД, позволяет отбирать только нужные поля и накладывать отборы, не вычитывая всю таблицу.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка КАК Ссылка,
| Спр.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Спр
|ГДЕ
| НЕ Спр.ПометкаУдаления
|УПОРЯДОЧИТЬ ПО
| Наименование";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

Альтернатива без запроса — Справочники.Номенклатура.Выбрать(). Метод возвращает выборку, которую перебирают циклом Пока Выборка.Следующий() Цикл. В параметрах можно передать родителя и владельца для отбора, а также отбор по реквизитам. Однако сложные условия и сортировки удобнее реализовывать запросом.

Просмотр списка справочников без программирования

Если программировать не требуется, перечень видов справочников виден прямо в конфигураторе. Откройте конфигурацию через меню «Конфигурация — Открыть конфигурацию» и разверните ветку «Справочники» в дереве объектов. Двойной щелчок по объекту открывает его свойства, вкладки «Данные», «Иерархия», «Владельцы» показывают структуру.

В пользовательском режиме 1С:Предприятия перечень доступных справочников обычно находится в разделе «НСИ и администрирование» или «Справочники» — состав зависит от конфигурации и прав пользователя. Здесь видны только те виды, к которым у пользователя есть права просмотра, поэтому список в режиме предприятия может быть уже, чем в конфигураторе.

Для разработчиков и внедренцев удобна внешняя обработка «Консоль кода» или аналогичные инструменты: они позволяют выполнить произвольный фрагмент кода, включая перебор метаданных, прямо в режиме предприятия без изменения конфигурации. Это безопасный путь, если обработка не записывает данные, а только читает структуру.

Сравнение способов

Метаданные.Справочники

Даёт перечень видов справочников и их свойства в коде. Подходит для универсальных обработок, но не возвращает сами данные.

Запрос к Справочник.Имя

Возвращает элементы конкретного справочника с отборами и сортировкой. Требует знания имени справочника.

Конфигуратор

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

Консоль кода в режиме предприятия

Выполнение произвольного кода без изменения конфигурации. Нужно аккуратно переносить внешние обработки в базу.

Как проверить, что список получен корректно

После выполнения кода полезно сверить результат с эталоном. Самый надёжный эталон — дерево конфигурации: количество объектов в ветке «Справочники» должно совпадать с Метаданные.Справочники.Количество(). Расхождение обычно означает, что код выполняется не в той базе или конфигурация базы данных отличается от конфигурации поставщика.

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

Контрольные точки

Как проверить результат

Количество видов справочников
Норма

Совпадает с числом объектов в ветке «Справочники» конфигуратора

Тревожный признак

Меньше ожидаемого — проверьте, в той ли базе выполняется код

Выборка элементов
Норма

Число строк совпадает с количеством элементов в режиме предприятия при тех же отборах

Тревожный признак

Строк меньше — проверьте пометки удаления, отборы и ограничения прав

Поиск по имени через Найти()
Норма

Возвращается объект метаданных, свойства читаются без ошибок

Тревожный признак

Возвращено Неопределено — имя указано с ошибкой или объект отсутствует

Типичные ошибки и ограничения

Самая распространённая ошибка — попытка получить данные через метаданные. Конструкция вида Метаданные.Справочники.Номенклатура.Выбрать() не сработает: у объекта метаданных нет метода выборки. Менеджер справочника получается через глобальный контекст Справочники.Номенклатура, а не через коллекцию метаданных.

Вторая группа ошибок связана с именами. Имя справочника в коде должно точно совпадать с именем в конфигураторе, включая регистр-независимое написание, но без опечаток. Если обработка переносится между конфигурациями (например, между УТ и ERP), часть справочников может отсутствовать — поэтому универсальный код обязан проверять существование через Найти().

Типичные ошибки
01
Обращение к Справочники.Имя без проверки существования — в другой конфигурации код падает с ошибкой; используйте Метаданные.Справочники.Найти() перед обращением.
02
Выборка всех элементов без отбора пометки удаления — в результат попадают «мусорные» объекты; добавляйте условие НЕ ПометкаУдаления.
03
Смешение вида справочника и его элементов — метаданные дают структуру, запрос даёт данные; задачи требуют разных инструментов.
04
Игнорирование прав доступа — под пользователем с ограничениями выборка отличается от выборки под администратором, что принимают за ошибку кода.

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

Итог

Что важно запомнить

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

Частые вопросы

Как получить список справочников, отсортированный по синониму?

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

Можно ли получить список справочников в запросе?

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

Как узнать, есть ли в справочнике хотя бы один элемент?

Выполните запрос вида «ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Имя» и проверьте, пуст ли результат. Это быстрее, чем подсчёт всех записей через КОЛИЧЕСТВО, особенно на больших таблицах.

Почему Метаданные.Справочники.Найти() возвращает Неопределено?

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

Как получить список справочников, подчинённых конкретному владельцу?

Переберите Метаданные.Справочники и для каждого объекта проверьте коллекцию Владельцы: если в ней есть нужный справочник, объект подчинён ему. Например, у справочника договоров владельцем обычно выступает справочник контрагентов.