Как реализовать централизованное управление пользователями в нескольких базах 1С?

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

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

В этой статье мы подробно проанализируем задачу создания единой базы (мастер-базы) для управления пользователями других систем 1С. Мы разберем как теоретические подходы, так и готовые практические решения — от использования штатных механизмов платформы (OpenID, Active Directory) до реализации собственной синхронизации через шину данных (ESB) с использованием программного интерфейса Библиотеки стандартных подсистем (БСП).

Стратегия 1. Использование доменной авторизации (Active Directory / LDAP)

Если в вашей организации развернута служба каталогов (например, Microsoft Active Directory), то наиболее правильным решением с точки зрения безопасности и удобства администрирования будет использование доменной авторизации. В этом случае пароли вообще не хранятся и не передаются в базах 1С, а вся аутентификация делегируется операционной системе.

Для реализации этого подхода нам необходимо связать учетную запись пользователя в 1С с его доменным именем в Active Directory. За это отвечает свойство пользователя ПользовательОС.

Рассмотрим, как можно автоматизировать процесс синхронизации контактных данных (телефоны, email) и создания учетных записей напрямую из Active Directory в базы 1С по расписанию:

  1. Настроим регламентное задание в 1С, которое будет периодически подключаться к службе каталогов LDAP.
  2. Для подключения используем COM-объект технологии ADO (ActiveX Data Objects).
  3. Проанализируем пример кода для получения данных сотрудников из домена:

// Пример подключения к 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. Это избавит администратора от необходимости заводить пользователей руками в каждой базе.

Стратегия 2. Использование технологии OpenID и OpenID Connect (OIDC)

Платформа «1С:Предприятие» имеет мощный встроенный механизм сквозной авторизации — OpenID-аутентификацию. В этой схеме одна из баз 1С (или внешнее решение) выступает в роли провайдера аутентификации (OpenID-провайдера), а остальные базы являются потребителями (клиентами).

Рассмотрим, как работает эта схема:

  1. Администратор заводит пользователя и его пароль только в одной базе (например, в базе-провайдере).
  2. При попытке входа в другие базы (ERP, ЗУП) платформа перенаправляет пользователя на веб-страницу базы-провайдера для ввода логина и пароля.
  3. После успешной авторизации пользователь возвращается в целевую базу без необходимости повторного ввода учетных данных. Информация о сессии сохраняется в cookie браузера или тонкого клиента.

Для настройки базы 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С.

Стратегия 3. Разработка собственного обмена реквизитами через шину данных (ESB)

Если руководство приняло решение хранить и редактировать карточки пользователей (включая телефоны, 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, получить или напрямую записать хеш пароля через прикладной программный интерфейс невозможно из соображений безопасности. Передавать пароли в открытом виде через шину данных крайне не рекомендуется.

Как решить эту проблему?

Стратегия 4. Готовые решения для управления ИТ-ландшафтом

Если бюджет проекта позволяет использовать готовые наработки, или руководство изменит свое решение относительно сторонних систем, настоятельно рекомендуем изучить следующие программные продукты:

Резюме и рекомендации

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

  1. Если в компании настроена Active Directory, используйте доменную авторизацию и напишите простое регламентное задание по загрузке контактных данных сотрудников из LDAP. Это самый дешевый, надежный и безопасный вариант.
  2. Если домена нет, но баз много и они опубликованы на веб-сервере — рассмотрите настройку OpenID / OpenID Connect (OIDC). Это позволит использовать стандартный механизм авторизации 1С без написания сложного кода синхронизации паролей.
  3. Если вы реализуете синхронизацию через шину данных (ESB) собственными силами — создавайте учетные записи строго через интерфейсы БСП (модуль Пользователи) и избегайте передачи открытых паролей по каналам связи.
← На главную