Как исправить ошибку «Предопределенный элемент отсутствует в данных» в 1С?

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

При обновлении конфигурации или запуске режима «1С:Предприятие» пользователи и разработчики могут столкнуться со сбоем выполнения обработчиков обновления. В журнале регистрации или в окне ошибки появляется сообщение вида: «ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Продукция. Предопределенный элемент отсутствует в данных».

Проанализируем ситуацию: платформа обращается к предопределенному элементу, который прописан в метаданных конфигуратора, но не может найти соответствующую запись с привязанным именем в самой таблице базы данных. Это происходит, если элемент был ранее удален, потерял связь с метаданными при некорректном обмене (например, в РИБ) или если в информационной базе было отключено автоматическое обновление предопределенных данных.

Анализ частых ошибок при попытке создать элемент вручную

Рассмотрим, почему простая попытка создать элемент через внешнюю обработку стандартным методом СоздатьЭлемент() не решает проблему:

  1. Отсутствие связи с метаданными. Вызов СоздатьЭлемент() создает обычный пользовательский элемент. Чтобы платформа распознала его как предопределенный, необходимо заполнить специальное свойство ИмяПредопределенныхДанных.
  2. Некорректная установка типа значения. В планах видов характеристик реквизит ТипЗначения имеет тип ОписаниеТипов. Присвоить ему напрямую пустую ссылку (например, Справочники.Номенклатура.ПустаяСсылка()) нельзя — платформа выдаст ошибку несоответствия типов.

Способ 1. Программное создание и связывание элемента через внешнюю обработку

Разберем по шагам правильный алгоритм восстановления элемента. Нам необходимо проверить, существует ли уже элемент с таким наименованием в базе данных. Если существует — мы получим его объект и установим ему имя предопределенного элемента. Если элемента нет — создадим новый, установим нужный тип значения и запишем объект.

Посмотрим на пример кода для серверной процедуры внешней обработки:


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

КонецПроцедуры

Способ 2. Восстановление через «Тестирование и исправление»

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

  1. Откроем информационную базу в режиме «Конфигуратор».
  2. Обязательно создадим резервную копию базы данных (выгрузка .dt или копирование файла 1Cv8.1CD).
  3. Перейдем в меню Администрирование — Тестирование и исправление...
  4. Установим флажок напротив пункта Проверка ссылочной целостности.
  5. В переключателях при наличии ссылок на несуществующие элементы выберем вариант Создавать объекты или Восстанавливать.
  6. Нажмем кнопку Выполнить и дождемся завершения процесса.

Способ 3. Вызов функции обновления БСП

В типовых конфигурациях, использующих Библиотеку Стандартных Подсистем (БСП), например в «1С:Бухгалтерия», присутствует встроенный механизм автоматического обновления предопределенных элементов. Для его запуска достаточно выполнить команду на сервере через внешнюю обработку или консоль кода:

ОбновлениеИнформационнойБазы.ЗаполнитьПредопределенныеЭлементы();

Этот метод автоматически проверит все справочники и планы видов характеристик на наличие недостающих предопределенных записей и восстановит их в структуре данных.

← На главную