Как программно запретить внешние соединения (COM и Web-сервисы) в 1С

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

В процессе администрирования баз 1С часто возникает задача ограничить доступ внешним системам в определенные периоды времени (например, во время закрытия месяца или технического обслуживания) или для конкретных пользователей. При этом важно, чтобы обычные пользователи и регламентные задания продолжали работать в штатном режиме. Рассмотрим подробнее, как идентифицировать тип соединения и реализовать механизм блокировки.

Использование модуля сеанса для контроля подключений

Самый эффективный способ управления доступом — использование обработчика УстановкаПараметровСеанса в модуле сеанса. Это событие срабатывает при инициализации любого нового сеанса до того, как пользователь или внешняя система начнут выполнять какие-либо действия. Разберем, как прописать логику проверки в этом методе.

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

Идентификация типа соединения

Основная сложность заключается в том, чтобы отличить обычного пользователя от Web-сервиса или COM-соединения. Для этого в платформе 1С предусмотрен метод ИмяПриложения(). Проанализируем основные значения, которые возвращает эта функция:

Пример программной блокировки по времени и роли

Рассмотрим ситуацию, когда нам необходимо запретить внешние соединения после окончания рабочего дня (например, после 18:00) для всех, у кого нет специальной административной роли. Пропишем соответствующее условие в процедуре УстановкаПараметровСеанса:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    ТекущееИмяПриложения = ИмяПриложения();
    
    // Проверяем, является ли соединение внешним (COM или Web-сервис)
    ЭтоВнешнееСоединение = (ТекущееИмяПриложения = "COMConnection") 
                           ИЛИ (ТекущееИмяПриложения = "WebService")
                           ИЛИ (ТекущееИмяПриложения = "OData");
    
    Если ЭтоВнешнееСоединение Тогда
        
        // Проверяем время доступа (запрет после 18:00)
        ТекущийЧас = Час(ТекущаяДатаСеанса());
        Если ТекущийЧас >= 18 Тогда
            // Проверяем наличие исключающей роли у пользователя
            Если НЕ РольДоступна("АдминистраторСистемы") Тогда
                ВызватьИсключение "Доступ внешним сервисам в нерабочее время запрещен!";
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Важный нюанс: при использовании V83.Application вместо V83.ComConnector, метод ИмяПриложения() вернет 1CV8, что соответствует обычному клиенту. Если вы используете такой способ подключения, идентификацию лучше проводить по специально выделенному пользователю.

Альтернативные способы ограничения Web-сервисов

Если задача стоит в полном отключении Web-сервисов без изменения программного кода, можно воспользоваться настройками публикации на веб-сервере (IIS или Apache). Разберем шаги:

  1. Найдите файл публикации default.vrd в каталоге, где опубликована база.
  2. Для отключения конкретного сервиса можно установить параметр enabled="false" в соответствующей секции или просто удалить описание точки доступа.
  3. Также в файле default.vrd можно настроить пулы соединений, ограничив максимальное количество сеансов, чтобы внешние запросы не потребляли все ресурсы сервера.

Использование параметров запуска и кода разрешения

Выясним еще один способ контроля — использование параметров блокировки на уровне кластера серверов 1С. Если через консоль администрирования установить блокировку начала сеансов, можно указать специальный "Код разрешения".

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

Для программного анализа сеансов в коде можно использовать функцию ПолучитьСеансыИнформационнойБазы(). Свойство ИмяПриложения объекта СеансИнформационнойБазы позволит получить ту же информацию о типе клиента, что и рассмотренная выше функция ИмяПриложения(), но уже в контексте мониторинга списка активных подключений.

← На главную