В процессе разработки и администрирования баз данных «1С:Предприятие» нередко возникает задача анализа предопределенных элементов: необходимо сверить состав справочника, выявить отсутствующие в информационной базе элементы конфигурации или получить их предопределенные параметры — код, наименование, признак группы или родителя. Рассмотрим, какими возможностями обладает разработчик во встроенном языке, с какими ограничениями платформы придется столкнуться и какие существуют практические способы решения этой задачи.
Разберем поведение платформы «1С:Предприятие 8.3». Для получения списка предопределенных элементов объекта метаданных предусмотрен специализированный метод менеджера:
ИменаПредопределенных = Метаданные.Справочники.Номенклатура.ПолучитьИменаПредопределенных();
Для Каждого ИмяЭлемента Из ИменаПредопределенных Цикл
Сообщить(ИмяЭлемента);
КонецЦикла;
Этот метод возвращает фиксированный массив строковых идентификаторов — значений свойства ИмяПредопределенныхДанных. Однако здесь разработчики сталкиваются с принципиальным ограничением архитектуры 1С:
Во встроенном языке режима «1С:Предприятие» невозможно прочитать значения стандартных реквизитов (таких как Код, Наименование, Родитель, ЭтоГруппа), заданных предопределенному элементу в дереве метаданных конфигуратора, если этот элемент еще не создан физически в таблицах базы данных.
Платформа хранит описание этих реквизитов внутри бинарной структуры конфигурации и использует их исключительно в момент генерации новой записи в информационной базе. Объектная модель метаданных не предоставляет свойств для прямого чтения этих реквизитов через точку.
Проанализируем типовые ситуации, при которых предопределенный элемент описан в конфигурации, но физически отсутствует в таблице справочника базы данных:
НеОбновлятьАвтоматически. В этом случае платформа при реструктуризации базы игнорирует создание новых предопределенных записей.ИмяПредопределенныхДанных доступен для программной перезаписи или очистки. Если администратор или обработка очистили этот реквизит, связь между записью базы данных и метаданными разрывается: элемент становится обычным, а в конфигурации имя числится свободным.Если задача заключается не просто в чтении строк, а в том, чтобы недостающие предопределенные элементы корректно заполнились в базе данных с исходными кодами и наименованиями из конфигуратора, проверим и переключим режим обновления предопределенных данных.
Посмотрим на пример кода, который активирует автоматическое создание элементов для конкретного справочника:
Менеджер = Справочники.Номенклатура;
Если Менеджер.ПолучитьОбновлениеПредопределенныхДанных() <> ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически Тогда
Менеджер.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
КонецЕсли;
Также можно управлять обновлением на уровне всей конфигурации с помощью глобальных методов ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы() и УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(). После включения этого режима при следующем обновлении конфигурации базы данных платформа автоматически создаст недостающие записи с проектными значениями наименований и кодов.
Если требуется именно прочитать проектные свойства предопределенных элементов (например, для отчета или внешнего аудита конфигурации) без изменения данных в базе, единственным точным решением является разбор файлов выгрузки конфигурации.
Разберем этот процесс по шагам:
/DumpConfigToFiles <КаталогВыгрузки>.Catalogs/Номенклатура.xml).<Predefined> хранятся все заданные разработчиком свойства: наименование, код, иерархическая подчиненность и признак группы.Этот способ позволяет гарантированно извлечь любые скрытые метаданные конфигурации программным путем.
Если элемент в базе данных отсутствует, но нам известно его системное имя из ПолучитьИменаПредопределенных(), мы можем воссоздать его программно. Для этого присвоим значение стандартному реквизиту ИмяПредопределенныхДанных:
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Основная группа товаров";
НовыйЭлемент.ИмяПредопределенныхДанных = "ОсновнаяГруппаТоваров";
НовыйЭлемент.Записать();
После записи элемент немедленно получит признак предопределенного, и к нему можно будет обращаться через точку в коде: Справочники.Номенклатура.ОсновнаяГруппаТоваров.
Чтобы избежать зависимости от закрытых свойств конфигурации, в современных конфигурациях на базе «Библиотеки стандартных подсистем» (БСП) начальные данные принято описывать программно в модулях менеджеров объектов (например, в обработчиках начального заполнения).
В этом случае в коде модуля создается таблица или структура, где явно прописаны имя предопределенного элемента, его требуемый код и рабочее наименование. Такой подход делает код самодокументируемым и позволяет в любой момент получить свойства элементов стандартными средствами встроенного языка без обращения к файловой выгрузке метаданных.