Как организовать обмен данными через веб-сервис на платформе 8.2 по правилам Конвертации данных 2.0

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

При работе с устаревшими конфигурациями на платформе 8.2 часто возникает задача интеграции с современными решениями, такими как УТ 11. Использование современных стандартов обмена (например, КД 3.0 или БСП) может быть затруднено из-за нежелания или невозможности внедрения тяжелых библиотек в старую самописную базу. В такой ситуации оптимальным решением становится создание собственного веб-сервиса, который будет выступать «прослойкой» для приема и отправки данных, сформированных по классическим правилам Конвертации данных 2.0 (КД2). Рассмотрим, как реализовать этот механизм, обеспечив надежность и поддержку квитирования сообщений.

Архитектура решения: Веб-сервис как транспорт для КД2

Основная идея заключается в том, что веб-сервис в базе на платформе 8.2 должен принять пакет данных (XML), сохранить его во временный файл и программно вызвать типовую обработку УниверсальныйОбменДаннымиXML. Разберем по шагам, как это реализовать.

Для начала проанализируем структуру веб-сервиса. В конфигураторе необходимо создать новый объект типа Веб-сервис. Назовем его, например, ExchangeService. В нем нам потребуется операция UploadData, которая будет принимать данные от внешней системы (УТ 11).

Важный момент при выборе типов данных: Для передачи XML-файлов крайне рекомендуется использовать тип base64Binary (из пространства имен http://www.w3.org/2001/XMLSchema). Это позволит избежать проблем с кодировками и спецсимволами, которые неизбежно возникают при передаче «чистого» текста XML внутри SOAP-пакета.

Реализация метода приема данных

Рассмотрим код модуля веб-сервиса. Проанализируем логику работы: мы получаем двоичные данные, сохраняем их на диск и передаем в обработку для загрузки. Выясним, как это выглядит в коде:


Функция UploadData(BinaryData, NodeCode, MessageNo)
    
    // 1. Сохраняем полученные данные во временный файл
    ИмяФайлаОбмена = ПолучитьИмяВременногоФайла("xml");
    BinaryData.Записать(ИмяФайлаОбмена);
    
    // 2. Инициализируем обработку обмена
    // Предполагается, что обработка УниверсальныйОбменДаннымиXML включена в состав конфигурации
    ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбработкаОбмена.РежимОбмена = "Загрузка";
    ОбработкаОбмена.ИмяФайлаОбмена = ИмяФайлаОбмена;
    
    // В 8.2 важно подавлять диалоговые окна при работе в веб-сервисе
    ОбработкаОбмена.ВыводСообщенийИнформационногоХарактера = Ложь;
    ОбработкаОбмена.ВыводВПротоколОшибок = Истина;
    
    Попытка
        ОбработкаОбмена.ВыполнитьЗагрузку();
        
        // 3. Реализация квитирования (подтверждения)
        // Если загрузка прошла успешно, нужно подтвердить получение сообщения в Плане обмена
        УзелОтравителя = ПланыОбмена.ОбменСамопискаУТ.НайтиПоКоду(NodeCode);
        Если Не УзелОтравителя.Пустая() Тогда
            ПланыОбмена.УдалитьРегистрациюИзменений(УзелОтравителя, MessageNo);
        КонецЕсли;
        
        УдалитьФайлы(ИмяФайлаОбмена);
        Возврат "Success";
        
    Исключение
        ТекстОшибки = ОписаниеОшибки();
        УдалитьФайлы(ИмяФайлаОбмена);
        Возврат "Error: " + ТекстОшибки;
    КонецПопытки;
    
КонецФункции

Механизм квитирования и Планы обмена

В сообщениях форума справедливо отмечается, что просто «прочитать XML» недостаточно. Для полноценного обмена необходимо квитирование. Разберем подробнее, как это работает без БСП. Когда УТ 11 отправляет данные в самописку через веб-сервис, она передает вместе с телом сообщения НомерСообщения. Если обработка загрузки в самописке завершилась без ошибок, мы вызываем метод ПланыОбмена.УдалитьРегистрациюИзменений().

Это критически важно для того, чтобы при следующем сеансе обмена система знала, какие данные уже успешно приняты и обработаны «той стороной». Если же произошла ошибка загрузки, регистрация изменений не удаляется, и при исправлении проблемы данные будут переданы повторно.

Проблема больших объемов данных на платформе 8.2.13

Проанализируем технические ограничения старых платформ. Платформа 8.2.13 имеет архитектурные особенности работы с памятью при использовании веб-сервисов. Поскольку весь SOAP-пакет формируется в оперативной памяти сервера, передача файлов размером более 50–100 Мб может привести к ошибке Out of memory.

Рекомендации по обходу ограничений:

  1. Дробление пакетов: Если объем данных велик, разделите выгрузку на несколько итераций (пакетов) по 1000–5000 объектов в каждом.
  2. Использование временных файлов: Никогда не пытайтесь передавать содержимое XML как String в параметрах метода, если файл больше нескольких мегабайт. Пользуйтесь только base64Binary.
  3. Настройка веб-сервера: Убедитесь, что в настройках IIS или Apache лимиты на размер запроса (maxAllowedContentLength) установлены с запасом.

Интеграция на стороне УТ 11

Со стороны современной УТ 11 нам потребуется создать механизм, который будет инициировать соединение с нашим веб-сервисом. Поскольку мы отказались от КД 3.0 в пользу КД 2.0, типовые механизмы БСП «Обмен данными через веб-сервис» не подойдут в чистом виде, так как они ожидают формат XDTO.

Посмотрим, как реализовать вызов веб-сервиса из УТ 11 программно:


// Пример вызова веб-сервиса на стороне УТ 11
Определение = Новый WSОпределения(URL_ВебСервиса, Логин, Пароль);
Прокси = Новый WSПрокси(Определение, "http://www.my-site.ru/exchange", "ExchangeService", "ExchangeServiceSoap");
Прокси.Пользователь = Логин;
Прокси.Пароль = Пароль;

// Подготовка данных через КД 2.0 во временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
// ... тут код выгрузки через УниверсальныйОбменДаннымиXML ...

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
// Платформа 8.3 автоматически конвертирует ДвоичныеДанные в Base64 при передаче в параметр типа base64Binary
Результат = Прокси.UploadData(ДвоичныеДанные, "UT_Base", НомерТекущегоСообщения);

Если Результат <> "Success" Тогда
    ЗаписьЖурналаРегистрации("Обмен", УровеньЖурналаРегистрации.Ошибка, , , Результат);
КонецЕсли;

Безопасность и публикация

Выясним причину возможных проблем при подключении. На релизе 8.2.13 публикация веб-сервиса выполняется через конфигуратор или утилиту webinst. При использовании IIS важно настроить права доступа к папке с публикацией для пользователя, под которым запущен пул приложений (обычно IIS_IUSRS). Также стоит учитывать, что 8.2.13 не всегда корректно пробрасывает Windows-авторизацию, поэтому надежнее использовать Basic Authentication с созданием отдельного пользователя в базе 1С специально для целей обмена.

Подводя итог, можно сказать, что связка Веб-сервис + КД 2.0 + Планы обмена является «золотым стандартом» для интеграции старых систем 1С. Это решение позволяет сохранить гибкость настройки правил обмена в визуальном редакторе «Конвертация данных» и при этом обеспечить современный транспорт данных без использования файловых шар или FTP-серверов.

← На главную