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