Как реализовать автоматическое создание пользователя 1С при первом входе через Active Directory?

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

При разработке корпоративных порталов, систем дистанционного обучения или внутренних баз знаний на платформе 1С разработчики часто сталкиваются с задачей автоматизации доступа. Допустим, в компании есть домен Active Directory (AD) на 10 000 сотрудников. Лишь 10% из них будут реально пользоваться базой 1С. Вручную заводить 1000 пользователей — долго, а синхронизировать все 10 000 учетных записей из AD «на всякий случай» — нерационально, так как это перегрузит базу данных неиспользуемыми элементами справочников.

Логичным решением выглядит создание пользователя «на лету» в момент его первого обращения к системе. Однако здесь мы сталкиваемся с главным системным ограничением платформы 1С: если включена штатная доменная аутентификация, платформа проверяет наличие пользователя в списке информационной базы (ИБ) до запуска какого-либо программного кода. Если пользователя в ИБ нет, платформа сразу вернет ошибку «Доступ запрещен» и не запустит ни модуль управляемого приложения, ни модуль сеанса.

В этой статье мы подробно разберем четыре практических архитектурных подхода, которые позволяют обойти это ограничение и реализовать автоматическую регистрацию пользователей при первом входе.

---

Способ 1. Инициализация через «гостевой» сеанс с перезапуском

Этот метод основан на использовании временной учетной записи с ограниченными правами, которая служит шлюзом для создания реальных пользователей. Разберем этот сценарий по шагам.

  1. В конфигураторе создается специальный пользователь ИБ с именем, например, Регистратор.
  2. Для этого пользователя настраивается минимальный набор прав (роль с доступом только на чтение базовых объектов и запуск тонкого/веб-клиента). Пароль для этой учетной записи либо делается общедоступным, либо аутентификация настраивается так, чтобы этот пользователь был доступен по умолчанию при неудачной доменной авторизации.
  3. В модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы прописывается логика перехвата управления. Если текущий пользователь базы — Регистратор, система считывает доменное имя текущего пользователя операционной системы, программно создает новую полноценную учетную запись и перезапускает сеанс уже под новым именем.

Проанализируем пример кода, реализующий этот алгоритм:


Процедура ПриНачалеРаботыСистемы()
    
    ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    
    // Проверяем, зашел ли клиент под нашей технической учетной записью
    Если ТекущийПользовательИБ.Имя = "Регистратор" Тогда
        
        // Получаем доменное имя текущего сеанса ОС
        ИмяПользователяОС = ИнформационнаяСистема.ИмяПользователяОС();
        
        Если ПустаяСтрока(ИмяПользователяОС) Тогда
            Предупреждение("Не удалось определить учетную запись домена. Обратитесь к администратору.");
            ЗавершитьРаботуСистемы(Ложь);
            Возврат;
        КонецЕсли;
        
        // Переходим на сервер для безопасного создания пользователя
        РезультатСоздания = СоздатьПользователяПодПривилегиями(ИмяПользователяОС);
        
        Если РезультатСоздания.Успех Тогда
            ПоказатьПредупреждение(, "Ваша учетная запись создана. Нажмите ОК для перезапуска системы.");
            // Перезапускаем систему с параметрами автоматического входа под новым пользователем ОС
            ЗавершитьРаботуСистемы(Ложь, Истина, "/C " + РезультатСоздания.НовоеИмя);
        Иначе
            ПоказатьПредупреждение(, "Ошибка регистрации: " + РезультатСоздания.ОписаниеОшибки);
            ЗавершитьРаботуСистемы(Ложь);
        EndIf;
        
    КонецЕсли;
    
КонецПроцедуры

На сервере в общем модуле с установленным флагом Привилегированный выполняется непосредственное создание записи:


