В типовых конфигурациях на базе «1С:Библиотеки стандартных подсистем» (БСП), таких как «1С:Бухгалтерия предприятия 3.0», администраторы иногда сталкиваются с ситуацией: учетная запись пользователя неожиданно теряет доступ к базе данных. При попытке войти программа сообщает, что пользователь не найден в справочнике, а в самом справочнике Пользователи флаг «Вход в программу разрешен» оказывается снят. Попытка установить его вручную завершается ошибкой: «Имя пользователя занято».
Разберем архитектуру подсистемы пользователей в 1С, выясним первопричины подобного сбоя и рассмотрим способы его корректного устранения без постоянного удаления и пересоздания учетных записей.
Для понимания природы ошибки важно различать два уровня хранения учетных записей:
ПользовательИнформационнойБазы) — хранится во внутренних таблицах платформы 1С и отвечает за аутентификацию (логин, пароль, права доступа, роли).Справочники.Пользователи) — хранит информацию для бизнес-логики программы (ФИО, подразделение, контактные данные, настройки отчетов).Связь между этими двумя объектами поддерживается с помощью служебного реквизита ИдентификаторПользователяИБ (тип УникальныйИдентификатор), который находится в карточке справочника. Когда этот реквизит очищается или заменяется некорректным значением, происходит рассинхронизация:
Проанализируем основные факторы, которые приводят к повреждению реквизита ИдентификаторПользователяИБ:
Пользователи между базами через механизмы обмена в режиме ОбменДанными.Загрузка = Истина в базу-приемник может загрузиться значение реквизита ИдентификаторПользователяИБ из базы-источника. Поскольку системные идентификаторы пользователей в разных базах уникальны, загруженный GUID перезаписывает локальный и разрывает связь.Вместо удаления пользователя в Конфигураторе и повторного ввода данных воспользуемся встроенным инструментом сопоставления БСП:
Пользователи и сохраним изменения.Если сопоставление через форму списка недоступно или требуется автоматизировать процесс для нескольких пользователей, восстановим связь с помощью внешней обработки или консоли кода:
// Получаем системного пользователя платформы по имени для входа
ИмяПользователя = "ИвановИИ";
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если ПользовательИБ <> Неопределено Тогда
// Находим элемент справочника Пользователи
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("Недействителен", Ложь);
Выборка = Справочники.Пользователи.Выбрать();
Пока Выборка.Следующий() Цикл
Если СокрЛП(Выборка.Наименование) = ИмяПользователя Тогда
ОбъектПользователь = Выборка.ПолучитьОбъект();
// Записываем системный UUID в режиме загрузки данных
ОбъектПользователь.ОбменДанными.Загрузка = Истина;
ОбъектПользователь.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
ОбъектПользователь.Записать();
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Чтобы исключить повторение проблемы каждые несколько недель, локализуем источник, перезаписывающий данные:
Пользователи. Проверим, какие сеансы (WS-соединения, регламентные задания, пользователи) вносят изменения.Пользователи из состава плана обмена либо исключим реквизит ИдентификаторПользователяИБ из правил конвертации/регистрации.ПередЗаписью для справочника Пользователи:
&Вместо("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ)
Если ЭтотОбъект.ОбменДанными.Загрузка Тогда
// Фиксируем контекст вызова в Журнале регистрации
Стек = ПолучитьСтекВызовов();
ЗаписьЖурналаРегистрации(
"КонтрольПользователей.ИзменениеИдентификатора",
УровеньЖурналаРегистрации.Предупреждение,
ЭтотОбъект.Метаданные(),
ЭтотОбъект.Ссылка,
"Стек вызова: " + Стек
);
КонецЕсли;
ПродолжитьВызов(Отказ);
КонецПроцедуры
После выявления конкретного веб-сервиса или фонового задания достаточно скорректировать алгоритм сторонней интеграции, чтобы он не перезаписывал служебные реквизиты БСП.