При разработке обработок по синхронизации данных или импорту пользователей из внешних систем (например, из файлов Excel или Active Directory) программисты часто сталкиваются с проблемой: в справочнике Пользователи отсутствуют реквизиты «Имя для входа» или «Аутентификация ОС». Попытка просто записать объект справочника не приводит к изменению учетных данных, необходимых для авторизации в системе. Разберем детально, почему это происходит и как правильно реализовать запись этих данных.
Прежде всего, проанализируем ситуацию с точки зрения архитектуры платформы «1С:Предприятие 8». Важно понимать, что в системе существует строгое разделение между прикладными данными и данными безопасности:
Связь между элементом справочника и пользователем ИБ осуществляется через уникальный идентификатор (GUID), который обычно хранится в скрытом реквизите справочника ИдентификаторПользователяИБ. Рассмотрим, как работать с этими данными программно.
Если нам необходимо внести изменения в данные для входа напрямую, мы должны обратиться к менеджеру ПользователиИнформационнойБазы. Рассмотрим ситуацию из вопроса: у нас есть данные из Excel, и нам нужно обновить имя для входа, если оно отличается от текущего.
Разберем алгоритм действий по шагам:
Пользователи.ИдентификаторПользователяИБ.Пример программной реализации:
// Предположим, Выборка — это результат запроса, где есть Ссылка на справочник и новое Имя из Excel
Пока Выборка.Следующий() Цикл
// 1. Получаем GUID пользователя ИБ из справочника
ИдентификаторИБ = Выборка.Ссылка.ИдентификаторПользователяИБ;
// 2. Ищем пользователя ИБ
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторИБ);
Если ПользовательИБ <> Неопределено Тогда
// Проверяем, нужно ли менять имя
Если ПользовательИБ.Имя <> Выборка.ИмяИзЭксель Тогда
ПользовательИБ.Имя = Выборка.ИмяИзЭксель;
// Настройка аутентификации ОС
ПользовательИБ.АутентификацияОС = Истина;
// Формат строки: "Windows:<ИмяДомена>\<ИмяПользователя>"
ПользовательИБ.ПользовательОС = "Windows:CORP\" + Выборка.ИмяПользователяОС;
Попытка
ПользовательИБ.Записать();
Исключение
Сообщить("Не удалось записать пользователя: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
В современных конфигурациях (таких как УТ 11, ERP, БП 3.0) крайне не рекомендуется работать с ПользователиИнформационнойБазы напрямую. Это связано с тем, что БСП ведет сложные таблицы соответствий и кэширует права доступа. Правильный путь — использование программного интерфейса общего модуля Пользователи.
Выясним, как это сделать правильно. Основным инструментом здесь является процедура Пользователи.ЗаписатьПользователя(). Она принимает структуру, описывающую все свойства пользователя.
Проанализируем пример использования БСП:
// Подготовим структуру с описанием пользователя
ОписаниеПользователя = Новый Структура;
ОписаниеПользователя.Вставить("Имя", "ИвановИИ");
ОписаниеПользователя.Вставить("АутентификацияОС", Истина);
ОписаниеПользователя.Вставить("ПользовательОС", "Windows:OFFICE\ivanov_ii");
ОписаниеПользователя.Вставить("АутентификацияСтандартная", Истина);
// Ссылка на элемент справочника Пользователи
СправочникОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Вызываем метод БСП, который обновит и справочник, и Пользователя ИБ
Пользователи.ЗаписатьПользователя(СправочникОбъект, ОписаниеПользователя);
Использование БСП гарантирует, что все связанные данные (например, записи в регистре сведений СоставыГруппПользователей) будут обновлены корректно и без ошибок целостности базы данных.
Обратим внимание на важный технический нюанс, упомянутый в обсуждении. Реквизит АутентификацияОС — это логический флаг (Булево). Однако для того, чтобы она заработала, необходимо правильно заполнить строковый реквизит ПользовательОС.
Важные правила заполнения:
Windows:.Если вы просто запишете строку "abdulin_as", аутентификация не сработает, так как платформа не поймет, к какому провайдеру безопасности обращаться.
Рассмотрим ситуации, в которых код может выдать ошибку:
.Записать() вызовет исключение. Перед записью всегда проверяйте уникальность имени с помощью функции ПользователиИнформационнойБазы.НайтиПоИмени().Администрирование или ПолныеПрава. В противном случае метод ПолучитьОбъект или Записать вернет ошибку доступа.Подводя итог, можно сказать: чтобы успешно записать «Имя для входа» и параметры ОС из Excel, нужно помнить о «двухслойности» данных пользователя. Мы сначала находим связь между справочником и системным объектом, а затем используем либо методы платформы ПользователиИнформационнойБазы, либо (что предпочтительнее) программный интерфейс БСП. Это обеспечит стабильную работу системы и корректную авторизацию сотрудников.