Как реализовать удаленный вызов процедур (RPC) из 1С в стороннее приложение

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современной разработке на платформе 1С:Предприятие часто возникает задача не просто обмена данными через файлы или таблицы, а прямого взаимодействия с функциями стороннего программного продукта. Механизм RPC (Remote Procedure Call) позволяет вызывать процедуры и функции удаленной системы так, будто они находятся внутри самой 1С. В этой статье мы подробно разберем, как реализовать такой функционал, проанализируем доступные инструменты и выберем оптимальные стратегии интеграции.

Решение 1: Реализация JSON-RPC через HTTP-протокол

Самым гибким и платформонезависимым методом является использование протокола 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С.

Решение 2: Использование механизмов Внешних источников данных

Если «удаленный вызов» в сторонней программе сводится к выполнению хранимых процедур в её базе данных, мы можем воспользоваться объектом ВнешниеИсточникиДанных. Этот метод позволяет 1С подключаться напрямую к СУБД (MS SQL, PostgreSQL, Oracle) и вызывать функции на уровне SQL.

Разберем по шагам процесс настройки:

  1. В дереве конфигурации создаем новый объект ВнешнийИсточникДанных.
  2. Настраиваем строку соединения через ODBC драйвер.
  3. Добавляем нужную таблицу или, что более важно для RPC, импортируем Функции из внешнего источника.
  4. Вызываем функцию из кода 1С, передавая параметры напрямую.

Предупреждение: Как было отмечено в обсуждении, системные администраторы часто ограничивают прямые доступы к базам данных из соображений безопасности. Если этот путь закрыт, следует вернуться к использованию API.

Решение 3: Интеграция через COM/OLE и внешние компоненты

Если стороннее приложение запущено на той же Windows-машине или сервере, что и 1С, можно использовать технологию COM. Рассмотрим ситуацию, когда у стороннего продукта есть зарегистрированная COM-библиотека.


Попытка
    ExternalApp = Новый COMОбъект("ExternalSoftware.Application");
    Результат = ExternalApp.ExecuteRemoteFunction("Param1", 100);
    // Обработка полученных данных
Исключение
    Сообщить("Не удалось подключиться к COM-объекту стороннего ПО");
КонецПопытки;

Для кроссплатформенных решений (Linux/Windows) рекомендуется использовать Внешние компоненты (Native SDK). Разберем этот подход: вы можете написать небольшую библиотеку на C++ или Rust, которая будет выступать посредником между 1С и RPC-сервером (например, для работы с протоколом gRPC). Это обеспечит максимальную производительность за счет бинарной сериализации данных.

Решение 4: Современный gRPC и Sidecar-приложения

Поскольку платформа 1С нативно не поддерживает протокол HTTP/2 и бинарный формат Protocol Buffers, необходимых для gRPC, мы можем применить паттерн Sidecar. Выясним причину популярности этого метода:

Рядом с сервером 1С запускается микросервис (написанный на Go или Python), который выступает в роли «переводчика». 1С отправляет простому микросервису обычный HTTP-запрос, а микросервис транслирует его в высокоскоростной gRPC-вызов к целевой системе. Это позволяет 1С работать с самыми современными технологиями, не покидая рамок встроенного языка.

Решение 5: Асинхронный RPC через очереди сообщений

В ситуациях, когда стороннее приложение может долго обрабатывать запрос, классический синхронный RPC (ожидание ответа) может привести к зависанию сеанса 1С. Проанализируем использование брокеров сообщений, таких как RabbitMQ или Apache Kafka.

В этом сценарии вызов процедуры выглядит так:

  1. 1С отправляет сообщение-запрос в очередь request_queue.
  2. Стороннее ПО считывает сообщение, выполняет код и отправляет результат в response_queue.
  3. 1С либо ожидает ответа в цикле (с таймаутом), либо получает его через регламентное задание.

Такой подход делает интеграцию отказоустойчивой: если внешняя система временно недоступна, вызов не потеряется, а будет обработан сразу после восстановления связи.

Резюме: Для большинства задач в 1С оптимальным выбором будет JSON-RPC через HTTP. Если же требуется критическая скорость и работа с современными микросервисами, следует рассмотреть разработку внешней компоненты или использование промежуточного Sidecar-сервиса.

← На главную