Как исправить ошибку отсутствия предопределенного элемента при создании пользователя в подчиненной базе РИБ?

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

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

Почему возникает ошибка в подчиненном узле РИБ

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

Для исключения дублирования идентификаторов (UUID) платформа по умолчанию не создает предопределенные элементы автоматически в подчиненных узлах РИБ при первом запуске — предполагается, что они должны мигрировать из главного узла вместе с обменом данными. Однако на практике возникают сбои по следующим причинам:

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

Способ 1. Первый запуск под полными правами администратора (основное решение)

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

Разберем процесс по шагам:

  1. Откроем подчиненную информационную базу в режиме Конфигуратор.
  2. Перейдем в меню Администрирование — Пользователи.
  3. Выберем учетную запись, под которой планируется вход, и временно назначим ей полные права (роли Администратор системы и Полные права). Сохраним изменения.
  4. Запустим сеанс 1С:Предприятие под этим пользователем. При старте система БСП автоматически определит, что база является новым узлом, и выполнит регламентные процедуры инициализации: создаст недостающие системные наборы дополнительных реквизитов и свяжет их с метаданными.
  5. Закроем пользовательский сеанс.
  6. Снова откроем базу в режиме Конфигуратор и вернем пользователю исходный ограниченный набор ролей.

После этой процедуры вход под пользователями с ограниченными правами и создание новых элементов в справочнике Пользователи будут происходить штатно без ошибок.

Способ 2. Принудительная регистрация данных в главном узле

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

В центральной базе выполним следующий код внешней обработкой:


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

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

Способ 3. Программное создание элемента с обходом блокировки РИБ

Бывают ситуации, когда оперативный обмен с центральным узлом недоступен, а базу необходимо запустить срочно. Поскольку подчиненная база заблокирована для ручной модификации большинства данных, используем программную установку признака загрузки данных через свойство ОбменДанными.Загрузка.

Посмотрим на пример создания недостающего элемента через внешнюю обработку:


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

Установка свойства ОбменДанными.Загрузка = Истина отключает прикладные проверки и системный контроль целостности подчиненного узла РИБ, позволяя записать объект непосредственно в базу данных.

Способ 4. Принудительное включение автообновления предопределенных данных

Выясним еще один метод восстановления предопределенных данных через встроенные механизмы платформы 1С. Мы можем временно переключить режим инициализации предопределенных элементов для проблемного справочника:


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

После перезапуска базы в режиме 1С:Предприятие платформа принудительно создаст все отсутствующие предопределенные элементы, объявленные в дереве метаданных. После успешного создания элементов рекомендуется вернуть значение свойства в ОбновлениеПредопределенныхДанных.Авто.

Важное предупреждение: ручное создание предопределенных элементов в подчиненных базах несет риск коллизий (ошибка «Предопределенный элемент не уникален»), если позже из главного узла придет тот же элемент с другим внутренним идентификатором. Поэтому предпочтительным методом всегда остается первый запуск под правами администратора либо штатная передача данных из центрального узла.

← На главную