В современной практике автоматизации часто возникает задача интеграции 1С с внешними веб-сервисами, мобильными приложениями или сторонними учетными системами. Одной из критических задач является оперативная печать фискальных чеков в 1С при совершении события (например, оплаты) во внешней системе. Поскольку 1С по своей природе не всегда является "слушающей" системой в режиме реального времени, выбор правильной архитектуры обмена имеет решающее значение.
Рассмотрим подробнее основные стратегии реализации такого взаимодействия, проанализируем их плюсы и минусы, а также разберем технические нюансы реализации каждой из них.
Это самый простой в реализации метод, который не требует глубокой настройки сетевой инфраструктуры. Суть заключается в том, что 1С периодически "опрашивает" API сторонней системы на предмет наличия новых данных для обработки.
Разберем по шагам реализацию этого механизма:
Для реализации в управляемом приложении мы используем метод ПодключитьОбработчикОжидания. Проанализируем пример кода:
// В модуле управляемого приложения или формы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Опрашиваем систему каждые 5 секунд
ПодключитьОбработчикОжидания("ПроверитьНовыеЧекиДляПечати", 5);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНовыеЧекиДляПечати()
ДанныеЧека = ПолучитьДанныеИзСтороннейСистемыСервер();
Если ДанныеЧека <> Неопределено Тогда
ПечататьЧекНаКассе(ДанныеЧека);
КонецЕсли;
КонецПроцедуры
Важный момент: данный метод создает постоянную нагрузку на сеть и сервер, так как запросы уходят даже тогда, когда новых данных нет. Однако, если задержка в 5–10 секунд допустима, это решение является наиболее жизнеспособным в условиях отсутствия статического IP-адреса.
Этот подход считается наиболее профессиональным и эффективным ("событийная модель"). Вместо того чтобы 1С "бегала" за данными, внешняя система сама уведомляет 1С о событии. Рассмотрим, как это работает: сторонняя система отправляет HTTP-запрос (POST) на адрес, где опубликован ваш 1С-сервис.
Выясним, что требуется для реализации этого метода:
HTTP-сервис с определенным шаблоном URL.default.vrd для ограничения доступа.Проанализируем пример реализации метода POST в HTTP-сервисе 1С для приема данных о чеке:
Функция ПечатьЧекаPost(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
// Читаем тело запроса (JSON с данными чека)
ДанныеСтрокой = Запрос.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ДанныеСтрокой);
СтруктураЧека = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Помещаем задание в очередь печати или обрабатываем сразу
МенеджерОборудованияСервер.СформироватьИНапечататьЧек(СтруктураЧека);
Ответ.УстановитьТелоИзСтроки("OK");
Возврат Ответ;
КонецФункции
Как отмечалось в обсуждении, для безопасности не нужно публиковать всю базу. Достаточно опубликовать один конкретный сервис и создать в 1С пользователя с минимальными правами, имеющего доступ только к этому сервису.
Если вы не хотите открывать порты и публиковать 1С в интернете из-за требований безопасности, но вам нужна мгновенная реакция, рассмотрим использование брокеров сообщений (например, RabbitMQ или MQTT).
Схема взаимодействия выглядит так:
Для реализации этого метода в 1С часто используются внешние компоненты (Native API), позволяющие работать по протоколу TCP или специализированным протоколам обмена сообщениями. Это позволяет обойти проблему отсутствия "белого" IP-адреса, так как инициатором соединения выступает сама 1С.
Рассмотрим модификацию первого метода, которая позволяет сократить количество бесполезных запросов. При Long Polling 1С отправляет запрос к API, но сервер не отвечает сразу, если данных нет. Он удерживает соединение открытым (например, 30 секунд). Если за это время появляется чек — сервер мгновенно отвечает. Если нет — соединение закрывается по таймауту, и 1С тут же открывает новое.
Этот метод обеспечивает реакцию, близкую к реальному времени, не требуя при этом публикации 1С как веб-сервера. Реализуется через объект HTTPСоединение с увеличенным временем ожидания.
При выборе варианта с HTTP-сервисами (Метод 2) необходимо уделить внимание сетевой безопасности. Посмотрим на рекомендации экспертов:
Подведем итог: если бюджет и время ограничены, а задержка в несколько секунд не критична — используйте ПодключитьОбработчикОжидания. Если же требуется масштабируемая система с мгновенной реакцией — правильным выбором будет реализация HTTP-сервиса на стороне 1С или использование схемы с очередями сообщений. Выбор конкретного метода зависит от лояльности разработчиков сторонней системы и возможности настройки сетевого оборудования на стороне 1С.