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

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

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

Причины возникновения проблемы

Проанализируем ключевые факторы, приводящие к некорректной работе механизма:

  1. Ограничения и ошибки версий платформы: Возможность добавления собственных справочников и других объектов метаданных впервые появилась в ветке 8.3.11. В ранних релизах этой ветки работа с кэшем метаданных и менеджером имен базы данных для расширений содержала ошибки, из-за которых создание предопределенных данных для добавленных объектов блокировалось либо приводило к сбоям СУБД. Стабильная работа механизма дорабатывалась в последующих обновлениях платформы.
  2. Конфликт с механизмом разделения данных: При работе в конфигурациях с общими реквизитами-разделителями (типовые решения БСП, такие как ЗУП, ЗКГУ, ERP) добавление структуры таблиц через расширения накладывает строгие требования к сеансу работы и составу разделителей. Несоответствие настроек может вызывать ошибку Структура таблицы расширена при выключенном разделении.

Способ 1. Обновление версии платформы 1С:Предприятие

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

В более свежих сборках платформы ошибки сопоставления типов метаданных устранены, и создание предопределенных элементов для собственных справочников расширения выполняется штатно через окно редактирования объекта на вкладке Прочее.

Способ 2. Программная установка свойства ИмяПредопределенныхДанных

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

Посмотрим на пример кода, с помощью которого можно назначить элементу имя предопределенного объекта:


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

После записи к такому элементу можно обращаться в коде привычным способом через точку: Справочники.ИмяСправочника.ОсновнойЭлемент. Если ранее была ошибочно создана предопределенная группа, сначала необходимо очистить свойство ИмяПредопределенныхДанных у этой группы, присвоив ему пустую строку.

Способ 3. Альтернативные варианты реализации без предопределенных данных

Выясним, как спроектировать архитектуру расширения без использования механизма предопределенных данных:

  1. Создание элемента с фиксированным уникальным идентификатором (UUID):

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

    
    Идентификатор = Новый УникальныйИдентификатор("11111111-2222-3333-4444-555555555555");
    СсылкаНаЭлемент = Справочники.ИмяСправочника.ПолучитьСсылку(Идентификатор);
    
    Если Не ЗначениеЗаполнено(СсылкаНаЭлемент.Наименование) Тогда
        Объект = Справочники.ИмяСправочника.СоздатьЭлемент();
        Объект.УстановитьСсылкуНового(СсылкаНаЭлемент);
        Объект.Наименование = "Служебный элемент";
        Объект.Записать();
    КонецЕсли;
    
  2. Хранение ссылки в константе или регистре сведений:

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

  3. Замена справочника на перечисление:

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

Действия при аварийном сбое расширения и повреждении метаданных

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

  1. Удаление расширения в режиме предприятия: Откроем базу в режиме «1С:Предприятие» и перейдем в меню Функции для технического специалиста → Управление расширениями конфигурации, где удалим поврежденное расширение.
  2. Пакетное удаление: Запустим конфигуратор из командной строки с параметром: 1cv8.exe DESIGNER /IBConnectionString "..." /DeleteCfgExtension "ИмяРасширения"
  3. Синхронизация предопределенных данных: Запустим информационную базу с параметром /ЗапуститьОбновлениеИнформационнойБазы для корректной инициализации кэша предопределенных значений. Свойство ОбновлениеПредопределенныхДанных у справочников должно находиться в значении Авто.
← На главную