Как получить предопределенные элементы конфигурации и их свойства в 1С?

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

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

Ограничения платформы: что доступно через метаданные

Разберем поведение платформы «1С:Предприятие 8.3». Для получения списка предопределенных элементов объекта метаданных предусмотрен специализированный метод менеджера:


ИменаПредопределенных = Метаданные.Справочники.Номенклатура.ПолучитьИменаПредопределенных();
Для Каждого ИмяЭлемента Из ИменаПредопределенных Цикл
    Сообщить(ИмяЭлемента);
КонецЦикла;

Этот метод возвращает фиксированный массив строковых идентификаторов — значений свойства ИмяПредопределенныхДанных. Однако здесь разработчики сталкиваются с принципиальным ограничением архитектуры 1С:

Во встроенном языке режима «1С:Предприятие» невозможно прочитать значения стандартных реквизитов (таких как Код, Наименование, Родитель, ЭтоГруппа), заданных предопределенному элементу в дереве метаданных конфигуратора, если этот элемент еще не создан физически в таблицах базы данных.

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

Почему элементов может не хватать в информационной базе

Проанализируем типовые ситуации, при которых предопределенный элемент описан в конфигурации, но физически отсутствует в таблице справочника базы данных:

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

Способ 1. Принудительное создание элементов платформой

Если задача заключается не просто в чтении строк, а в том, чтобы недостающие предопределенные элементы корректно заполнились в базе данных с исходными кодами и наименованиями из конфигуратора, проверим и переключим режим обновления предопределенных данных.

Посмотрим на пример кода, который активирует автоматическое создание элементов для конкретного справочника:


Менеджер = Справочники.Номенклатура;
Если Менеджер.ПолучитьОбновлениеПредопределенныхДанных() <> ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически Тогда
    Менеджер.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
КонецЕсли;

Также можно управлять обновлением на уровне всей конфигурации с помощью глобальных методов ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы() и УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(). После включения этого режима при следующем обновлении конфигурации базы данных платформа автоматически создаст недостающие записи с проектными значениями наименований и кодов.

Способ 2. Выгрузка конфигурации в XML-файлы и парсинг

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

Разберем этот процесс по шагам:

  1. Выполним выгрузку конфигурации в файлы через пакетный режим запуска конфигуратора с параметром /DumpConfigToFiles <КаталогВыгрузки>.
  2. Найдем XML-файл с описанием нужного справочника в каталоге выгрузки (например, Catalogs/Номенклатура.xml).
  3. Выполним синтаксический анализ структуры XML. Внутри секции <Predefined> хранятся все заданные разработчиком свойства: наименование, код, иерархическая подчиненность и признак группы.

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

Способ 3. Ручное связывание элементов в коде

Если элемент в базе данных отсутствует, но нам известно его системное имя из ПолучитьИменаПредопределенных(), мы можем воссоздать его программно. Для этого присвоим значение стандартному реквизиту ИмяПредопределенныхДанных:


НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Основная группа товаров";
НовыйЭлемент.ИмяПредопределенныхДанных = "ОсновнаяГруппаТоваров";
НовыйЭлемент.Записать();

После записи элемент немедленно получит признак предопределенного, и к нему можно будет обращаться через точку в коде: Справочники.Номенклатура.ОсновнаяГруппаТоваров.

Способ 4. Архитектурный подход на базе БСП

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

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

← На главную