При внедрении Библиотеки Стандартных Подсистем (БСП) в «чистую» конфигурацию программисты часто сталкиваются с трудностями при настройке распределенных информационных баз (РИБ). Типичная ситуация: в главном узле всё настроено корректно, начальный образ создан, но при первом запуске подчиненного узла на этапе первоначального заполнения (обычно на 5-10%) система выдает ошибку: «Значение не является значением объектного типа (Метаданные)». Рассмотрим подробнее, почему это происходит и как правильно подготовить конфигурацию для работы с механизмами обмена БСП.
Проанализируем ситуацию. Ошибка чаще всего возникает в общем модуле ОбменДаннымиПовтИсп. В этом модуле БСП обращается к кэшированным данным о метаданных конфигурации. Если ваша конфигурация не «представилась» библиотеке должным образом, механизмы обновления информационной базы не отрабатывают до конца, и справочники, необходимые для работы обмена (например, ИдентификаторыОбъектовМетаданных), остаются пустыми.
Когда подчиненный узел запускается впервые, он пытается выполнить процедуры обновления. Если в коде конфигурации отсутствуют обязательные привязки к подсистемам БСП, библиотека не может определить версию программы и состав объектов, что приводит к возврату значения Неопределено вместо ожидаемого объекта метаданных. Именно это и вызывает фатальный сбой.
Разберем по шагам, что нужно сделать, чтобы БСП «увидела» вашу конфигурацию и корректно инициализировала её в подчиненном узле. Для этого нам необходимо создать специальный модуль обновления.
Создадим новый общий модуль, например, с именем ОбновлениеИнформационнойБазыИТ. В свойствах модуля обязательно установим флажки «Сервер» и «Внешнее соединение». Пропишем в нем следующий код, адаптировав его под вашу конфигурацию:
#Область ПрограммныйИнтерфейс
// Заполняет основные сведения о конфигурации для БСП.
Процедура ПриДобавленииПодсистемы(Описание) Экспорт
// Укажите имя вашей конфигурации, как оно задано в корне метаданных
Описание.Имя = "УправлениеОтделомИТ";
// Укажите текущую версию вашей конфигурации
Описание.Версия = "1.0.0.1";
// Указываем, что наша конфигурация зависит от БСП
Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");
КонецПроцедуры
// Обработчик, который вызывается после завершения обновления ИБ
Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт
// Вызываем стандартную интеграцию подсистем БСП
ИнтеграцияПодсистемБСП.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим);
КонецПроцедуры
// Остальные обязательные процедуры-заглушки для подсистемы обновления
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
КонецПроцедуры
Процедура ПередОбновлениемИнформационнойБазы Экспорт
КонецПроцедуры
Процедура ПриПодготовкеМакетаОписанияОбновлений(Знач Макет) Экспорт
КонецПроцедуры
Процедура ПриОпределенииРежимаОбновленияДанных(РежимОбновленияДанных, СтандартнаяОбработка) Экспорт
КонецПроцедуры
Процедура ПриДобавленииОбработчиковПереходаСДругойПрограммы(Обработчики) Экспорт
КонецПроцедуры
Процедура ПриЗавершенииПереходаСДругойПрограммы(ПредыдущееИмяКонфигурации, ПредыдущаяВерсияКонфигурации, Параметры) Экспорт
КонецПроцедуры
#КонецОбласти
Важно: в строке Описание.Имя = "УправлениеОтделомИТ"; необходимо указать именно то имя, которое вы присвоили своей конфигурации в конфигураторе. Это позволит БСП сопоставить код модуля с метаданными базы.
Теперь нам нужно сообщить БСП, что у нас появился новый модуль, отвечающий за описание конфигурации. Для этого найдем в конфигураторе общий модуль ПодсистемыКонфигурацииПереопределяемый и отредактируем процедуру ПриДобавленииПодсистем.
Выполним следующую правку:
#Область ПрограммныйИнтерфейс
Процедура ПриДобавленииПодсистем(МодулиПодсистем) Экспорт
// Добавляем имя нашего созданного модуля в массив подсистем
МодулиПодсистем.Добавить("ОбновлениеИнформационнойБазыИТ");
КонецПроцедуры
#КонецОбласти
После этих манипуляций при запуске подчиненного узла БСП поймет, что перед ней не просто набор объектов, а полноценная конфигурация с определенной версией, и запустит стандартные механизмы инициализации кэша метаданных.
Рассмотрим ситуацию глубже. Ошибка «объектного типа (Метаданные)» часто связана с тем, что в подчиненный узел не попали критически важные данные из главного узла. Для корректной работы РИБ в БСП в состав плана обмена обязательно должны быть включены следующие объекты:
ИдентификаторыОбъектовМетаданных. Это сердце БСП. Если он будет пуст в подчиненной базе, никакие функции программного интерфейса библиотеки работать не будут.ПараметрыАдминистрированияИБ, СведенияОбОбновленииИнформационнойБазы, ПрефиксУзлаОбъекта.ВерсииПодсистем (именно там хранится информация о том, что база обновлена) и ПараметрыРаботыПрограммы.Если эти объекты не включены в состав обмена или для них не настроена авторегистрация, подчиненный узел при первом запуске будет считать себя абсолютно «пустым» и несинхронизированным, что и приведет к падению системы при попытке обращения к метаданным.
Проанализируем технические нюансы работы платформы 8.3.14 и выше. Начиная с этих версий, механизмы работы с предопределенными данными и начальным заполнением стали более строгими.
Рекомендация по первому запуску:
Иногда автоматическое обновление не подхватывается корректно из-за блокировок или особенностей сеанса. Попробуйте запустить подчиненный узел с параметром командной строки:
/С ЗапуститьОбновлениеИнформационнойБазы
Это принудительно инициирует процедуры БСП по заполнению справочника идентификаторов объектов метаданных и регистрации версии вашей конфигурации еще до того, как основной интерфейс обмена попытается что-то прочитать.
Если ошибка сохраняется, воспользуемся советом опытных разработчиков: установим точку останова в модуле ОбменДаннымиПовтИсп на строке, указанной в сообщении об ошибке (в БСП 3.0 это часто район 793 строки).
При остановке системы посмотрите в табло значения переменных. Скорее всего, вы увидите, что какая-то переменная, описывающая узел обмена или тип объекта, имеет значение Неопределено. Это укажет на конкретный объект метаданных, который вы забыли включить в план обмена или который не был проинициализирован в справочнике ИдентификаторыОбъектовМетаданных.
Резюме: Решение проблемы заключается в комплексном подходе — регистрации вашей конфигурации как подсистемы через ПодсистемыКонфигурацииПереопределяемый и проверке полноты состава плана обмена. Только когда БСП «увидит» структуру вашей конфигурации и получит актуальные идентификаторы объектов, механизмы РИБ заработают без ошибок.