Как исправить ошибку «Несоответствие типов» при обновлении 1С из-за отсутствия предопределенного элемента?

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

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

{ОбщийМодуль.ОбщегоНазначения.Модуль}: Ошибка при вызове метода контекста (Содержит) Возврат Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных); по причине: Несоответствие типов (параметр номер '1')

Разберем детально, почему возникает данная ситуация и какими способами можно восстановить корректную работу базы данных.

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

Способ 1. Включение автоматического обновления предопределенных данных

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


// Установка режима автообновления для всей информационной базы
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.Авто);

// Либо точечно для проблемного справочника
Справочники.РассылкиОтчетов.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.Авто);

После применения данного метода перезапустим информационную базу. Платформа самостоятельно сопоставит метаданные с таблицами и создаст недостающие системные записи.

Способ 2. Восстановление средствами Библиотеки стандартных подсистем

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

СтандартныеПодсистемыСервер.ВосстановитьПредопределенныеЭлементы();

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

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

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

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

// Пример привязки существующей группы
Объект = Справочники.РассылкиОтчетов.НайтиПоНаименованию("Личные рассылки").ПолучитьОбъект();
Если Объект <> Неопределено Тогда
    Объект.ИмяПредопределенныхДанных = "ЛичныеРассылки";
    Объект.Записать();
Иначе
    // Если элемента нет, создаем новую группу
    НоваяГруппа = Справочники.РассылкиОтчетов.СоздатьГруппу();
    НоваяГруппа.Наименование = "Личные рассылки";
    НоваяГруппа.ИмяПредопределенныхДанных = "ЛичныеРассылки";
    НоваяГруппа.Записать();
КонецЕсли;

Способ 4. Перенос данных из типовой демонстрационной базы

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

  1. Развернем чистую типовую или демонстрационную базу той же конфигурации.
  2. Откроем обработку ВыгрузкаЗагрузкаДанныхXML.epf в демонстрационной базе.
  3. Установим отбор по проблемному справочнику (например, РассылкиОтчетов) и выполним выгрузку в XML-файл.
  4. Запустим рабочую базу и с помощью той же обработки загрузим файл данных.
  5. Повторно запустим процесс обновления информационной базы.

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

← На главную