При масштабировании ИТ-ландшафта предприятия неизбежно возникает ситуация, когда администрирование учетных записей сотрудников в разных информационных базах (например, 1С:ERP, 1С:ЗУП, 1С:Бухгалтерия) становится трудоемкой задачей. Ручной ввод контактных данных, управление паролями, блокировка уволенных сотрудников в каждой базе отдельно приводят к ошибкам, несогласованности данных и уязвимостям в безопасности. Для автоматизации этой задачи можно использовать помощник создания пользователей сразу в нескольких информационных базах.
В этой статье мы подробно проанализируем задачу создания единой базы (мастер-базы) для управления пользователями других систем 1С. Мы разберем как теоретические подходы, так и готовые практические решения — от использования штатных механизмов платформы (OpenID, Active Directory) до реализации собственной синхронизации через шину данных (ESB) с использованием программного интерфейса Библиотеки стандартных подсистем (БСП).
Если в вашей организации развернута служба каталогов (например, Microsoft Active Directory), то наиболее правильным решением с точки зрения безопасности и удобства администрирования будет использование доменной авторизации. В этом случае пароли вообще не хранятся и не передаются в базах 1С, а вся аутентификация делегируется операционной системе.
Для реализации этого подхода нам необходимо связать учетную запись пользователя в 1С с его доменным именем в Active Directory. За это отвечает свойство пользователя ПользовательОС.
Рассмотрим, как можно автоматизировать процесс синхронизации контактных данных (телефоны, email) и создания учетных записей напрямую из Active Directory в базы 1С по расписанию:
// Пример подключения к Active Directory для получения данных пользователей
Функция ПолучитьДанныхИзActiveDirectory() Экспорт
СписокПользователей = Новый ТаблицаЗначений;
СписокПользователей.Колонки.Добавить("Login");
СписокПользователей.Колонки.Добавить("ФИО");
СписокПользователей.Колонки.Добавить("Email");
СписокПользователей.Колонки.Добавить("Телефон");
Попытка
Подключение = Новый COMОбъект("ADODB.Connection");
Подключение.Provider = "ADsDSOObject";
Подключение.Open("Active Directory Provider");
Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Подключение;
// Укажите путь к вашему домену LDAP
LDAPPath = "LDAP://dc=yourcompany,dc=local";
// Запрос для выборки активных пользователей
Команда.CommandText = "SELECT sAMAccountName, displayName, mail, telephoneNumber " +
"FROM '" + LDAPPath + "' " +
"WHERE objectCategory='person' AND objectClass='user' " +
"AND userAccountControl & 2 = 0"; // Исключаем заблокированных
Выборка = Команда.Execute();
Пока НЕ Выборка.EOF Цикл
НоваяСтрока = СписокПользователей.Добавить();
НоваяСтрока.Login = СокрЛП(Выборка.Fields("sAMAccountName").Value);
НоваяСтрока.ФИО = СокрЛП(Выборка.Fields("displayName").Value);
НоваяСтрока.Email = СокрЛП(Выборка.Fields("mail").Value);
НоваяСтрока.Телефон = СокрЛП(Выборка.Fields("telephoneNumber").Value);
Выборка.MoveNext();
КонецЦикла;
Исключение
ЗаписьЖурналаРегистрации("Синхронизация AD", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат СписокПользователей;
КонецФункции
Полученные данные мы можем использовать для автоматического создания карточек пользователей в справочнике Пользователи и автоматического заполнения свойства "Пользователь ОС" в формате \\yourcompany\Login. Это избавит администратора от необходимости заводить пользователей руками в каждой базе.
Платформа «1С:Предприятие» имеет мощный встроенный механизм сквозной авторизации — OpenID-аутентификацию. В этой схеме одна из баз 1С (или внешнее решение) выступает в роли провайдера аутентификации (OpenID-провайдера), а остальные базы являются потребителями (клиентами).
Рассмотрим, как работает эта схема:
Для настройки базы 1С в качестве OpenID-провайдера необходимо отредактировать файл публикации на веб-сервере (default.vrd) базы-источника. Внутри тега <point> добавляется декларация провайдера:
<openid>
<provider>
<enable>true</enable>
</provider>
</openid>
В базах-потребителях (ERP, ЗУП) в их файлах публикации default.vrd прописывается адрес провайдера:
<openid>
<relying>
<enable>true</enable>
<providerLocation>http://server/user_master_base/hs/openid</providerLocation>
</relying>
</openid>
Важное примечание: Начиная с версии платформы 8.3.17, 1С поддерживает современный протокол OpenID Connect (OIDC). Это позволяет интегрировать базы 1С с внешними корпоративными системами управления доступом (IdM/IAM), такими как Keycloak, Active Directory Federation Services (ADFS) или Яндекс ID. Использование внешнего провайдера (например, Keycloak) позволяет централизованно управлять не только доступом, но и подключать двухфакторную аутентификацию (2FA) через СМС или почту, минуя доработку конфигураций 1С.
Если руководство приняло решение хранить и редактировать карточки пользователей (включая телефоны, email и признаки авторизации) в одной мастер-базе 1С и распределять эти данные по другим базам через шину данных (например, RabbitMQ, Apache Kafka или ActiveMQ), нам необходимо детально продумать механизм записи данных на стороне баз-приемников.
Разберем ключевые технические нюансы и правила, которые уберегут вас от критических ошибок архитектуры 1С.
Правило 1: Никогда не создавайте пользователей напрямую в платформе!
Начинающие разработчики часто пытаются манипулировать объектом метаданных ПользователиИнформационнойБазы (на уровне Конфигуратора). В современных типовых конфигурациях (ERP, ЗУП, БП), работающих на Библиотеке стандартных подсистем (БСП), такой подход приведет к полной рассинхронизации системы. Платформенный пользователь будет создан, но у него не будет связи со справочником Пользователи, не заполнятся регистры сведений прав доступа, и пользователь просто не сможет войти в систему или получит критические ошибки при запуске.
Правило 2: Работайте строго через программный интерфейс БСП!
Создание, изменение, запись контактной информации и настройка прав должны выполняться через процедуры общего модуля Пользователи. Проанализируем пошаговый алгоритм загрузки данных пользователя из сообщения шины:
// Процедура обработки входящего сообщения из шины данных
Процедура ЗагрузитьПользователяИзШины(ДанныеПакета) Экспорт
// 1. Поиск существующего пользователя в справочнике по уникальному идентификатору или коду
СсылкаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторФизическогоЛица", ДанныеПакета.ФизическоеЛицоID);
Если СсылкаПользователя.Пустая() Тогда
ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
ПользовательОбъект.Наименование = ДанныеПакета.ФИО;
Иначе
ПользовательОбъект = СсылкаПользователя.ПолучитьОбъект();
КонецЕсли;
ПользовательОбъект.Недействителен = ДанныеПакета.Заблокирован;
// Заполняем свойства, необходимые для создания платформенного пользователя
// Для работы с учетной записью ИБ БСП использует специальную структуру
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Имя = ДанныеПакета.ИмяВхода;
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
// Внимание: Передача паролей в открытом виде по шине небезопасна!
// Рекомендуется генерировать временный пароль или использовать доменную авторизацию:
Если ЗначениеЗаполнено(ДанныеПакета.ПользовательОС) Тогда
ОписаниеПользователяИБ.АутентификацияОС = Истина;
ОписаниеПользователяИБ.ПользовательОС = ДанныеПакета.ПользовательОС;
КонецЕсли;
// Привязываем описание платформенного пользователя к объекту справочника
ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
Попытка
// Запись выполняется через специальный метод БСП, который берет на себя
// регистрацию в ИБ, обновление прав и заполнение служебных регистров
Пользователи.ЗаписатьПользователя(ПользовательОбъект);
// 2. Запись контактной информации (Телефон, Email)
ОбновитьКонтактнуюИнформациюПользователя(ПользовательОбъект.Ссылка, ДанныеПакета.Телефон, ДанныеПакета.Email);
Исключение
ЗаписьЖурналаРегистрации("Интеграция Пользователей", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение "Ошибка при записи пользователя: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
Для записи контактной информации (телефон, email) в современных конфигурациях используется подсистема «Контактная информация» БСП. Запись напрямую в табличную часть справочника Пользователи может не сработать, если в системе включено хранение контактной информации в табличных частях или в отдельном регистре. Используем стандартный метод общего модуля:
Процедура ObnovitKontaktnuyuInformaciyuPolzovatelya(СсылкаПользователя, Телефон, Email)
// Получаем виды контактной информации по умолчанию
ВидТелефона = Справочники.ВидыКонтактнойИнформации.РелевантныйВидКИ("ТелефонПользователя");
ВидEmail = Справочники.ВидыКонтактнойИнформации.РелевантныйВидКИ("EmailПользователя");
ТаблицаКИ = УправлениеКонтактнойИнформацией.ПодготовитьТаблицуДляЗаписи();
Если ЗначениеЗаполнено(Телефон) Тогда
НоваяСтрока = ТаблицаКИ.Добавить();
НоваяСтрока.Вид = ВидТелефона;
НоваяСтрока.Представление = Телефон;
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
КонецЕсли;
Если ЗначениеЗаполнено(Email) Тогда
НоваяСтрока = ТаблицаКИ.Добавить();
НоваяСтрока.Вид = ВидEmail;
НоваяСтрока.Представление = Email;
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
КонецЕсли;
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформациюОбъекта(СсылкаПользователя, ТаблицаКИ);
КонецПроцедуры
Важный вопрос безопасности: Как передавать пароли?
Платформа 1С не хранит пароли пользователей в открытом виде — она хранит только их SHA-хеши. Начиная с версии 8.3, получить или напрямую записать хеш пароля через прикладной программный интерфейс невозможно из соображений безопасности. Передавать пароли в открытом виде через шину данных крайне не рекомендуется.
Как решить эту проблему?
ПользовательОС). В этом случае передавать пароли вообще нет необходимости.ПотребоватьСменуПароляПриВходе.Если бюджет проекта позволяет использовать готовые наработки, или руководство изменит свое решение относительно сторонних систем, настоятельно рекомендуем изучить следующие программные продукты:
Мы проанализировали различные методы организации единой базы для ведения пользователей. При выборе решения придерживайтесь следующих рекомендаций:
Пользователи) и избегайте передачи открытых паролей по каналам связи.