Многие разработчики сталкиваются с ситуацией, когда обмен данными с мобильными приложениями или внешним оборудованием реализован через обработчик ВнешнееСобытие (ExternalEvent). Основная проблема такого подхода заключается в том, что для работы этого механизма требуется постоянно запущенный сеанс 1С («Тонкий» или «Толстый» клиент). Это не только нерационально расходует ресурсы сервера, но и снижает надежность системы: сеанс может «зависнуть», вылететь по ошибке или закрыться при обновлении системы.
В этой статье мы подробно разберем, почему нельзя просто перенести этот обработчик в модуль объекта, и рассмотрим современные способы реализации фонового обмена, которые позволят вашей базе работать автономно 24/7.
Проанализируем техническую природу события ВнешнееСобытие. Этот механизм был разработан для взаимодействия 1С с внешними компонентами (драйверами оборудования, COM-объектами) на стороне клиента. Когда внешнее устройство или программа хочет передать данные в 1С, она отправляет специальное сообщение операционной системе Windows. Клиентское приложение 1С «слушает» эти сообщения и, поймав нужное, генерирует событие в активной форме или модуле обычного приложения.
Ключевое ограничение: Серверный процесс 1С (кластер серверов) работает в режиме службы. У него нет графического интерфейса, нет «окон» в терминах Windows и, соответственно, нет цикла обработки сообщений, которые необходимы для работы ExternalEvent. Именно поэтому попытка вызвать этот обработчик в фоновом или регламентном задании технически невозможна.
Наиболее правильным и современным способом организации обмена с мобильным приложением является создание HTTP-сервиса. Вместо того чтобы «стучаться» в открытое окно 1С, мобильное приложение отправляет HTTP-запрос (POST или GET) непосредственно на сервер 1С. База при этом должна быть опубликована на веб-сервере (Apache или IIS).
Рассмотрим преимущества этого метода:
Если ваша конфигурация находится на поддержке («замочке»), вы можете реализовать HTTP-сервис в Расширении. Разберем по шагам, как это сделать:
HTTP-сервисы./exchange/) и метод (например, POST).Пример кода для обработки данных, которые раньше приходили в «ТелоЗапроса»:
Функция exchangePOST(Запрос)
// Получаем данные из тела HTTP-запроса
ДанныеJSON = Запрос.ПолучитьТелоКакСтроку();
// Здесь размещаем логику, которая раньше была в процедуре ВнешнееСобытие
Попытка
ОбработатьДанныеОбмена(ДанныеJSON);
Ответ = Новый HTTPСервисОтвет(200); // OK
Ответ.УстановитьТелоИзСтроки("Данные успешно приняты");
Исключение
Ответ = Новый HTTPСервисОтвет(500); // Ошибка сервера
Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
КонецПопытки;
Возврат Ответ;
КонецФункции
Бывают случаи, когда мобильное приложение невозможно быстро переделать для работы по протоколу HTTP. В такой ситуации мы можем использовать «прокладку» — промежуточное хранилище данных.
Проанализируем схему работы через буфер:
РегламентноеЗадание, которое запускается с определенной периодичностью (например, раз в 30 секунд).Разберем пример кода регламентного задания, которое имитирует работу обработчика:
Процедура ВыполнитьОбменДаннымиФоново() Экспорт
// Логика опроса внешнего ресурса (например, FTP или HTTP-API)
МассивНовыхДанных = ПроверитьНаличиеНовыхДанныхВБуфере();
Для Каждого ПакетДанных Из МассивНовыхДанных Цикл
// Вызываем логику обработки, перенесенную из модуля формы
ОбработкаДанныхСервер.ОбработатьПакет(ПакетДанных);
КонецЦикла;
КонецПроцедуры
Важный нюанс: Логику обработки данных необходимо вынести из модуля формы обработки в ОбщийМодуль с установленными флажками Сервер и Вызов сервера. Это позволит использовать один и тот же код и в интерактивном режиме, и в фоновом задании.
Если мобильное приложение требует строгого описания типов данных (WSDL), стоит рассмотреть Web-сервисы. Они работают аналогично HTTP-сервисам, но используют протокол SOAP. Это более «тяжеловесный» вариант, но он идеально подходит для интеграции со старыми корпоративными системами, которые жестко ориентированы на XML-стандарты.
Как и в случае с HTTP, Web-сервисы можно добавить через Расширение, сохранив основную конфигурацию в неизменном виде. Вызов методов такого сервиса не требует запущенного сеанса пользователя.
Для того чтобы избавиться от «вечно запущенного сеанса», мы должны перевести архитектуру обмена с событийной модели на стороне клиента на сервисную модель на стороне сервера.
Рассмотрим алгоритм перехода:
ВнешнееСобытие в серверный общий модуль. Убедитесь, что код не обращается к элементам формы (кнопкам, таблицам на экране).HTTP-сервисы. Если нет — используйте РегламентныеЗадания с опросом промежуточного буфера.Реализовав один из этих подходов, вы добьетесь стабильной работы обмена в режиме 24/7, снизите нагрузку на сервер и исключите человеческий фактор (случайное закрытие окна 1С администратором или пользователем).