При разработке функционала в расширениях конфигурации разработчики часто сталкиваются с необходимостью добавить собственный справочник и наполнить его системными, предопределенными элементами. Однако в процессе настройки в дереве метаданных пункт меню Предопределенные данные может отсутствовать, либо в открывшемся окне платформа разрешает создавать только группы, блокируя добавление обычных элементов. При попытке обойти это ограничение или удалить некорректно созданные объекты система может выдавать критические ошибки вида Запись не найдена в менеджере имен базы данных или Тип не определен, приводя к падению конфигуратора. Разберем подробно, почему так происходит и какие существуют пути решения данной проблемы.
Проанализируем ключевые факторы, приводящие к некорректной работе механизма:
8.3.11. В ранних релизах этой ветки работа с кэшем метаданных и менеджером имен базы данных для расширений содержала ошибки, из-за которых создание предопределенных данных для добавленных объектов блокировалось либо приводило к сбоям СУБД. Стабильная работа механизма дорабатывалась в последующих обновлениях платформы.Структура таблицы расширена при выключенном разделении.Разберем основной и самый надежный способ решения проблемы. Если в используемом релизе платформы (например, в ранних сборках 8.3.11) наблюдается сбой при открытии формы редактирования предопределенных данных собственного справочника, необходимо выполнить обновление платформы на более стабильный релиз той же ветки или выше.
В более свежих сборках платформы ошибки сопоставления типов метаданных устранены, и создание предопределенных элементов для собственных справочников расширения выполняется штатно через окно редактирования объекта на вкладке Прочее.
Если обновление платформы в текущий момент невозможно, рассмотрим программный способ привязки предопределенного имени к существующему элементу. В объектной модели 1С свойство ИмяПредопределенныхДанных доступно для записи только у объекта справочника (СправочникОбъект), тогда как у ссылки (СправочникСсылка) оно доступно только для чтения.
Посмотрим на пример кода, с помощью которого можно назначить элементу имя предопределенного объекта:
ОбъектСправочника = ЭлементСсылка.ПолучитьОбъект();
ОбъектСправочника.ИмяПредопределенныхДанных = "ОсновнойЭлемент";
ОбъектСправочника.Записать();
После записи к такому элементу можно обращаться в коде привычным способом через точку: Справочники.ИмяСправочника.ОсновнойЭлемент. Если ранее была ошибочно создана предопределенная группа, сначала необходимо очистить свойство ИмяПредопределенныхДанных у этой группы, присвоив ему пустую строку.
Выясним, как спроектировать архитектуру расширения без использования механизма предопределенных данных:
В обработчике инициализации расширения или при первом запуске программно создается элемент с фиксированным GUID. В дальнейшем обращение к нему выполняется по ссылке:
Идентификатор = Новый УникальныйИдентификатор("11111111-2222-3333-4444-555555555555");
СсылкаНаЭлемент = Справочники.ИмяСправочника.ПолучитьСсылку(Идентификатор);
Если Не ЗначениеЗаполнено(СсылкаНаЭлемент.Наименование) Тогда
Объект = Справочники.ИмяСправочника.СоздатьЭлемент();
Объект.УстановитьСсылкуНового(СсылкаНаЭлемент);
Объект.Наименование = "Служебный элемент";
Объект.Записать();
КонецЕсли;
В расширение добавляется константа или непериодический регистр сведений. Созданный при установке расширения элемент записывается в константу, откуда алгоритмы всегда могут безопасно прочитать актуальную ссылку без жесткой привязки к имени метаданных.
Если набор значений строго фиксирован, не должен дополняться пользователями в режиме предприятия и не требует сложных табличных частей, справочник в расширении целесообразно заменить на Перечисление.
Если в процессе экспериментов с предопределенными данными конфигуратор стал аварийно завершать работу или выдавать системные ошибки типов, разберем порядок восстановления базы:
1cv8.exe DESIGNER /IBConnectionString "..." /DeleteCfgExtension "ИмяРасширения"
/ЗапуститьОбновлениеИнформационнойБазы для корректной инициализации кэша предопределенных значений. Свойство ОбновлениеПредопределенныхДанных у справочников должно находиться в значении Авто.