Функция СоздатьПользователяПодПривилегиями(ИмяОС) Экспорт
    
    УстановитьПривилегированныйРежим(Истина);
    
    Результат = Новый Структура("Успех, НовоеИмя, ОписаниеОшибки", Ложь, "", "");
    
    // Проверяем, нет ли уже такого пользователя в ИБ
    СуществующийПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяОС);
    Если СуществующийПользователь <> Неопределено Тогда
        Результат.Успех = Истина;
        Результат.НовоеИмя = СуществующийПользователь.Имя;
        Возврат Результат;
    КонецЕсли;
    
    // Создаем нового пользователя ИБ
    НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
    НовыйПользователь.Имя = ИмяОС;
    НовыйПользователь.ПолноеИмя = НайтиИмяСотрудникаВAD(ИмяОС); // Функция запроса к AD через COM/LDAP
    НовыйПользователь.ПользовательОС = ИмяОС;
    НовыйПользователь.АутентификацияОС = Истина;
    НовыйПользователь.АутентификацияСтандартная = Ложь;
    
    // Назначаем базовый набор ролей
    НовыйПользователь.Роли.Добавить(Метаданные.Роли.БазовыеПрава);
    НовыйПользователь.Роли.Добавить(Метаданные.Роли.ЗапускВебКлиента);
    
    Попытка
        НовыйПользователь.Записать();
        
        // Создаем соответствующий элемент в справочнике "Пользователи"
        СоздатьЭлементСправочникаПользователи(НовыйПользователь);
        
        Результат.Успех = Истина;
        Результат.НовоеИмя = НовыйПользователь.Имя;
    Исключение
        Результат.ОписаниеОшибки = ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции

Важное замечание по безопасности: При таком подходе крайне важно максимально ограничить права «гостевой» учетной записи на уровне ролей. Она не должна иметь доступа ни к каким прикладным данным, справочникам или документам, поскольку под ней технически может авторизоваться любой пользователь сети до создания персонального аккаунта.

---

Способ 2. Внешняя Landing-страница и HTTP-сервис

Этот способ идеально подходит для веб-клиента. Вместо того чтобы сразу направлять пользователя на стандартный URL публикации 1С, его направляют на легкую веб-страницу (портал-посредник), развернутую на том же веб-сервере (IIS или Apache).

Схема взаимодействия выглядит следующим образом:

  1. Пользователь переходит по адресу корпоративного портала. Веб-сервер, используя встроенную Windows-аутентификацию (Kerberos/NTLM), бесшовно определяет его доменное имя.
  2. JavaScript на веб-странице отправляет фоновый AJAX-запрос к специально созданному в 1С HTTP-сервису. Для публикации этого HTTP-сервиса в файле default.vrd жестко прописывается логин и пароль технического пользователя 1С с правами администратора (или правами на управление пользователями).
  3. HTTP-сервис принимает доменное имя пользователя, проверяет его наличие в базе, при необходимости создает нового пользователя ИБ, привязывает к нему доменную авторизацию и возвращает ответ веб-странице.
  4. После получения успешного ответа JavaScript на веб-странице выполняет перенаправление (редирект) браузера на стандартный URL веб-клиента 1С.
  5. Так как пользователь к этому моменту уже создан в ИБ 1С, веб-клиент мгновенно авторизует его по доменному имени ОС без вывода окон ввода пароля.

Рассмотрим пример кода метода HTTP-сервиса 1С, обрабатывающего запрос на создание:


