При разработке и внедрении решений на платформе 1С часто возникает задача развертывания совершенно новой, чистой информационной базы из имеющегося файла нетиповой конфигурации (.cf). Однако при первой попытке войти в режим «1С:Предприятие» система может выдать критическую ошибку: «Пользователь ... не был найден в справочнике пользователей. Возникла ошибка при добавлении пользователя в справочник» и аварийно завершить сеанс.
Разберем детально, почему возникает эта ошибка, как быстро локализовать сбойный участок кода с помощью средств платформы и какие существуют корректные варианты устранения проблемы.
Проанализируем механизм, заложенный в типовых и нетиповых конфигурациях (в частности, на базе «1С:Управление торговлей»). При первом старте пустой информационной базы срабатывают события инициализации сеанса (например, ПередНачаломРаботыСистемы или ПриНачалеРаботыСистемы). Система определяет, что список пользователей пуст, и пытается автоматически создать первого пользователя в справочнике Справочники.Пользователи программным кодом:
Попытка
ОбъектПользователь.Записать();
Исключение
ВызватьИсключение "Пользователь : " + ИмяПользователя + " не был найден в справочнике пользователей. Возникла ошибка при добавлении пользователя в справочник.
|" + ОписаниеОшибки();
КонецПопытки;
Сбой вызова метода Записать() в пустой базе обычно происходит по следующим причинам:
Пользователи новые реквизиты и установили для них свойство Проверка заполнения: Выдавать ошибку (или Запрет незаполненных значений), стандартный алгоритм инициализации пытается записать элемент без этих реквизитов, что вызывает исключение.ПередЗаписью, ПриЗаписи или в объектах метаданных типа ПодпискаНаСобытие могут выполняться проверки настроек, констант или групп, которые в чистой базе еще не заполнены.Код или Наименование.Выясним, в каком именно модуле и на какой строке происходит аварийное завершение. Для этого выполним следующие действия:
F5. При возникновении исключения платформа автоматически откроет нужный модуль и укажет на строку с методом Записать().Попытка ... Исключение, воспользуемся инструментом Правка > Глобальный поиск (сочетание клавиш Ctrl + Shift + F) и найдем текст ошибки: не был найден в справочнике пользователей.Рассмотрим несколько вариантов решения проблемы — от быстрого временного обхода до правильной программной адаптации конфигурации.
Чтобы запись базового системного пользователя происходила без проверок обязательных реквизитов и без срабатывания блокирующих подписок на события, применим свойство ОбменДанными.Загрузка. Найдем блок создания объекта пользователя и дополним его перед вызовом метода записи:
ОбъектПользователь = Справочники.Пользователи.СоздатьЭлемент();
ОбъектПользователь.Наименование = ИмяПользователя;
ОбъектПользователь.Код = ИмяПользователя;
// Отключаем проверки метаданных и прикладные обработчики событий
ОбъектПользователь.ОбменДанными.Загрузка = Истина;
Попытка
ОбъектПользователь.Записать();
Исключение
ЗаписьЖурналаРегистрации("ИнициализацияПользователя",
УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось записать пользователя: " + ОписаниеОшибки());
ВызватьИсключение "Ошибка инициализации базового пользователя: " + ОписаниеОшибки();
КонецПопытки;
Установка свойства ОбменДанными.Загрузка = Истина сообщает платформе 1С, что запись производится в режиме обмена, благодаря чему встроенные проверки заполнения реквизитов и логика подписок на события пропускаются.
Если запись блокируется ограничениями на уровне записей (RLS), гарантируем доступ установкой привилегированного режима перед выполнением записи:
УстановитьПривилегированныйРежим(Истина);
Попытка
ОбъектПользователь.ОбменДанными.Загрузка = Истина;
ОбъектПользователь.Записать();
Исключение
УстановитьПривилегированныйРежим(Ложь);
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
Если в нетиповой конфигурации для справочника Пользователи были добавлены реквизиты с жестким запретом незаполненных значений:
Выдавать ошибку на Не проверять.ПередЗаписьюНаСервере или ПриПроверкеЗаполненияНаСервере), чтобы программная инициализация системных пользователей в фоновом режиме проходила успешно.Если конфигурация сильно переработана и для корректного старта требует наличия предопределенных настроек, учетных политик, констант и служебных пользователей, правильной практикой развертывания является подготовка эталонной пустой базы:
.dt (Администрирование > Выгрузить информационную базу...).