В современной корпоративной среде технологии распределенного реестра (блокчейн) перестают быть только инструментом для криптовалют и находят реальное применение в управлении цепочками поставок, электронном документообороте и контроле активов. Одной из наиболее подходящих платформ для таких задач является Hyperledger Iroha. Однако при попытке подружить 1С с этим миром разработчик сталкивается с серьезным техническим барьером: протоколом gRPC.
В данной статье мы подробно разберем, как построить мост между 1С и распределенным реестром, преодолев ограничения платформы в части поддержки современных сетевых протоколов.
Прежде чем приступать к коду, проанализируем инфраструктуру. Платформа Hyperledger обычно разворачивается в среде Linux. Для разработки на Windows оптимальным выбором будет связка Docker и подсистемы WSL2 (Windows Subsystem for Linux) с дистрибутивом Ubuntu.
Последовательность развертывания выглядит следующим образом:
50051 (дефолтный порт gRPC) через telnet.Основная сложность заключается в том, что 1С работает преимущественно с протоколами HTTP/1.1, в то время как gRPC требует HTTP/2 и бинарную сериализацию данных (Protocol Buffers). На текущий момент платформа 1С не умеет нативно выполнять произвольные gRPC-вызовы. Поэтому мы будем использовать Node.js в качестве посредника.
Для взаимодействия с реестром нам понадобится скрипт на Node.js, который будет принимать данные от 1С и отправлять их в блокчейн-сеть. Рассмотрим пример настройки проекта и установки необходимых библиотек.
Выполним в терминале установку зависимостей:
npm install grpc
npm i iroha-helpers
Разберем пример кода на JavaScript, который инициализирует соединение с сервисом команд и запросов Hyperledger Iroha. Обратите внимание на использование import и необходимость настройки package.json с параметром "type": "module" для корректной работы в современных версиях Node.js.
import grpc from 'grpc'
import { QueryService_v1Client, CommandService_v1Client } from '../iroha-helpers/lib/proto/endpoint_grpc_pb'
import { commands, queries } from 'iroha-helpers'
const IROHA_ADDRESS = 'localhost:50051'
const adminPriv = 'f101537e319568c765b2cc89698325604991dca57b9716b58016b253506cab70'
const commandService = new CommandService_v1Client(
IROHA_ADDRESS,
grpc.credentials.createInsecure
)
const queryService = new QueryService_v1Client(
IROHA_ADDRESS,
grpc.credentials.createInsecure
)
Promise.all([
commands.setAccountDetail({
privateKeys: [adminPriv],
creatorAccountId: 'admin@test',
quorum: 1,
commandService
}, {
accountId: 'admin@test',
key: 'jason',
value: 'statham'
}),
queries.getAccountDetail({
privateKey: adminPriv,
creatorAccountId: 'admin@test',
queryService
}, {
accountId: 'admin@test'
})
])
.then(a => console.log(a))
.catch(e => console.error(e))
Теперь выясним, как вызвать этот код из 1С. Самый простой и надежный способ — использование объекта WScript.Shell для запуска Node.js с передачей параметров через командную строку или временные JSON-файлы.
Рассмотрим по шагам процесс выполнения запроса из 1С:
.js файл).WshShell.Run.Пример программного кода в 1С:
// Подготовка данных для реестра
ДанныеУПД = Новый Структура;
ДанныеУПД.Вставить("Номер", "INV-001");
ДанныеУПД.Вставить("Дата", ТекущаяДата());
// Сериализация в JSON...
// Вызов внешнего скрипта
ПутьКФайлуСкрипта = КаталогВременныхФайлов() + "grpc_client.js";
Скрипт = Новый ТекстовыйДокумент;
Скрипт.УстановитьТекст("// Код на JS для отправки данных в Iroha");
Скрипт.Записать(ПутьКФайлуСкрипта, КодировкаТекста.ANSI);
WshShell = Новый COMОбъект("WScript.Shell");
// Запускаем node.js и ждем завершения (параметр 1, Истина)
КодВозврата = WshShell.Run("node """ + ПутьКФайлуСкрипта + """", 0, Истина);
Если КодВозврата = 0 Тогда
Сообщить("Данные успешно записаны в распределенный реестр");
Иначе
Сообщить("Ошибка при выполнении gRPC запроса");
КонецЕсли;
Если решение с запуском внешних скриптов кажется недостаточно производительным, проанализируем альтернативный вариант — использование gRPC-Gateway. Это специализированный прокси-сервер, который принимает обычные REST/JSON запросы и транслирует их в бинарные gRPC вызовы.
В этом случае в 1С мы можем использовать стандартный объект HTTPСоединение. Это существенно упрощает отладку и позволяет работать в рамках привычной парадигмы веб-сервисов. Вызов будет выглядеть как отправка POST-запроса на адрес прокси-сервера, который уже перенаправит данные в ноду Hyperledger.
Важные преимущества такого подхода:
ЗащищенноеСоединениеOpenSSL.Один из частых вопросов при создании распределенного реестра для 1С — это объем хранимых данных. Поскольку блокчейн подразумевает неизменяемость истории, база данных может расти очень быстро. Разберем, как минимизировать нагрузку на систему.
Профессиональные платформы, такие как Hyperledger Fabric или Iroha, используют технологию Pruning (обрезка) и разделение данных. В самом реестре (цепочке блоков) рекомендуется хранить только хеш-сумму документа и метаданные (кто, кому, когда отправил), а само тело документа (тяжелый JSON или PDF) хранить во внешнем распределенном хранилище (например, IPFS) или в State Database (базе состояний). Таким образом, 1С будет быстро получать актуальный статус документа, не скачивая всю историю транзакций за несколько лет.
Подводя итог, можно сказать, что интеграция 1С с распределенными реестрами сегодня вполне достижима. Использование Node.js в качестве моста или gRPC-шлюза позволяет обойти ограничения платформы 1С и внедрять современные децентрализованные решения в корпоративный сектор.