Интеграция систем 1С с международными протоколами передачи данных — задача всегда нетривиальная, особенно когда речь идет о промышленном секторе, логистике и цепочках поставок (например, в автомобилестроении). Крупные европейские автопроизводители и дистрибьюторы требуют от своих контрагентов строгого соблюдения стандартов EDI и обмена данными через специализированные каналы связи, такие как OFTP, OFTP2, защищенные сети ENX и шифрование TLS.
Разберем детально, как выстроить правильную архитектуру взаимодействия 1С с данными протоколами, почему разработка собственного клиента на встроенном языке 1С является ошибочным путем, и как реализовать надежное готовое решение на практике.
Прежде чем приступать к проектированию интеграции, давайте проанализируем базовые понятия, так как в них часто возникает путаница (что наглядно видно на примере обсуждений на форумах):
Встроенный язык платформы 1С предоставляет мощные инструменты для работы с веб-сервисами, XML, JSON и HTTP-запросами. Однако реализация протокола OFTP2 «с нуля» собственными силами потребует колоссальных трудозатрат по следующим причинам:
Попытка написать подобный функционал на встроенном языке 1С или даже на внешних компонентах займет месяцы работы высококвалифицированных разработчиков и потребует последующей сертификации со стороны организации Odette. Поэтому оптимальным решением является использование готового промежуточного программного обеспечения — EDI/OFTP2-шлюза.
Рассмотрим наиболее надежную схему построения интеграции. На предприятии разворачивается сертифицированный шлюз, который берет на себя все задачи по криптографии, сжатию данных, контролю доставки и взаимодействию с сетью ENX или интернетом. Система 1С, в свою очередь, обменивается данными непосредственно со шлюзом локально.
В качестве программного обеспечения для шлюза чаще всего используют:
Ниже разберем по шагам три сценария взаимодействия 1С с таким шлюзом.
Это самый простой в реализации, надежный и часто используемый метод. На сервере выделяются две директории: Outbox (для отправки) и Inbox (для приема).
Шаг 1: Выгрузка заказа из 1С в папку отправки
Когда в 1С создается и проводится документ заказа, регламентное задание формирует файл нужного формата (например, XML или EDIFACT ORDERS) и сохраняет его в локальную папку шлюза.
Посмотрим на пример кода формирования файла выгрузки в 1С:
// Функция выгружает заказ во внешнюю папку шлюза
Процедура ВыгрузитьЗаказВГорячуюПапку(СсылкаНаЗаказ) Экспорт
ПутьКПапкеОтправки = "C:\EDI_Gateway\OFTP2\outbox\";
ИмяФайла = "ORDERS_" + СокрЛП(СсылкаНаЗаказ.Номер) + "_" + Формат(ТекущаяДата(), "ДФ=ггггММддЧЧммсс") + ".xml";
ПолныйПуть = ПутьКПапкеОтправки + ИмяФайла;
// Создаем объект для записи XML-документа
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПолныйПуть, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentORDERS");
ЗаписьXML.ЗаписатьАтрибут("ID", СокрЛП(СсылкаНаЗаказ.УникальныйИдентификатор()));
// Записываем шапку документа
ЗаписьXML.ЗаписатьНачалоЭлемента("Header");
ЗаписьXML.ЗаписатьСоответствиеГраниц("PartnerID", "SENDER_ODETTE_ID");
ЗаписьXML.ЗаписатьСоответствиеГраниц("RecipientID", "RECEIVER_ODETTE_ID");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Header
// Записываем табличную часть
ЗаписьXML.ЗаписатьНачалоЭлемента("Items");
Для Каждого СтрокаТЧ Из СсылкаНаЗаказ.Товары Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Item");
ЗаписьXML.ЗаписатьАтрибут("SKU", СокрЛП(СтрокаТЧ.Номенклатура.Код));
ЗаписьXML.ЗаписатьАтрибут("Quantity", СтрокаТЧ.Количество);
ЗаписьXML.ЗаписатьАтрибут("Price", СтрокаТЧ.Цена);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Item
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Items
ЗаписьXML.ЗаписатьКонецЭлемента(); // DocumentORDERS
ЗаписьXML.Закрыть();
ЗаписьЖурналаРегистрации("EDI.Отправка", УровеньЖурналаРегистрации.Информация, , , "Файл выгружен: " + ПолныйПуть);
КонецПроцедуры
Шаг 2: Обработка шлюзом
Шлюз (например, mendelson OFTP2) работает в фоновом режиме службы Windows/Linux. Он настроен на постоянное сканирование (polling) папки Outbox. Как только в папке появляется файл, шлюз автоматически шифрует его, подписывает вашим сертификатом Odette и отправляет по протоколу OFTP2 на хост партнера.
Шаг 3: Получение входящих сообщений в 1С
Шлюз принимает входящие сообщения от партнеров, расшифровывает их, проверяет подписи и сохраняет готовые «чистые» XML-файлы в папку Inbox. В 1С настраивается регламентное задание, которое периодически сканирует эту папку и загружает данные в систему.
Проанализируем пример кода загрузки файлов:
// Регламентное задание для обработки входящих EDI-сообщений
Процедура ОбработатьВходящиеФайлы() Экспорт
ПутьКПапкеПриема = "C:\EDI_Gateway\OFTP2\inbox\";
МассивФайлов = НайтиФайлы(ПутьКПапкеПриема, "*.xml");
Для Каждого ТекущийФайл Из МассивФайлов Цикл
// Открываем и читаем XML
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.ОткрытьФайл(ТекущийФайл.ПолноеИмя);
Исключение
ЗаписьЖурналаРегистрации("EDI.Получение", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка открытия файла: " + ТекущийФайл.Имя);
Продолжить;
КонецПопытки;
// Здесь выполняется логика парсинга XML-файла и создания документов в 1С...
// ЧтениеXML.Прочитать(); ...
ЧтениеXML.Закрыть();
// После успешной обработки переносим файл в архив, чтобы не обрабатывать повторно
ПутьАрхива = "C:\EDI_Gateway\OFTP2\archive\" + ТекущийФайл.Имя;
ПереместитьФайл(ТекущийФайл.ПолноеИмя, ПутьАрхива);
КонецЦикла;
КонецПроцедуры
Если используется коммерческая версия интеграционного ПО (например, CData Arc), взаимодействие можно сделать интерактивным без использования промежуточных папок на диске. 1С общается со шлюзом через HTTP-запросы.
Разберем по шагам логику отправки файла через API шлюза:
HTTPСоединение выполняется POST-запрос к локальному REST API шлюза. Файл передается в теле запроса.Пример отправки данных через HTTPСоединение в 1С:
// Функция отправляет подготовленные данные заказа напрямую в REST API интеграционного шлюза
Функция ОтправитьЗаказЧерезREST(ДанныеЗаказаСтрока, АдресШлюза, ПортШлюза, ТокенАвторизации)
ЗаголовокЗапроса = Новый Соответствие;
ЗаголовокЗапроса.Вставить("Authorization", "Bearer " + ТокенАвторизации);
ЗаголовокЗапроса.Вставить("Content-Type", "application/xml");
// Инициализируем защищенное соединение TLS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение(АдресШлюза, ПортШлюза, , , , 30, ЗащищенноеСоединение);
HTTPЗапрос = Новый HTTPЗапрос("/api/v1/oftp/send", ЗаголовокЗапроса);
HTTPЗапрос.УстановитьТелоИзСтроки(ДанныеЗаказаСтрока, КодировкаТекста.UTF8);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляАнализа(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Возврат HTTPОтвет.ПолучитьТелоКакСтроку(); // Получаем ID транзакции
Иначе
ВызватьИсключение "Ошибка шлюза: Код " + HTTPОтвет.КодСостояния;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("EDI.REST", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Этот сценарий подходит, если 1С и шлюз развернуты на одном сервере баз данных. В СУБД (например, PostgreSQL) создается отдельная база данных с таблицами-очередями: O_Queue_Out и O_Queue_In.
Помимо доработки 1С и разворачивания интеграционного шлюза, для успешного старта проекта обмена данными по протоколу OFTP2/ENX вам потребуются подготовить организационные и технические параметры:
Резюмируем: Реализация EDI-обмена через специализированные стандарты OFTP2/ENX не требует написания сложного криптографического кода непосредственно внутри 1С. Использование концепции внешнего шлюза (например, mendelson OFTP2) с интеграцией через «горячие папки» или REST API позволяет развернуть стабильное, масштабируемое и безопасное решение, полностью соответствующее требованиям международных корпораций.