В процессе администрирования баз 1С часто возникает задача ограничить доступ внешним системам в определенные периоды времени (например, во время закрытия месяца или технического обслуживания) или для конкретных пользователей. При этом важно, чтобы обычные пользователи и регламентные задания продолжали работать в штатном режиме. Рассмотрим подробнее, как идентифицировать тип соединения и реализовать механизм блокировки.
Самый эффективный способ управления доступом — использование обработчика УстановкаПараметровСеанса в модуле сеанса. Это событие срабатывает при инициализации любого нового сеанса до того, как пользователь или внешняя система начнут выполнять какие-либо действия. Разберем, как прописать логику проверки в этом методе.
Для того чтобы прервать соединение, достаточно вызвать функцию ВызватьИсключение. В этом случае инициализация сеанса будет прекращена, а внешняя система получит сообщение об ошибке.
Основная сложность заключается в том, чтобы отличить обычного пользователя от Web-сервиса или COM-соединения. Для этого в платформе 1С предусмотрен метод ИмяПриложения(). Проанализируем основные значения, которые возвращает эта функция:
V83.COMConnector.Рассмотрим ситуацию, когда нам необходимо запретить внешние соединения после окончания рабочего дня (например, после 18:00) для всех, у кого нет специальной административной роли. Пропишем соответствующее условие в процедуре УстановкаПараметровСеанса:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
ТекущееИмяПриложения = ИмяПриложения();
// Проверяем, является ли соединение внешним (COM или Web-сервис)
ЭтоВнешнееСоединение = (ТекущееИмяПриложения = "COMConnection")
ИЛИ (ТекущееИмяПриложения = "WebService")
ИЛИ (ТекущееИмяПриложения = "OData");
Если ЭтоВнешнееСоединение Тогда
// Проверяем время доступа (запрет после 18:00)
ТекущийЧас = Час(ТекущаяДатаСеанса());
Если ТекущийЧас >= 18 Тогда
// Проверяем наличие исключающей роли у пользователя
Если НЕ РольДоступна("АдминистраторСистемы") Тогда
ВызватьИсключение "Доступ внешним сервисам в нерабочее время запрещен!";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный нюанс: при использовании V83.Application вместо V83.ComConnector, метод ИмяПриложения() вернет 1CV8, что соответствует обычному клиенту. Если вы используете такой способ подключения, идентификацию лучше проводить по специально выделенному пользователю.
Если задача стоит в полном отключении Web-сервисов без изменения программного кода, можно воспользоваться настройками публикации на веб-сервере (IIS или Apache). Разберем шаги:
default.vrd в каталоге, где опубликована база.enabled="false" в соответствующей секции или просто удалить описание точки доступа.default.vrd можно настроить пулы соединений, ограничив максимальное количество сеансов, чтобы внешние запросы не потребляли все ресурсы сервера.Выясним еще один способ контроля — использование параметров блокировки на уровне кластера серверов 1С. Если через консоль администрирования установить блокировку начала сеансов, можно указать специальный "Код разрешения".
В этом случае, чтобы внешнее соединение могло подключиться к заблокированной базе, в строке соединения необходимо передать параметр /UC <КодРазрешения>. Это позволяет точечно разрешить доступ критически важным сервисам, блокируя при этом всех остальных пользователей.
Для программного анализа сеансов в коде можно использовать функцию ПолучитьСеансыИнформационнойБазы(). Свойство ИмяПриложения объекта СеансИнформационнойБазы позволит получить ту же информацию о типе клиента, что и рассмотренная выше функция ИмяПриложения(), но уже в контексте мониторинга списка активных подключений.