Как реализовать HTTP-сервисы в 1С 7.7 для приема входящих запросов

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Платформа 1С 7.7 была создана задолго до эпохи микросервисов и REST API, поэтому в ней отсутствуют штатные механизмы для публикации HTTP-сервисов. Однако современные задачи часто требуют интеграции старых систем с мобильными приложениями, веб-сайтами или другими сервисами. В этой статье мы подробно разберем, как превратить 1С 7.7 в «слушателя» HTTP-запросов, используя различные архитектурные подходы.

Метод 1: Внешнее приложение-посредник (Middleware)

Проанализируем наиболее стабильный способ решения задачи. Поскольку сама 1С 7.7 не умеет открывать TCP-порты и слушать входящий трафик без блокировки основного интерфейса, мы можем вынести эту логику во внешнее приложение, написанное на современном языке программирования (Go, C#, Python или Node.js). Для реализации этой схемы на платформе Microsoft будет полезен обзор средств интеграции 1С и .NET.

Схема работы выглядит следующим образом:

  1. Внешнее приложение (EXE-файл или служба) запускает HTTP-сервер на определенном порту (например, 8080).
  2. При поступлении запроса приложение устанавливает COM-соединение с базой 1С 7.7, используя объект V77.Application.
  3. Приложение вызывает экспортную функцию в 1С, передает туда параметры запроса и получает результат.
  4. Полученный ответ возвращается клиенту в формате JSON или XML.

Рассмотрим пример того, как это может быть реализовано концептуально. Для ускорения работы рекомендуется не создавать новое OLE-соединение на каждый запрос, а держать пул уже запущенных процессов 1С. Разберем «грязный хак», упомянутый экспертами: динамическое выполнение кода через текстовый файл. Это позволяет передавать в 1С произвольный алгоритм обработки без изменения самой конфигурации.

Пример кода инициализации OLE-соединения (на языке 1С для понимания контекста):


// Инициализация соединения из внешнего приложения
V7 = CreateObject("V77.Application");
Открыта = V7.Initialize(V7.RMTrade, "/d""C:\Bases\MyBase"" /n""Robot"" /p""Pass""", "NO_SPLASH_SHOW");
Если Открыта = 1 Тогда
    // Вызов функции из глобального модуля или внешней обработки
    Результат = V7.EvalExpr("ГлобальнаяФункцияОбработкиЗапроса(Параметры)");
КонецЕсли;

Метод 2: Использование внешних компонент (ВК) и внешних событий

Разберем асинхронный подход. Мы можем разработать или использовать готовую внешнюю компоненту (например, на .NET/C# с использованием HttpListener), которая будет загружена непосредственно в сеанс 1С 7.7. Это решение подходит для тех случаев, когда у вас уже запущен «робот» — отдельный сеанс 1С, предназначенный для обмена данными. В качестве альтернативного бесконфликтного варианта приема внешних вызовов можно применить прокси-сервис для трансляции REST API запросов в WebSocket.

Алгоритм реализации:

  1. Загружаем ВК в 1С с помощью команды ЗагрузитьВнешнююКомпоненту.
  2. Компонента запускает поток прослушивания порта.
  3. При получении HTTP-запроса ВК генерирует внешнее событие в платформу.
  4. В 1С срабатывает предопределенная процедура ОбработкаВнешнегоСобытия.

Проанализируем код внутри 1С для обработки такого события:


Процедура ПриНачалеРаботыСистемы()
    Если ЗагрузитьВнешнююКомпоненту("MyHttpServer.dll") <> 0 Тогда
        Сервер = СоздатьОбъект("Addin.MyHttpServer");
        Сервер.Запустить(8080);
    КонецЕсли;
КонецПроцедуры

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если (Источник = "MyHttpServer") И (Событие = "IncomingRequest") Тогда
        // Данные содержат тело запроса или ID запроса в памяти
        Ответ = ОбработатьЗапрос(Данные);
        Сервер.ОтправитьОтвет(Ответ);
    КонецЕсли;
КонецПроцедуры

Важный нюанс: 1С 7.7 является однопоточной системой. Если в момент поступления запроса 1С занята проведением тяжелого документа, ОбработкаВнешнегоСобытия встанет в очередь и выполнится только после завершения текущей операции. Это может привести к таймаутам на стороне клиента.

Метод 3: Интеграция через SQL-таблицы (для SQL-версий)

Если ваша база 1С 7.7 работает на MS SQL Server, мы можем применить стратегию «общей таблицы». В этом случае HTTP-сервис (на любом языке) пишет данные напрямую в SQL-таблицу, а 1С считывает их. Чтобы сделать это максимально оперативно, используем библиотеку 1C++.

Выясним причину популярности этого метода: он самый отказоустойчивый. Даже если 1С «вылетит», HTTP-сервис продолжит принимать заказы или сообщения, записывая их в очередь SQL. Рассмотрим шаги реализации:

  1. Создаем в SQL базу данных-прослойку с таблицей IncomingQueue.
  2. Внешний HTTP-сервер записывает туда JSON-запрос и ставит статус New.
  3. В 1С 7.7 запускаем обработку, которая по таймеру (или в бесконечном цикле с паузой) опрашивает таблицу через ODBCRecordset.
  4. После обработки 1С записывает результат обратно в SQL и меняет статус на Processed.

Проблема парсинга JSON и кодировок

Современные веб-сервисы общаются на языке JSON в кодировке UTF-8. В 1С 7.7 нет встроенного парсера JSON, а родная кодировка — Windows-1251. Выясним, как решить эти проблемы.

Для парсинга JSON рекомендуем использовать объект MSScriptControl.ScriptControl. Мы можем «подсунуть» ему движок JavaScript, который нативно понимает формат JSON. Посмотрим на пример функции:


Функция РазобратьJSON(ТекстJSON)
    ScriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
    ScriptCtrl.Language = "jscript";
    // Добавляем функцию-обертку для парсинга
    ScriptCtrl.AddCode("function getObj(s) { return eval('(' + s + ')'); }");
    ОбъектJSON = ScriptCtrl.Run("getObj", ТекстJSON);
    Возврат ОбъектJSON;
КонецФункции

Что касается кодировок, при использовании OLE или внешних компонент обязательно выполняйте перекодировку. Если данные приходят в UTF-8, их нужно преобразовать в ANSI (Windows-1251) перед обработкой в 1С, иначе вместо кириллицы вы получите «кракозябры». Для этого можно использовать объект ADODB.Stream.

Безопасность и масштабирование

Поскольку 1С 7.7 не предназначена для высоких нагрузок, при реализации HTTP-сервисов придерживайтесь следующих правил:

Подводя итог, можно сказать, что создание HTTP-сервисов для 1С 7.7 — задача трудоемкая, но выполнимая. Оптимальным выбором на сегодня является создание небольшого сервиса-моста на языке Go или C#, который будет управлять пулом OLE-соединений. Это обеспечит нужную скорость реакции и стабильность работы системы.

← На главную