Кто из пользователей работает в 1С через браузер: поиск сеансов веб-клиента
Содержание
Веб-клиент 1С определяют по типу приложения сеанса. В консоли кластера это колонка «Приложение» со значением «Веб-клиент», в утилите rac — поле app-id : WebClient, во встроенном языке — ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения = "WebClient". Тот же признак работает как отбор в журнале регистрации.
Есть подвох, из-за которого администраторы ошибаются. У сеанса веб-клиента в поле «Компьютер» стоит не машина пользователя, а веб-сервер с публикацией. Поэтому найти, с какого ПК человек зашёл через браузер, средствами кластера не получится. Ниже — все способы и чем они отличаются на практике.
Чем сеанс через браузер отличается от обычного
Тонкий и толстый клиенты подключаются к серверу 1С напрямую: к агенту кластера на порту 1540, затем к менеджеру кластера и рабочим процессам. Веб-клиент так не умеет. Браузер ходит на веб-сервер (IIS или Apache) с модулем расширения 1С, а уже модуль открывает сеанс на сервере 1С от своего имени.
Из этого следуют три вещи, которые видно в любом инструменте диагностики:
- 🖥️ Компьютер сеанса — имя веб-сервера. Если публикация стоит на машине
WEB01, все браузерные сеансы будут «с компьютера»WEB01. - 🌐 IP пользователя знает только веб-сервер. Его ищут в логах IIS или Apache, а не в 1С.
- 🔑 Лицензию для веб-клиента получает сервер 1С: клиентская лицензия берётся на сервере, локальный ключ пользователя тут не участвует.
Отдельный случай — тонкий клиент, подключённый к базе по адресу http:// или https://. Он тоже ходит через веб-сервер, и в поле «Компьютер» у него тоже веб-сервер. Но тип приложения у такого сеанса — «Тонкий клиент», а не «Веб-клиент».
| Как подключились | Тип приложения в 1С | Что в поле «Компьютер» |
|---|---|---|
| Браузер | Веб-клиент (WebClient) | Веб-сервер с публикацией |
| Тонкий клиент по http/https | Тонкий клиент (1CV8C) | Веб-сервер с публикацией |
| Тонкий клиент к серверу 1С | Тонкий клиент (1CV8C) | ПК пользователя или терминальный сервер |
| Толстый клиент | Толстый клиент (1CV8) | ПК пользователя или терминальный сервер |
Если в списке сеансов десятки строк с одним и тем же компьютером, это либо веб-сервер, либо терминальный сервер. Отличить их помогает колонка «Приложение».
Определяем веб-клиент в консоли администрирования кластера
Самый быстрый способ для клиент-серверной базы — оснастка «Администрирование серверов 1С Предприятия».
- Запустите консоль и откройте нужный центральный сервер. Если кластер защищён, введите логин и пароль администратора кластера.
- Разверните ветку
Кластеры → <имя кластера> → Информационные базы → <база> → Сеансы. - Найдите колонку «Приложение». Сеансы браузера подписаны «Веб-клиент».
- Щёлкните по заголовку колонки, чтобы собрать все веб-сеансы подряд.
В той же строке видно пользователя, номер сеанса, время начала и последней активности. Для сеансов по всему кластеру откройте ветку Сеансы на уровне кластера, а не базы.
Без доступа к серверу подойдёт список активных пользователей. В Конфигураторе он открывается через Администрирование → Активные пользователи, в нём та же колонка «Приложение». Этот вариант работает и для файловой базы, опубликованной на веб-сервере, где консоли кластера нет вовсе. Минус один: список показывает только текущую базу.
Колонка «Приложение» помогает и с соседними типами сеансов. Там же встречаются «Конфигуратор», «Фоновое задание», «COM-соединение», «Консоль кластера». Их легко принять за пользователей, если смотреть только на счётчик.
Команда «Удалить» у сеанса в консоли обрывает работу пользователя без сохранения. Перед этим предупредите человека или дождитесь, пока он закончит. Несохранённые данные в открытых формах пропадут.
Если консоль не открывается на машине администратора после обновления платформы, обычно не зарегистрирована библиотека radmin.dll нужной версии. Её регистрируют от имени администратора Windows командой regsvr32 с полным путём к файлу в каталоге bin установленной платформы.
Поиск браузерных сеансов через rac и ras
На Linux-серверах и для скриптов удобнее утилита rac. Она работает через сервер администрирования ras, который слушает порт 1545 по умолчанию.
Сначала узнайте идентификатор кластера:
rac cluster list
Затем выведите сеансы. Если на кластере есть администраторы, добавьте --cluster-user и --cluster-pwd:
rac session list --cluster=<uuid-кластера>
Каждый сеанс выводится блоком строк вида поле : значение, блоки разделены пустой строкой. Нужное поле — app-id. У веб-клиента оно равно WebClient. Другие значения, которые пригодятся для сравнения:
1CV8C— тонкий клиент;1CV8— толстый клиент;Designer— конфигуратор;BackgroundJob— фоновое задание;COMConnection— внешнее соединение.
Чтобы отфильтровать только браузерные сеансы на Linux, используйте режим абзацев в awk:
rac session list --cluster=<uuid-кластера> | awk -v RS= '/app-id +: WebClient/'
На Windows то же самое делается в PowerShell:
$raw = & rac session list --cluster=<uuid-кластера> | Out-String
$raw -split "\r?\n\r?\n" | Where-Object { $_ -match 'app-id\s*:\s*WebClient' }
В каждом найденном блоке смотрите user-name, session-id, host, started-at и last-active-at. Ограничить вывод одной базой можно параметром --infobase с её идентификатором; список баз с идентификаторами даёт rac infobase summary list --cluster=<uuid-кластера>. Для сведений о выданных лицензиях есть rac session list --licenses. Точный набор параметров для вашей версии платформы показывает rac help session.
Журнал регистрации: кто и когда заходил через браузер
Консоль и rac показывают только тех, кто сейчас в базе. Чтобы узнать, кто работал через браузер вчера или неделю назад, нужен журнал регистрации.
В типовых конфигурациях на интерфейсе «Такси» журнал открывается так: Администрирование → Обслуживание → Журнал регистрации. Далее:
- Откройте отбор журнала.
- В поле приложения оставьте только «Веб-клиент».
- В событиях выберите «Сеанс. Начало» — так вы получите список входов, а не все действия.
- Задайте период и примените отбор.
В строках журнала будут пользователь, время входа, номер сеанса и компьютер. Компьютер, как и в консоли, — веб-сервер.
Тот же отбор работает из Конфигуратора: Администрирование → Журнал регистрации, отбор по колонке «Приложение».
Номер сеанса из журнала совпадает с номером в консоли кластера. По нему удобно связать «кто сейчас висит в базе» с тем, что этот сеанс успел сделать.
Если журналов много, выгрузите их программно. Обработку запускают на сервере, пользователю нужны административные права:
&НаСервере
Процедура ВходыЧерезБраузерНаСервере()
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()) - 7 * 86400);
Отбор.Вставить("ИмяПриложения", "WebClient");
Отбор.Вставить("Событие", "_$Session$_.Start");
Данные = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(Данные, Отбор);
Для Каждого Строка Из Данные Цикл
Сообщить(СтрШаблон("%1 | %2 | сеанс %3 | %4",
Формат(Строка.Дата, "ДФ='дд.ММ.гггг ЧЧ:мм'"),
Строка.ИмяПользователя,
Формат(Строка.Сеанс, "ЧГ=0"),
Строка.Компьютер));
КонецЦикла;
КонецПроцедуры
Код выводит входы через браузер за последние семь дней. Строку _$Session$_.Start менять не нужно: это служебный идентификатор события «Сеанс. Начало».
Как узнать тип клиента из кода конфигурации
Разработчику обычно нужно другое: понять внутри модуля, что текущий пользователь сидит в браузере, и, например, скрыть команду, которая в веб-клиенте не работает.
На клиенте используйте инструкцию препроцессора. Код внутри неё попадёт только в веб-клиент:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
#Если ВебКлиент Тогда
Элементы.ЗагрузитьИзФайла.Видимость = Ложь;
#КонецЕсли
КонецПроцедуры
На сервере препроцессор не поможет: серверный код один для всех клиентов. Тип приложения берите из сеанса:
&НаСервере
Функция ЭтоВебКлиент()
Возврат ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения = "WebClient";
КонецФункции
Список всех веб-сеансов базы даёт функция ПолучитьСеансыИнформационнойБазы(). Ей нужны административные права:
&НаСервере
Процедура ВебСеансыНаСервере()
Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
Если Сеанс.ИмяПриложения <> "WebClient" Тогда
Продолжить;
КонецЕсли;
ИмяПользователя = ?(Сеанс.Пользователь = Неопределено, "<без пользователя>", Сеанс.Пользователь.Имя);
Сообщить(СтрШаблон("Сеанс %1 | %2 | %3 | с %4",
Формат(Сеанс.НомерСеанса, "ЧГ=0"),
ИмяПользователя,
Сеанс.ИмяКомпьютера,
Формат(Сеанс.НачалоСеанса, "ДФ='дд.ММ ЧЧ:мм'")));
КонецЦикла;
КонецПроцедуры
Человекочитаемое название типа даёт ПредставлениеПриложения("WebClient") — функция вернёт «Веб-клиент».
Чтобы понять, какой браузер у пользователя, создайте на клиенте Новый СистемнаяИнформация и прочитайте свойство ИнформацияПрограммыПросмотра. В веб-клиенте там строка User-Agent браузера, в тонком клиенте — пусто. Это помогает при разборе жалоб вида «у меня не открывается форма»: часто дело в неподдерживаемой версии браузера.
Как запретить или ограничить вход через браузер
Определить веб-клиент — полдела. Часто следующий вопрос: как сделать, чтобы через браузер заходили только те, кому положено. Уровней ограничения три.
| Уровень | Что делаем | Кого затрагивает |
|---|---|---|
| Права в конфигурации | Снимаем право «Веб-клиент» у роли | Конкретных пользователей |
| Публикация | Убираем доступ клиентских приложений или саму публикацию | Всех, кто ходит через этот веб-сервер |
| Веб-сервер | Аутентификация, фильтр по IP, HTTPS | Всех, кто открывает адрес публикации |
Права. У ролей есть отдельные права на запуск каждого вида клиента: «Тонкий клиент», «Толстый клиент», «Веб-клиент», «Внешнее соединение». Пользователь войдёт через браузер, только если хотя бы одна его роль даёт право «Веб-клиент». В типовых конфигурациях роли не правят напрямую: настройку делает разработчик через расширение, а пользователям назначают нужные группы доступа.
Публикация. В Конфигураторе откройте Администрирование → Публикация на веб-сервере. Флажок «Публиковать доступ для клиентских приложений» отвечает за веб-клиент и тонкий клиент по http. Если снять его, останутся только опубликованные веб-сервисы и HTTP-сервисы. Публикацию можно и удалить целиком кнопкой «Отключить».
Отключение публикации или перезапуск веб-сервера разрывают все текущие браузерные сеансы. Делайте это вне рабочего времени или после предупреждения пользователей.
Веб-сервер. Базу, доступную из интернета, без HTTPS не публикуют: иначе логин и пароль 1С идут открытым текстом. Дополнительно ограничьте доступ по IP-адресам или включите аутентификацию на уровне IIS или Apache. Не оставляйте пользователей 1С без пароля, если база опубликована наружу — адрес публикации находят перебором.
Когда в 1С не видно, кто зашёл: связка с логами веб-сервера
Классическая задача: в журнале видно, что пользователь Бухгалтер2 вошёл через браузер в 22:40, а сам сотрудник это отрицает. 1С покажет только веб-сервер. Дальше работают с логами самого веб-сервера.
- Возьмите из журнала регистрации точное время начала сеанса.
- Откройте лог веб-сервера. У IIS он по умолчанию лежит в
%SystemDrive%\inetpub\logs\LogFiles, у Apache — в каталоге логов, указанном в его конфигурации. - Найдите запросы к адресу публикации в ту же минуту.
- В строке лога будет IP клиента и строка User-Agent браузера.
Учтите часовой пояс: IIS по умолчанию пишет время в UTC. Для Москвы к времени из лога IIS прибавьте 3 часа, чтобы сравнить его с журналом 1С.
Если перед веб-сервером стоит прокси или балансировщик, в логе окажется его адрес. Тогда нужен лог прокси или заголовок с исходным IP клиента, который прокси передаёт дальше.
Частые вопросы
Можно ли определить веб-клиент в файловой базе?
Почему тонкий клиент показывает компьютер веб-сервера?
Тратит ли веб-клиент лицензию?
Как в коде отличить веб-клиент от мобильного клиента?
#Если ВебКлиент Тогда и #Если МобильныйКлиент Тогда. На сервере сравнивайте ИмяПриложения текущего сеанса с нужным значением.