При обновлении конфигурации или запуске режима «1С:Предприятие» пользователи и разработчики могут столкнуться со сбоем выполнения обработчиков обновления. В журнале регистрации или в окне ошибки появляется сообщение вида: «ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Продукция. Предопределенный элемент отсутствует в данных».
Проанализируем ситуацию: платформа обращается к предопределенному элементу, который прописан в метаданных конфигуратора, но не может найти соответствующую запись с привязанным именем в самой таблице базы данных. Это происходит, если элемент был ранее удален, потерял связь с метаданными при некорректном обмене (например, в РИБ) или если в информационной базе было отключено автоматическое обновление предопределенных данных.
Рассмотрим, почему простая попытка создать элемент через внешнюю обработку стандартным методом СоздатьЭлемент() не решает проблему:
СоздатьЭлемент() создает обычный пользовательский элемент. Чтобы платформа распознала его как предопределенный, необходимо заполнить специальное свойство ИмяПредопределенныхДанных.ТипЗначения имеет тип ОписаниеТипов. Присвоить ему напрямую пустую ссылку (например, Справочники.Номенклатура.ПустаяСсылка()) нельзя — платформа выдаст ошибку несоответствия типов.Разберем по шагам правильный алгоритм восстановления элемента. Нам необходимо проверить, существует ли уже элемент с таким наименованием в базе данных. Если существует — мы получим его объект и установим ему имя предопределенного элемента. Если элемента нет — создадим новый, установим нужный тип значения и запишем объект.
Посмотрим на пример кода для серверной процедуры внешней обработки:
&НаСервере
Процедура ВосстановитьПредопределенныйЭлемент()
ИмяИскомогоЭлемента = "Продукция";
// Ищем элемент среди существующих в базе по наименованию
СсылкаНаЭлемент = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию(ИмяИскомогоЭлемента);
Если ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда
ОбъектПВХ = СсылкаНаЭлемент.ПолучитьОбъект();
Иначе
ОбъектПВХ = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СоздатьЭлемент();
ОбъектПВХ.Наименование = ИмяИскомогоЭлемента;
КонецЕсли;
// 1. Устанавливаем связь с предопределенным элементом конфигурации
ОбъектПВХ.ИмяПредопределенныхДанных = ИмяИскомогоЭлемента;
// 2. Формируем описание типов для реквизита ТипЗначения
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
ОбъектПВХ.ТипЗначения = Новый ОписаниеТипов(МассивТипов);
// 3. Сохраняем изменения в базе данных
ОбъектПВХ.Записать();
КонецПроцедуры
Если нет возможности писать код во внешней обработке, можно воспользоваться штатным механизмом платформы в режимах конфигуратора. Выясним, как выполнить эту процедуру:
.dt или копирование файла 1Cv8.1CD).В типовых конфигурациях, использующих Библиотеку Стандартных Подсистем (БСП), например в «1С:Бухгалтерия», присутствует встроенный механизм автоматического обновления предопределенных элементов. Для его запуска достаточно выполнить команду на сервере через внешнюю обработку или консоль кода:
ОбновлениеИнформационнойБазы.ЗаполнитьПредопределенныеЭлементы();
Этот метод автоматически проверит все справочники и планы видов характеристик на наличие недостающих предопределенных записей и восстановит их в структуре данных.