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