В современной разработке на платформе 1С всё чаще возникает потребность превратить тяжеловесную учетную систему в гибкий инструмент, где 1С отвечает только за интерфейс и хранение первичных данных, а сложная математика, расчеты или специфические алгоритмы выполняются во внешних сервисах. Это позволяет использовать возможности других языков программирования и снизить нагрузку на сервер 1С. Разберем подробно, как реализовать такую архитектуру, используя ESB (Enterprise Service Bus) и современные методы интеграции.
Основная идея, которую мы проанализируем, заключается в минимизации использования встроенного языка 1С для реализации бизнес-логики. В такой схеме 1С выступает в роли Frontend, а внешняя система или микросервис, подключенный через шину (ESB), — в роли Backend. Рассмотрим, как это работает на практике. Пользователь вводит данные в форму 1С, при изменении полей или нажатии кнопок система инициирует запрос к внешней шине, получает результат обработки и отображает его пользователю.
Для реализации этой схемы нам необходимо решить три основные задачи:
Как справедливо отмечено в обсуждении, наиболее универсальным и производительным способом взаимодействия является использование объекта HTTPСоединение. Посмотрим на пример реализации асинхронного вызова внешней логики из формы 1С. Проанализируем ситуацию: нам нужно рассчитать сложную скидку, алгоритм которой написан на Python и доступен через ESB.
Разберем по шагам создание процедуры для отправки данных:
&НаКлиенте
Асинхронная Процедура РассчитатьЛогикуНаСервере(ДанныеФормы)
// Подготавливаем структуру данных для отправки
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("ИдентификаторОбъекта", ДанныеФормы.Ссылка);
СтруктураЗапроса.Вставить("Сумма", ДанныеФормы.СуммаДокумента);
// Преобразуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
// Вызываем серверную функцию для взаимодействия с ESB
Результат = Ждать ВыполнитьЗапросКШинеАсинхронно(СтрокаЗапроса);
Если Результат.Статус = 200 Тогда
// Обновляем форму данными из ответа
ДанныеФормы.РезультатРасчета = Результат.Значение;
КонецЕсли;
КонецПроцедуры
Важно помнить, что использование HTTPСоединение на стороне сервера 1С позволяет гибко управлять таймаутами и заголовками запросов. Рассмотрим пример функции, которая непосредственно обращается к ESB:
&НаСервере
Функция ВыполнитьЗапросКШине(СтрокаJSON)
Сервер = "esb.company.ru";
Порт = 443;
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 10, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/api/v1/process-logic");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Попытка
Ответ = Соединение.ОтправитьДляОбъекта(Запрос);
Возврат Новый Структура("Статус, Значение", Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку());
Исключение
ЗаписьЖурналаРегистрации("Интеграция.ESB", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат Новый Структура("Статус, Значение", 500, "Ошибка связи");
КонецПопытки;
КонецФункции
При выносе логики вовне мы сталкиваемся с проблемой Chatty Interface. Если мы будем отправлять запрос на каждое изменение поля (событие ПриИзменении), пользователь почувствует значительные задержки (latency) из-за сетевых накладных расходов. Выясним причину: даже быстрый запрос занимает 100–300 мс, что при интенсивном вводе данных делает работу некомфортной.
Чтобы избежать этого, рекомендуем придерживаться следующих правил:
ПараметрыСеанса, чтобы не повторять идентичные запросы.ДлительныеОперации, чтобы пользователь мог продолжать заполнение формы, пока ESB обрабатывает тяжелые данные.В теме упоминался вариант использования HTML/JS форм. Это радикальный, но эффективный метод для узкоспециализированных задач. Мы можем вставить в форму 1С объект ПолеHTMLДокумента. В этом случае интерфейс отрисовывается на React или Vue, а 1С служит лишь оболочкой.
Связь между JS и 1С осуществляется через событие ПриНажатии (в 1С 8.3) или через механизм window.external. Это позволяет полностью изолировать логику отображения от метаданных 1С, оставляя платформе только функции записи итогового результата в базу данных.
Когда мы передаем данные в ESB, критически важно гарантировать, что транзакция в 1С (запись документа) и передача сообщения в шину произойдут совместно. Если 1С запишет данные, а шина упадет в этот момент — возникнет рассинхрон. Проанализируем решение через паттерн Outbox (входящая очередь).
Вместо прямой отправки из формы в момент записи документа:
ОчередьСообщенийESB.РегламентноеЗадание с определенной периодичностью (например, раз в 5 секунд) считывает записи из регистра, отправляет их в ESB и помечает как обработанные.Такой подход гарантирует at-least-once delivery (доставку хотя бы один раз) и делает систему устойчивой к кратковременным сбоям сети.
Разберем основные варианты ПО для построения шины, которые лучше всего стыкуются с 1С:
Подведем итог: Реализация «пустой» формы в 1С с выносом всей логики в ESB технически возможна и оправдана для высоконагруженных или интеллектуальных систем. Оптимальным инструментом для этого в платформе 8.3 являются асинхронные вызовы HTTPСоединение и использование паттерна Outbox для надежной передачи данных.