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