Как организовать передачу заказов и EDI-сообщений из 1С через протоколы OFTP2, TLS и сети ENX?

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

Интеграция систем 1С с международными протоколами передачи данных — задача всегда нетривиальная, особенно когда речь идет о промышленном секторе, логистике и цепочках поставок (например, в автомобилестроении). Крупные европейские автопроизводители и дистрибьюторы требуют от своих контрагентов строгого соблюдения стандартов EDI и обмена данными через специализированные каналы связи, такие как OFTP, OFTP2, защищенные сети ENX и шифрование TLS.

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

Разбор терминологии: устраняем путаницу в протоколах и стандартах

Прежде чем приступать к проектированию интеграции, давайте проанализируем базовые понятия, так как в них часто возникает путаница (что наглядно видно на примере обсуждений на форумах):

  1. ENX (European Network Exchange) — это не протокол передачи данных, а защищенная частная VPN-инфраструктура, разработанная для европейской автомобильной промышленности. Она объединяет автопроизводителей, поставщиков и партнеров в единую безопасную сеть. Подключение к ней требует аудита безопасности предприятия (TISAX). Внутри сети ENX передача файлов может осуществляться по обычным протоколам (например, по классическому OFTP1).
  2. OFTP2 (Odette File Transfer Protocol 2) — специализированный протокол передачи файлов, созданный ассоциацией Odette для нужд EDI. В отличие от первой версии, работавшей через ISDN, OFTP2 оптимизирован для передачи тяжелых CAD-файлов и структурированных документов (EDIFACT, VDA) непосредственно через публичный Интернет в защищенном режиме.
  3. TLS (Transport Layer Security) — это криптографический протокол для защиты каналов связи. Он обеспечивает шифрование сессии при передаче данных. В контексте нашей задачи TLS используется как транспортная основа для безопасной передачи пакетов OFTP2 через веб-соединения.

Почему нецелесообразно писать OFTP2-клиент на чистом 1С?

Встроенный язык платформы 1С предоставляет мощные инструменты для работы с веб-сервисами, XML, JSON и HTTP-запросами. Однако реализация протокола OFTP2 «с нуля» собственными силами потребует колоссальных трудозатрат по следующим причинам:

Попытка написать подобный функционал на встроенном языке 1С или даже на внешних компонентах займет месяцы работы высококвалифицированных разработчиков и потребует последующей сертификации со стороны организации Odette. Поэтому оптимальным решением является использование готового промежуточного программного обеспечения — EDI/OFTP2-шлюза.

Архитектура решения: Связка «1С + EDI/OFTP2-шлюз»

Рассмотрим наиболее надежную схему построения интеграции. На предприятии разворачивается сертифицированный шлюз, который берет на себя все задачи по криптографии, сжатию данных, контролю доставки и взаимодействию с сетью ENX или интернетом. Система 1С, в свою очередь, обменивается данными непосредственно со шлюзом локально.

В качестве программного обеспечения для шлюза чаще всего используют:

  1. mendelson OFTP2 — популярное кроссплатформенное решение на базе Java. Существует бесплатная версия Community с открытым исходным кодом, которая полностью поддерживает все стандарты безопасности, шифрование, подписи и работу с сертификатами.
  2. CData Arc (ранее ArcESB) — мощный коммерческий коннектор с развитым REST API и веб-интерфейсом.
  3. Bartsch Software !MC5 — модульный шлюз, поддерживающий как OFTP2 через интернет, так и интеграцию с классическими сетями ENX.

Ниже разберем по шагам три сценария взаимодействия 1С с таким шлюзом.

Сценарий 1: Файловый обмен через «горячие папки» (Hot Folders)

Это самый простой в реализации, надежный и часто используемый метод. На сервере выделяются две директории: 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\" + ТекущийФайл.Имя;
        ПереместитьФайл(ТекущийФайл.ПолноеИмя, ПутьАрхива);
        
    КонецЦикла;
    
КонецПроцедуры

Сценарий 2: Интеграция через REST API шлюза

Если используется коммерческая версия интеграционного ПО (например, CData Arc), взаимодействие можно сделать интерактивным без использования промежуточных папок на диске. 1С общается со шлюзом через HTTP-запросы.

Разберем по шагам логику отправки файла через API шлюза:

  1. 1С формирует файл заказа в памяти (в виде двоичных данных или строки).
  2. С помощью встроенного объекта HTTPСоединение выполняется POST-запрос к локальному REST API шлюза. Файл передается в теле запроса.
  3. Шлюз возвращает уникальный идентификатор транзакции (ID передачи).
  4. 1С может по регламенту опрашивать шлюз (выполняя GET-запросы с ID транзакции), чтобы узнать точный статус доставки файла получателю и факт получения квитанции EERP.

Пример отправки данных через 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", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Сценарий 3: Промежуточная таблица в СУБД

Этот сценарий подходит, если 1С и шлюз развернуты на одном сервере баз данных. В СУБД (например, PostgreSQL) создается отдельная база данных с таблицами-очередями: O_Queue_Out и O_Queue_In.

Что необходимо подготовить для запуска проекта?

Помимо доработки 1С и разворачивания интеграционного шлюза, для успешного старта проекта обмена данными по протоколу OFTP2/ENX вам потребуются подготовить организационные и технические параметры:

  1. Odette ID (SSID и SFID): Это уникальные международные идентификаторы участников обмена. Они выдаются национальной ассоциацией-членом Odette. Без этих идентификаторов настроить OFTP2-соединение невозможно. Вам потребуются как ваш собственный ID, так и ID вашего партнера.
  2. Сертификаты безопасности: Для шифрования сессий TLS и подписи сообщений вам потребуется заказать SSL/TLS сертификаты. В промышленной среде используются сертификаты, выданные Odette CA (Certificates Authority). Для тестового контура партнеры часто соглашаются использовать самоподписанные сертификаты (self-signed).
  3. Сетевые порты на Firewall предприятия: Системные администраторы должны открыть входящие и исходящие порты на шлюзе безопасности компании. Стандартный порт для незащищенных соединений OFTP2 — 3305, а для защищенных соединений с TLS — 6619. Если используется сеть ENX, трафик будет маршрутизироваться через выделенный VPN-туннель.

Резюмируем: Реализация EDI-обмена через специализированные стандарты OFTP2/ENX не требует написания сложного криптографического кода непосредственно внутри 1С. Использование концепции внешнего шлюза (например, mendelson OFTP2) с интеграцией через «горячие папки» или REST API позволяет развернуть стабильное, масштабируемое и безопасное решение, полностью соответствующее требованиям международных корпораций.

← На главную