В современной разработке на платформе 1С:Предприятие часто возникает задача не просто обмена данными через файлы или таблицы, а прямого взаимодействия с функциями стороннего программного продукта. Механизм RPC (Remote Procedure Call) позволяет вызывать процедуры и функции удаленной системы так, будто они находятся внутри самой 1С. В этой статье мы подробно разберем, как реализовать такой функционал, проанализируем доступные инструменты и выберем оптимальные стратегии интеграции.
Самым гибким и платформонезависимым методом является использование протокола JSON-RPC. По сути, это оформление стандартного HTTPЗапрос в строго определенном формате. Рассмотрим подробнее структуру такого взаимодействия.
Для реализации этого метода нам необходимо сформировать структуру запроса, которая включает версию протокола, имя метода, параметры и уникальный идентификатор запроса. Проанализируем пример кода для отправки такого вызова:
// Формируем структуру запроса JSON-RPC 2.0
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("jsonrpc", "2.0");
ПараметрыЗапроса.Вставить("method", "get_external_data"); // Имя функции в сторонней системе
ПараметрыЗапроса.Вставить("id", Строка(Новый УникальныйИдентификатор()));
// Параметры, которые ожидает удаленная процедура
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("articul", "A105");
СтруктураПараметров.Вставить("warehouse_id", 12);
ПараметрыЗапроса.Вставить("params", СтруктураПараметров);
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
// Отправляем HTTP-запрос
НТТРСоединение = Новый HTTPСоединение("api.external-system.ru", , , , , 30);
Запрос = Новый HTTPЗапрос("/rpc_endpoint");
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Попытка
Ответ = НТТРСоединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Разбираем результат
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
Если ДанныеОтвета.Свойство("result") Тогда
РезультатПроцедуры = ДанныеОтвета.result;
КонецЕсли;
КонецЕсли;
Исключение
Сообщить("Ошибка вызова RPC: " + ОписаниеОшибки());
КонецПопытки;
Важно помнить, что даже если HTTP-статус ответа равен 200, внутри JSON может содержаться ошибка выполнения самой процедуры в поле error. Проанализируем ситуацию: если сторонняя система не нашла данные, она вернет объект ошибки, который нужно корректно обработать в 1С.
Если «удаленный вызов» в сторонней программе сводится к выполнению хранимых процедур в её базе данных, мы можем воспользоваться объектом ВнешниеИсточникиДанных. Этот метод позволяет 1С подключаться напрямую к СУБД (MS SQL, PostgreSQL, Oracle) и вызывать функции на уровне SQL.
Разберем по шагам процесс настройки:
Предупреждение: Как было отмечено в обсуждении, системные администраторы часто ограничивают прямые доступы к базам данных из соображений безопасности. Если этот путь закрыт, следует вернуться к использованию API.
Если стороннее приложение запущено на той же Windows-машине или сервере, что и 1С, можно использовать технологию COM. Рассмотрим ситуацию, когда у стороннего продукта есть зарегистрированная COM-библиотека.
Попытка
ExternalApp = Новый COMОбъект("ExternalSoftware.Application");
Результат = ExternalApp.ExecuteRemoteFunction("Param1", 100);
// Обработка полученных данных
Исключение
Сообщить("Не удалось подключиться к COM-объекту стороннего ПО");
КонецПопытки;
Для кроссплатформенных решений (Linux/Windows) рекомендуется использовать Внешние компоненты (Native SDK). Разберем этот подход: вы можете написать небольшую библиотеку на C++ или Rust, которая будет выступать посредником между 1С и RPC-сервером (например, для работы с протоколом gRPC). Это обеспечит максимальную производительность за счет бинарной сериализации данных.
Поскольку платформа 1С нативно не поддерживает протокол HTTP/2 и бинарный формат Protocol Buffers, необходимых для gRPC, мы можем применить паттерн Sidecar. Выясним причину популярности этого метода:
Рядом с сервером 1С запускается микросервис (написанный на Go или Python), который выступает в роли «переводчика». 1С отправляет простому микросервису обычный HTTP-запрос, а микросервис транслирует его в высокоскоростной gRPC-вызов к целевой системе. Это позволяет 1С работать с самыми современными технологиями, не покидая рамок встроенного языка.
В ситуациях, когда стороннее приложение может долго обрабатывать запрос, классический синхронный RPC (ожидание ответа) может привести к зависанию сеанса 1С. Проанализируем использование брокеров сообщений, таких как RabbitMQ или Apache Kafka.
В этом сценарии вызов процедуры выглядит так:
request_queue.response_queue.Такой подход делает интеграцию отказоустойчивой: если внешняя система временно недоступна, вызов не потеряется, а будет обработан сразу после восстановления связи.
Резюме: Для большинства задач в 1С оптимальным выбором будет JSON-RPC через HTTP. Если же требуется критическая скорость и работа с современными микросервисами, следует рассмотреть разработку внешней компоненты или использование промежуточного Sidecar-сервиса.