При работе с устаревшими конфигурациями на платформе 8.2 часто возникает задача интеграции с современными решениями, такими как УТ 11. Использование современных стандартов обмена (например, КД 3.0 или БСП) может быть затруднено из-за нежелания или невозможности внедрения тяжелых библиотек в старую самописную базу. В такой ситуации оптимальным решением становится создание собственного веб-сервиса, который будет выступать «прослойкой» для приема и отправки данных, сформированных по классическим правилам Конвертации данных 2.0 (КД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 имеет архитектурные особенности работы с памятью при использовании веб-сервисов. Поскольку весь SOAP-пакет формируется в оперативной памяти сервера, передача файлов размером более 50–100 Мб может привести к ошибке Out of memory.
Рекомендации по обходу ограничений:
String в параметрах метода, если файл больше нескольких мегабайт. Пользуйтесь только base64Binary.maxAllowedContentLength) установлены с запасом.Со стороны современной УТ 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-серверов.