Платформа 1С 7.7 была создана задолго до эпохи микросервисов и REST API, поэтому в ней отсутствуют штатные механизмы для публикации HTTP-сервисов. Однако современные задачи часто требуют интеграции старых систем с мобильными приложениями, веб-сайтами или другими сервисами. В этой статье мы подробно разберем, как превратить 1С 7.7 в «слушателя» HTTP-запросов, используя различные архитектурные подходы.
Проанализируем наиболее стабильный способ решения задачи. Поскольку сама 1С 7.7 не умеет открывать TCP-порты и слушать входящий трафик без блокировки основного интерфейса, мы можем вынести эту логику во внешнее приложение, написанное на современном языке программирования (Go, C#, Python или Node.js). Для реализации этой схемы на платформе Microsoft будет полезен обзор средств интеграции 1С и .NET.
Схема работы выглядит следующим образом:
V77.Application.Рассмотрим пример того, как это может быть реализовано концептуально. Для ускорения работы рекомендуется не создавать новое 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("ГлобальнаяФункцияОбработкиЗапроса(Параметры)");
КонецЕсли;
Разберем асинхронный подход. Мы можем разработать или использовать готовую внешнюю компоненту (например, на .NET/C# с использованием HttpListener), которая будет загружена непосредственно в сеанс 1С 7.7. Это решение подходит для тех случаев, когда у вас уже запущен «робот» — отдельный сеанс 1С, предназначенный для обмена данными. В качестве альтернативного бесконфликтного варианта приема внешних вызовов можно применить прокси-сервис для трансляции REST API запросов в WebSocket.
Алгоритм реализации:
ЗагрузитьВнешнююКомпоненту.ОбработкаВнешнегоСобытия.Проанализируем код внутри 1С для обработки такого события:
Процедура ПриНачалеРаботыСистемы()
Если ЗагрузитьВнешнююКомпоненту("MyHttpServer.dll") <> 0 Тогда
Сервер = СоздатьОбъект("Addin.MyHttpServer");
Сервер.Запустить(8080);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если (Источник = "MyHttpServer") И (Событие = "IncomingRequest") Тогда
// Данные содержат тело запроса или ID запроса в памяти
Ответ = ОбработатьЗапрос(Данные);
Сервер.ОтправитьОтвет(Ответ);
КонецЕсли;
КонецПроцедуры
Важный нюанс: 1С 7.7 является однопоточной системой. Если в момент поступления запроса 1С занята проведением тяжелого документа, ОбработкаВнешнегоСобытия встанет в очередь и выполнится только после завершения текущей операции. Это может привести к таймаутам на стороне клиента.
Если ваша база 1С 7.7 работает на MS SQL Server, мы можем применить стратегию «общей таблицы». В этом случае HTTP-сервис (на любом языке) пишет данные напрямую в SQL-таблицу, а 1С считывает их. Чтобы сделать это максимально оперативно, используем библиотеку 1C++.
Выясним причину популярности этого метода: он самый отказоустойчивый. Даже если 1С «вылетит», HTTP-сервис продолжит принимать заказы или сообщения, записывая их в очередь SQL. Рассмотрим шаги реализации:
IncomingQueue.New.ODBCRecordset.Processed.Современные веб-сервисы общаются на языке 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-соединений. Это обеспечит нужную скорость реакции и стабильность работы системы.