Как восстановить отсутствующие предопределенные данные при обновлении базы 1С?

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

При обновлении нетиповых конфигураций (например, 1С:Управление торговлей или решений на базе Библиотеки стандартных подсистем) нередко возникает ситуация, когда прикладные механизмы или платформа прерывают обновление из-за отсутствия в информационной базе предопределенных элементов. Чаще всего с этой проблемой сталкиваются при работе со справочником НаборыДополнительныхРеквизитовИСведений или планами видов характеристик.

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

Выясним причину: почему предопределенные элементы не создаются автоматически

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

Кроме того, фактический режим обновления предопределенных данных вычисляется платформой по строгому алгоритму приоритетов:

  1. Если для конкретного объекта метаданных в данных базы установлен режим обновления, отличный от Авто, используется именно это значение.
  2. Иначе, если для объекта метаданных в конфигураторе задан режим, отличный от Авто, применяется он.
  3. Иначе проверяется общая настройка для всей информационной базы.
  4. Если везде установлено значение Авто, платформа проверяет статус базы: в периферийных узлах распределенной информационной базы (РИБ) автоматическое создание предопределенных данных по умолчанию блокируется, в то время как в главном узле или автономной базе оно выполняется штатно.

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

Способ 1. Программное создание и привязка элемента через свойство ИмяПредопределенныхДанных

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

Обратите внимание на иерархию справочника. Например, в справочнике НаборыДополнительныхРеквизитовИСведений многие предопределенные наборы являются группами. Если в метаданных объект объявлен группой, вызов стандартного метода создания элемента приведет к ошибке.

Посмотрим на пример создания предопределенного элемента:


Объект = Справочники.НаборыДополнительныхРеквизитовИСведений.СоздатьЭлемент();
Объект.Наименование = "Наименование элемента";
Объект.ИмяПредопределенныхДанных = "ИмяПредопределенногоЭлементаИзМетаданных";
Объект.Записать();

Если в конфигураторе предопределенный объект описан как группа справочника, используем соответствующий метод:


Объект = Справочники.НаборыДополнительныхРеквизитовИСведений.СоздатьГруппу();
Объект.Наименование = "Наименование группы";
Объект.ИмяПредопределенныхДанных = "ИмяПредопределеннойГруппыИзМетаданных";
Объект.Записать();

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

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


Объект = СсылкаНаОбъект.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "ИмяПредопределенногоЭлементаИзМетаданных";
Объект.Записать();

Способ 2. Принудительное включение автообновления в конфигураторе

Проанализируем настройки метаданных в конфигураторе. Если у проблемного справочника в палитре свойств реквизит Обновление предопределенных данных находится в значении Авто, изменим его:

  1. Откроем дерево метаданных в конфигураторе.
  2. Найдем проблемный справочник (или план видов характеристик) и перейдем в его свойства.
  3. В поле Обновление предопределенных данных установим значение Обновлять автоматически.
  4. Применим изменения конфигурации базы данных (клавиша F7).

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

Способ 3. Управление режимом обновления в кодовой базе и для подчиненных узлов РИБ

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


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

Также инициализировать автообновление для всей базы можно при запуске через командную строку с помощью параметра /SetPredefinedDataUpdate -UpdateAutomatically.

В крайнем случае для узлов РИБ применяют временное отключение от главного узла:


// Отключаем признак подчиненного узла
ГлавныйУзел = ПланыОбмена.ГлавныйУзел();
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);

// После обновления конфигурации и инициализации данных восстанавливаем узел обратно
ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел);

Способ 4. Перенос предопределенных данных из типовой или эталонной конфигурации

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

Разберем последовательность шагов:

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