Как перенести обработку внешнего события на сервер и избавиться от постоянно запущенного сеанса 1С

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

Многие разработчики сталкиваются с ситуацией, когда обмен данными с мобильными приложениями или внешним оборудованием реализован через обработчик ВнешнееСобытие (ExternalEvent). Основная проблема такого подхода заключается в том, что для работы этого механизма требуется постоянно запущенный сеанс 1С («Тонкий» или «Толстый» клиент). Это не только нерационально расходует ресурсы сервера, но и снижает надежность системы: сеанс может «зависнуть», вылететь по ошибке или закрыться при обновлении системы.

В этой статье мы подробно разберем, почему нельзя просто перенести этот обработчик в модуль объекта, и рассмотрим современные способы реализации фонового обмена, которые позволят вашей базе работать автономно 24/7.

Почему «Внешнее событие» не работает в фоновых заданиях

Проанализируем техническую природу события ВнешнееСобытие. Этот механизм был разработан для взаимодействия 1С с внешними компонентами (драйверами оборудования, COM-объектами) на стороне клиента. Когда внешнее устройство или программа хочет передать данные в 1С, она отправляет специальное сообщение операционной системе Windows. Клиентское приложение 1С «слушает» эти сообщения и, поймав нужное, генерирует событие в активной форме или модуле обычного приложения.

Ключевое ограничение: Серверный процесс 1С (кластер серверов) работает в режиме службы. У него нет графического интерфейса, нет «окон» в терминах Windows и, соответственно, нет цикла обработки сообщений, которые необходимы для работы ExternalEvent. Именно поэтому попытка вызвать этот обработчик в фоновом или регламентном задании технически невозможна.

Решение №1: Использование HTTP-сервисов (рекомендуемый путь)

Наиболее правильным и современным способом организации обмена с мобильным приложением является создание HTTP-сервиса. Вместо того чтобы «стучаться» в открытое окно 1С, мобильное приложение отправляет HTTP-запрос (POST или GET) непосредственно на сервер 1С. База при этом должна быть опубликована на веб-сервере (Apache или IIS).

Рассмотрим преимущества этого метода:

  1. Отсутствие лишних сеансов: Сеанс создается сервером автоматически в момент поступления запроса и завершается сразу после отправки ответа.
  2. Высокая скорость: Отсутствуют задержки, связанные с отрисовкой интерфейса.
  3. Масштабируемость: Сервер может обрабатывать десятки параллельных запросов от разных мобильных устройств.

Если ваша конфигурация находится на поддержке («замочке»), вы можете реализовать HTTP-сервис в Расширении. Разберем по шагам, как это сделать:

  1. Создайте новое расширение конфигурации.
  2. Добавьте в расширение объект HTTP-сервисы.
  3. Определите шаблон URL (например, /exchange/) и метод (например, POST).
  4. В модуле HTTP-сервиса напишите код обработки входящих данных.

Пример кода для обработки данных, которые раньше приходили в «ТелоЗапроса»:


Функция exchangePOST(Запрос)
    
    // Получаем данные из тела HTTP-запроса
    ДанныеJSON = Запрос.ПолучитьТелоКакСтроку();
    
    // Здесь размещаем логику, которая раньше была в процедуре ВнешнееСобытие
    Попытка
        ОбработатьДанныеОбмена(ДанныеJSON);
        Ответ = Новый HTTPСервисОтвет(200); // OK
        Ответ.УстановитьТелоИзСтроки("Данные успешно приняты");
    Исключение
        Ответ = Новый HTTPСервисОтвет(500); // Ошибка сервера
        Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
    КонецПопытки;
    
    Возврат Ответ;
    
КонецФункции

Решение №2: Использование очереди сообщений (Промежуточный буфер)

Бывают случаи, когда мобильное приложение невозможно быстро переделать для работы по протоколу HTTP. В такой ситуации мы можем использовать «прокладку» — промежуточное хранилище данных.

Проанализируем схему работы через буфер:

  1. Мобильное приложение отправляет данные не напрямую в 1С, а в промежуточную БД (например, SQLite или простейший сервис на веб-хостинге) или выкладывает файл на FTP-сервер.
  2. В 1С настраивается РегламентноеЗадание, которое запускается с определенной периодичностью (например, раз в 30 секунд).
  3. Регламентное задание опрашивает буфер: «Есть ли новые заказы/обновления?».
  4. Если данные найдены, 1С забирает их и обрабатывает на стороне сервера.

Разберем пример кода регламентного задания, которое имитирует работу обработчика:


Процедура ВыполнитьОбменДаннымиФоново() Экспорт
    
    // Логика опроса внешнего ресурса (например, FTP или HTTP-API)
    МассивНовыхДанных = ПроверитьНаличиеНовыхДанныхВБуфере();
    
    Для Каждого ПакетДанных Из МассивНовыхДанных Цикл
        // Вызываем логику обработки, перенесенную из модуля формы
        ОбработкаДанныхСервер.ОбработатьПакет(ПакетДанных);
    КонецЦикла;
    
КонецПроцедуры

Важный нюанс: Логику обработки данных необходимо вынести из модуля формы обработки в ОбщийМодуль с установленными флажками Сервер и Вызов сервера. Это позволит использовать один и тот же код и в интерактивном режиме, и в фоновом задании.

Решение №3: Web-сервисы (SOAP)

Если мобильное приложение требует строгого описания типов данных (WSDL), стоит рассмотреть Web-сервисы. Они работают аналогично HTTP-сервисам, но используют протокол SOAP. Это более «тяжеловесный» вариант, но он идеально подходит для интеграции со старыми корпоративными системами, которые жестко ориентированы на XML-стандарты.

Как и в случае с HTTP, Web-сервисы можно добавить через Расширение, сохранив основную конфигурацию в неизменном виде. Вызов методов такого сервиса не требует запущенного сеанса пользователя.

Подведем итоги

Для того чтобы избавиться от «вечно запущенного сеанса», мы должны перевести архитектуру обмена с событийной модели на стороне клиента на сервисную модель на стороне сервера.

Рассмотрим алгоритм перехода:

  1. Выделение логики: Перенесите весь код обработки данных из процедуры ВнешнееСобытие в серверный общий модуль. Убедитесь, что код не обращается к элементам формы (кнопкам, таблицам на экране).
  2. Выбор транспорта: Если есть возможность изменить мобильное приложение — выбирайте HTTP-сервисы. Если нет — используйте РегламентныеЗадания с опросом промежуточного буфера.
  3. Использование расширений: Если база на поддержке, создавайте все новые объекты (сервисы, задания) в расширении. Это позволит обновлять типовую конфигурацию без проблем.

Реализовав один из этих подходов, вы добьетесь стабильной работы обмена в режиме 24/7, снизите нагрузку на сервер и исключите человеческий фактор (случайное закрытие окна 1С администратором или пользователем).

← На главную