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