При разработке корпоративных порталов, систем дистанционного обучения или внутренних баз знаний на платформе 1С разработчики часто сталкиваются с задачей автоматизации доступа. Допустим, в компании есть домен Active Directory (AD) на 10 000 сотрудников. Лишь 10% из них будут реально пользоваться базой 1С. Вручную заводить 1000 пользователей — долго, а синхронизировать все 10 000 учетных записей из AD «на всякий случай» — нерационально, так как это перегрузит базу данных неиспользуемыми элементами справочников.
Логичным решением выглядит создание пользователя «на лету» в момент его первого обращения к системе. Однако здесь мы сталкиваемся с главным системным ограничением платформы 1С: если включена штатная доменная аутентификация, платформа проверяет наличие пользователя в списке информационной базы (ИБ) до запуска какого-либо программного кода. Если пользователя в ИБ нет, платформа сразу вернет ошибку «Доступ запрещен» и не запустит ни модуль управляемого приложения, ни модуль сеанса.
В этой статье мы подробно разберем четыре практических архитектурных подхода, которые позволяют обойти это ограничение и реализовать автоматическую регистрацию пользователей при первом входе.
---
Этот метод основан на использовании временной учетной записи с ограниченными правами, которая служит шлюзом для создания реальных пользователей. Разберем этот сценарий по шагам.
Регистратор.ПриНачалеРаботыСистемы прописывается логика перехвата управления. Если текущий пользователь базы — Регистратор, система считывает доменное имя текущего пользователя операционной системы, программно создает новую полноценную учетную запись и перезапускает сеанс уже под новым именем.Проанализируем пример кода, реализующий этот алгоритм:
Процедура ПриНачалеРаботыСистемы()
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
// Проверяем, зашел ли клиент под нашей технической учетной записью
Если ТекущийПользовательИБ.Имя = "Регистратор" Тогда
// Получаем доменное имя текущего сеанса ОС
ИмяПользователяОС = ИнформационнаяСистема.ИмяПользователяОС();
Если ПустаяСтрока(ИмяПользователяОС) Тогда
Предупреждение("Не удалось определить учетную запись домена. Обратитесь к администратору.");
ЗавершитьРаботуСистемы(Ложь);
Возврат;
КонецЕсли;
// Переходим на сервер для безопасного создания пользователя
РезультатСоздания = СоздатьПользователяПодПривилегиями(ИмяПользователяОС);
Если РезультатСоздания.Успех Тогда
ПоказатьПредупреждение(, "Ваша учетная запись создана. Нажмите ОК для перезапуска системы.");
// Перезапускаем систему с параметрами автоматического входа под новым пользователем ОС
ЗавершитьРаботуСистемы(Ложь, Истина, "/C " + РезультатСоздания.НовоеИмя);
Иначе
ПоказатьПредупреждение(, "Ошибка регистрации: " + РезультатСоздания.ОписаниеОшибки);
ЗавершитьРаботуСистемы(Ложь);
EndIf;
КонецЕсли;
КонецПроцедуры
На сервере в общем модуле с установленным флагом Привилегированный выполняется непосредственное создание записи:
Функция СоздатьПользователяПодПривилегиями(ИмяОС) Экспорт
УстановитьПривилегированныйРежим(Истина);
Результат = Новый Структура("Успех, НовоеИмя, ОписаниеОшибки", Ложь, "", "");
// Проверяем, нет ли уже такого пользователя в ИБ
СуществующийПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяОС);
Если СуществующийПользователь <> Неопределено Тогда
Результат.Успех = Истина;
Результат.НовоеИмя = СуществующийПользователь.Имя;
Возврат Результат;
КонецЕсли;
// Создаем нового пользователя ИБ
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
НовыйПользователь.Имя = ИмяОС;
НовыйПользователь.ПолноеИмя = НайтиИмяСотрудникаВAD(ИмяОС); // Функция запроса к AD через COM/LDAP
НовыйПользователь.ПользовательОС = ИмяОС;
НовыйПользователь.АутентификацияОС = Истина;
НовыйПользователь.АутентификацияСтандартная = Ложь;
// Назначаем базовый набор ролей
НовыйПользователь.Роли.Добавить(Метаданные.Роли.БазовыеПрава);
НовыйПользователь.Роли.Добавить(Метаданные.Роли.ЗапускВебКлиента);
Попытка
НовыйПользователь.Записать();
// Создаем соответствующий элемент в справочнике "Пользователи"
СоздатьЭлементСправочникаПользователи(НовыйПользователь);
Результат.Успех = Истина;
Результат.НовоеИмя = НовыйПользователь.Имя;
Исключение
Результат.ОписаниеОшибки = ОписаниеОшибки();
КонецПопытки;
Возврат Результат;
КонецФункции
Важное замечание по безопасности: При таком подходе крайне важно максимально ограничить права «гостевой» учетной записи на уровне ролей. Она не должна иметь доступа ни к каким прикладным данным, справочникам или документам, поскольку под ней технически может авторизоваться любой пользователь сети до создания персонального аккаунта.
---
Этот способ идеально подходит для веб-клиента. Вместо того чтобы сразу направлять пользователя на стандартный URL публикации 1С, его направляют на легкую веб-страницу (портал-посредник), развернутую на том же веб-сервере (IIS или Apache).
Схема взаимодействия выглядит следующим образом:
default.vrd жестко прописывается логин и пароль технического пользователя 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);
Возврат Ответ;
КонецФункции
---
Если в компании используется прокси-сервер или сложная конфигурация веб-серверов IIS/Apache, можно настроить сквозную авторизацию с помощью проброса HTTP-заголовков. Этот метод часто применяется при публикации баз в среде Linux.
Суть метода заключается в следующем:
X-Remote-User со значением имени пользователя AD.default.vrd включается авторизация под одним сервисным аккаунтом.УстановкаПараметровСеанса программно анализируются заголовки HTTP-запроса, с которыми пришел клиент.Посмотрим на пример считывания HTTP-заголовков в 1С:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
#Если ТонкийКлиент Или ВебКлиент Тогда
// Получаем информацию о HTTP-заголовках текущего соединения
Заголовки = ПолучитьЗаголовкиТекущегоЗапроса(); // Использование встроенных механизмов веб-сервера
ИмяПользователяAD = Заголовки.Получить("X-Remote-User");
Если Не ПустаяСтрока(ИмяПользователяAD) Тогда
// Выполняем поиск пользователя в ИБ
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователяAD);
Если ПользовательИБ = Неопределено Тогда
// Программно создаем учетную запись с базовым набором прав
СоздатьНовогоПользователя(ИмяПользователяAD);
КонецЕсли;
// Устанавливаем параметры сеанса для дальнейшего ограничения прав на уровне RLS
ПараметрыСеанса.ТекущийПользователь = НайтиСправочникПользователиПоИмени(ИмяПользователяAD);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Этот способ считается одним из самых надежных и производительных, так как веб-сервер берет на себя всю тяжелую работу по криптографической проверке билетов Kerberos, а 1С получает уже верифицированное имя пользователя для обработки.
---
Начиная с версии платформы 8.3.18, 1С поддерживает авторизацию по протоколу OpenID Connect. В качестве провайдера удостоверений (Identity Provider, IdP) можно использовать популярные решения, такие как Keycloak, Authentik, Avanpost или Active Directory Federation Services (ADFS).
В этом случае сценарий регистрации выглядит так:
Этот метод является наиболее современным, безопасным и масштабируемым. Он позволяет полностью исключить хранение паролей и обработку доменных учетных данных внутри кода 1С, перенося эти функции на специализированное промышленное решение класса IAM/IdM.
---
Выбор конкретного метода зависит от архитектуры вашей информационной системы: