При работе с 1С:Предприятием 8.3 возникает задача программного получения списка пользователей, которые имеют возможность входа в информационную базу через веб-сервер. Стандартные функции, такие как ПользователиИнформационнойБазы.ПолучитьПользователей(), обычно возвращают всех зарегистрированных пользователей информационной базы, но не предоставляют информацию о том, кто из них фактически может использовать веб-клиент для доступа. Мы выясним, как получить этот специфический список, учитывая особенности публикации и аутентификации 1С.
Прежде чем мы перейдем к программным методам, важно разобраться, как вообще работает доступ пользователей 1С через веб-сервер. Доступ к информационной базе через веб-клиент или тонкий клиент (при работе через HTTP/HTTPS) регулируется несколькими уровнями:
ВебКлиентРазрешен, которое указывает, разрешено ли ему в принципе использовать веб-клиент. Однако это лишь одно из условий.default.vrd. В этом файле содержатся ключевые параметры, в том числе режимы аутентификации и списки пользователей, которым разрешен доступ через данную публикацию.Для нашей задачи, когда мы хотим получить список пользователей, способных войти через HTTP/HTTPS, нам необходимо учитывать как настройки пользователя в 1С, так и информацию из файла публикации default.vrd.
default.vrdФайл default.vrd (или иной файл с расширением .vrd) играет центральную роль в определении того, какие пользователи могут быть аутентифицированы через веб-сервер для конкретной информационной базы. Этот файл представляет собой XML-документ, в котором описываются параметры публикации. Нас интересует секция <v8:authenticationMode>, которая может содержать список разрешенных пользователей 1С.
Рассмотрим пример структуры файла default.vrd, где явно указаны пользователи, которым разрешен вход:
<?xml version="1.0" encoding="UTF-8"?>
<v8:point xmlns:v8="http://v8.1c.ru/8.2/virtual-resource-description"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="v8:VirtualResourceDescription_v1">
<v8:authenticationMode>
<v8:mode xsi:type="v8:AuthenticationModeStandard"/>
<v8:users>
<v8:user>Администратор</v8:user>
<v8:user>Пользователь1</v8:user>
<v8:user>ВебПользователь</v8:user>
</v8:users>
</v8:authenticationMode>
<v8:permission>
<v8:anonymous>false</v8:anonymous>
<v8:users>
<v8:user>ВсеПользователи</v8:user>
</v8:users>
</v8:permission>
</v8:point>
В этом примере секция <v8:authenticationMode><v8:users> явно перечисляет имена пользователей, которые могут аутентифицироваться. Если же в этой секции указано <v8:user>ВсеПользователи</v8:user> или подобное универсальное правило, то список фактически будет определяться другими настройками.
Мы можем программно прочитать этот XML-файл с помощью объекта ЧтениеXML в 1С, распарсить его и извлечь необходимые имена пользователей из секции <v8:authenticationMode>/<v8:users>/<v8:user>.
Важно понимать, какой режим аутентификации используется для публикации информационной базы, так как от этого зависит способ получения списка веб-пользователей. В default.vrd это определяется тегом <v8:mode> внутри <v8:authenticationMode>.
Стандартная аутентификация 1С (AuthenticationModeStandard):
Это наиболее распространенный режим, когда аутентификация пользователей выполняется средствами 1С. В этом случае для успешного входа пользователя через веб-сервер должны быть выполнены следующие условия:
ВебКлиентРазрешен в его свойствах.<v8:users> внутри <v8:authenticationMode> файла default.vrd, если там нет универсального правила (например, "ВсеПользователи").Именно этот сценарий является основным для нашей задачи, и для него мы будем разрабатывать программное решение.
Аутентификация ОС (AuthenticationModeOS):
В этом режиме аутентификация пользователей выполняется средствами операционной системы. Например, для веб-сервера IIS это означает, что пользователи должны быть зарегистрированы в домене или на локальном компьютере, и им должны быть предоставлены соответствующие права доступа на веб-сервере. Списки таких пользователей определяются на уровне ОС и веб-сервера. Программно из 1С получить такой список напрямую крайне сложно или невозможно, так как 1С не имеет прямого доступа к механизмам аутентификации ОС.
HTTP-аутентификация (AuthenticationModeHTTP):
Данный режим подразумевает использование внешних средств HTTP-аутентификации (например, сторонних прокси-серверов или систем единого входа). Как и в случае с аутентификацией ОС, список пользователей определяется внешними средствами, и прямого программного способа получить его из 1С нет.
Таким образом, для сценария, описанного автором (получение списка пользователей, которые могут войти через веб-сервер), наиболее релевантным и реализуемым программно является случай использования стандартной аутентификации 1С. В остальных случаях потребуется обращение к инструментам операционной системы или внешних систем.
default.vrd и проверка ВебКлиентРазрешенДля получения наиболее точного списка пользователей, которые могут войти в 1С через веб-сервер при использовании стандартной аутентификации 1С, мы будем использовать комбинированный подход:
default.vrd, чтобы получить список имен пользователей, явно разрешенных для публикации через веб-сервер.default.vrd.ВебКлиентРазрешен.Рассмотрим подробный пример функции, которая реализует этот подход:
// Функция для получения списка пользователей, имеющих доступ к ИБ через веб-сервер.
// Возвращает СписокЗначений с именами пользователей.
Функция ПолучитьПользователейВеб()
// 1. Инициализируем список для хранения пользователей из файла VRD
СписокПользователейВебИзVRD = Новый СписокЗначений;
// Укажите актуальный путь к файлу default.vrd вашей публикации.
// Обычно он находится в папке публикации на веб-сервере.
// Пример: "C:\inetpub\wwwroot\МояБаза\default.vrd"
// Или для Apache: "/var/www/html/МояБаза/default.vrd"
ПутьКVRD = "C:\Путь\К\Вашей\Публикации\default.vrd";
// 2. Читаем файл default.vrd и извлекаем имена пользователей
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьИмяФайла(ПутьКVRD);
Пока ЧтениеXML.Прочитать() Цикл
// Ищем элемент
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "user" Тогда
// Проверяем, что это внутри секции authenticationMode/users
// Это важно, так как может быть и в секции ,
// которая регулирует другие аспекты доступа.
Если ЧтениеXML.ТекущийПуть = "/point/authenticationMode/users/user" Тогда
ИмяПользователяVRD = ЧтениеXML.ПрочитатьСодержимое();
СписокПользователейВебИзVRD.Добавить(ИмяПользователяVRD);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Исключение
Сообщить("Ошибка при чтении файла VRD по пути " + ПутьКVRD + ": " + ОписаниеОшибки(), СтатусСообщения.Важное);
Сообщить("Возможно, файл не существует, или нет прав доступа.");
Возврат Новый СписокЗначений; // В случае ошибки возвращаем пустой список
КонецПопытки;
// 3. Формируем итоговый список пользователей, проверяя их в ИБ
ИтоговыйСписокПользователейВеб = Новый СписокЗначений;
Для Каждого Пользователь ИЗ ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
// Проверяем, есть ли пользователь в списке из VRD
// или если в VRD было указано "ВсеПользователи", то считаем, что он разрешен публикацией
// (в данном примере мы исходим из того, что СписокПользователейВебИзVRD будет пустым
// или содержать только конкретные имена, если не было "ВсеПользователи" в VRD).
// Если в VRD было ВсеПользователи , то СписокПользователейВебИзVRD
// будет содержать "ВсеПользователи".
// Дополнительная логика: если в VRD явно указано "ВсеПользователи", то список из VRD не релевантен
// в плане фильтрации по конкретным именам. В этом случае достаточно проверки ВебКлиентРазрешен.
// Для упрощения примера, мы предполагаем, что если СписокПользователейВебИзVRD пуст,
// или содержит "ВсеПользователи", то фильтрация по именам из VRD не нужна.
// Учитываем случай, когда в VRD разрешены "ВсеПользователи"
ФлагВсеПользователиРазрешеныВVRD = (СписокПользователейВебИзVRD.Количество() > 0 И СписокПользователейВебИзVRD.НайтиПоЗначению("ВсеПользователи") <> Неопределено);
Если ФлагВсеПользователиРазрешеныВVRD ИЛИ СписокПользователейВебИзVRD.НайтиПоЗначению(Пользователь.Имя) <> Неопределено Тогда
// Проверяем флаг ВебКлиентРазрешен у пользователя 1С
Если Пользователь.ВебКлиентРазрешен Тогда
ИтоговыйСписокПользователейВеб.Добавить(Пользователь.Имя);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ИтоговыйСписокПользователейВеб;
КонецФункции
// Пример использования функции:
// СписокВебПользователей = ПолучитьПользователейВеб();
// Для Каждого Элемент ИЗ СписокВебПользователей Цикл
// Сообщить("Пользователь, разрешенный для веб-доступа: " + Элемент.Значение);
// КонецЦикла;
default.vrd: Мы должны указать корректный и актуальный путь к файлу публикации default.vrd. Он находится в каталоге, куда опубликована ваша информационная база на веб-сервере. Этот путь может отличаться в зависимости от операционной системы и настроек веб-сервера (IIS на Windows, Apache на Linux). Убедитесь, что путь верен для вашей среды.default.vrd. В противном случае функция вернет ошибку или пустой список.<v8:user>ВсеПользователи</v8:user> в VRD: Если в файле default.vrd в секции <v8:authenticationMode><v8:users> указано <v8:user>ВсеПользователи</v8:user>, это означает, что аутентификация по именам пользователей не фильтруется на уровне VRD. В этом случае критически важным становится только флаг ВебКлиентРазрешен у пользователя в самой 1С. В приведенном коде мы учли этот аспект, хотя для более строгой обработки можно было бы добавить отдельную проверку на наличие строки "ВсеПользователи" в СписокПользователейВебИзVRD.Мы видим, что задача получения списка пользователей, имеющих доступ к информационной базе 1С через веб-сервер, требует комплексного подхода. Недостаточно просто просмотреть список пользователей в самой 1С. Мы должны учитывать настройки публикации на веб-сервере, анализируя файл default.vrd, и сочетать эту информацию с внутренними свойствами пользователей 1С, такими как ВебКлиентРазрешен. Представленное комбинированное решение позволяет надежно получить такой список, особенно при использовании стандартной аутентификации 1С. Это позволит вам точно определить, кто из ваших пользователей имеет фактическую возможность подключения через веб-клиент, и использовать эту информацию в своих обработках или отчетах.