Функция РегистрацияПользователяПост(Запрос)
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
    
    // Чтение параметров запроса
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТелоЗапроса);
    ПараметрыДанных = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    ДоменноеИмя = ПараметрыДанных.Получить("domain_user");
    
    Если ПустаяСтрока(ДоменноеИмя) Тогда
        Ответ.КодСостояния = 400;
        Возврат Ответ;
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Истина);
    
    // Поиск или создание пользователя
    ПользовательСуществует = (ПользователиИнформационнойБазы.НайтиПоИмени(ДоменноеИмя) <> Неопределено);
    
    Если Не ПользовательСуществует Тогда
        Попытка
            НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
            НовыйПользователь.Имя = ДоменноеИмя;
            НовыйПользователь.ПользовательОС = ДоменноеИмя;
            НовыйПользователь.АутентификацияОС = Истина;
            НовыйПользователь.Роли.Добавить(Метаданные.Роли.БазовыеПрава);
            НовыйПользователь.Записать();
            
            СоздатьЭлементСправочникаПользователи(НовыйПользователь);
            
            Статус = "Создан";
        Исключение
            Статус = "Ошибка: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        КонецПопытки;
    Иначе
        Статус = "Существует";
    КонецЕсли;
    
    // Формирование JSON-ответа
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    РезультатСтруктура = Новый Структура("status, user", Статус, ДоменноеИмя);
    ЗаписатьJSON(Запись, РезультатСтруктура);
    
    Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8);
    Возврат Ответ;
    
КонецФункции

---

Способ 3. Проброс HTTP-заголовков (Header-based Authentication)

Если в компании используется прокси-сервер или сложная конфигурация веб-серверов IIS/Apache, можно настроить сквозную авторизацию с помощью проброса HTTP-заголовков. Этот метод часто применяется при публикации баз в среде Linux.

Суть метода заключается в следующем:

Посмотрим на пример считывания HTTP-заголовков в 1С:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    #Если ТонкийКлиент Или ВебКлиент Тогда
        
        // Получаем информацию о HTTP-заголовках текущего соединения
        Заголовки = ПолучитьЗаголовкиТекущегоЗапроса(); // Использование встроенных механизмов веб-сервера
        ИмяПользователяAD = Заголовки.Получить("X-Remote-User");
        
        Если Не ПустаяСтрока(ИмяПользователяAD) Тогда
            // Выполняем поиск пользователя в ИБ
            ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователяAD);
            
            Если ПользовательИБ = Неопределено Тогда
                // Программно создаем учетную запись с базовым набором прав
                СоздатьНовогоПользователя(ИмяПользователяAD);
            КонецЕсли;
            
            // Устанавливаем параметры сеанса для дальнейшего ограничения прав на уровне RLS
            ПараметрыСеанса.ТекущийПользователь = НайтиСправочникПользователиПоИмени(ИмяПользователяAD);
        КонецЕсли;
        
    #КонецЕсли
    
КонецПроцедуры

Этот способ считается одним из самых надежных и производительных, так как веб-сервер берет на себя всю тяжелую работу по криптографической проверке билетов Kerberos, а 1С получает уже верифицированное имя пользователя для обработки.

---

Способ 4. Современная интеграция через OpenID Connect (OIDC)

Начиная с версии платформы 8.3.18, 1С поддерживает авторизацию по протоколу OpenID Connect. В качестве провайдера удостоверений (Identity Provider, IdP) можно использовать популярные решения, такие как Keycloak, Authentik, Avanpost или Active Directory Federation Services (ADFS).

В этом случае сценарий регистрации выглядит так:

  1. При попытке входа в веб-клиент 1С перенаправляет пользователя на форму входа IdP (например, Keycloak), интегрированного с вашим AD.
  2. Пользователь успешно авторизуется на стороне Keycloak (часто бесшовно через Kerberos).
  3. В настройках Keycloak настраивается специальный обработчик (Webhook), который при первой успешной авторизации пользователя в системе отправляет HTTP-запрос в 1С через API для предварительного создания карточки пользователя.
  4. 1С создает пользователя, сопоставляя его по идентификатору (например, Email или Claim-ID из токена).
  5. IdP возвращает пользователя в 1С с JWT-токеном, и платформа успешно авторизует вошедшего.

Этот метод является наиболее современным, безопасным и масштабируемым. Он позволяет полностью исключить хранение паролей и обработку доменных учетных данных внутри кода 1С, перенося эти функции на специализированное промышленное решение класса IAM/IdM.

---

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

Выбор конкретного метода зависит от архитектуры вашей информационной системы:

← На главную