Переход на новую версию универсального транспортного модуля (УТМ) 4.0.2 и выше вызвал у многих пользователей 1С сложности с обменом данными. Основная проблема заключается в изменении протоколов взаимодействия: УТМ 4 стал строже к структуре HTTP-запросов формата multipart/form-data, требуя специфических заголовков и форматов передачи данных, которые стандартные методы 1С (в более старых релизах) формировали некорректно. Давайте разберем, как исправить эти недочеты, не дожидаясь официальных обновлений.
Основная причина ошибок при отправке документов (например, ошибка Document is empty) кроется в том, как 1С формирует тело POST-запроса. УТМ 4 ожидает явное указание имени файла и корректные разделители строк. Рассмотрим, как внести изменения в общий модуль, например, в ИнтеграцияЕГАИСКлиентСервер.
Для начала, найдем функцию, отвечающую за подготовку параметров запроса. Нам необходимо принудительно задать разделитель строк и добавить имя файла в параметр Content-Disposition.
// В функции ПараметрыHTTPЗапроса перед добавлением строк:
ТелоЗапроса.РазделительСтрок = Символы.CR + Символы.LF;
// В строке формирования Content-Disposition:
// Было: ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""xml_file""");
// Стало:
ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""xml_file""; filename=""QueryRest.xml""");
После внесения этих правок структура запроса станет понятной для нового транспортного модуля, и обмен документами (ТТН, акты списания) должен возобновиться.
Второй частый сценарий ошибки — Ошибка при создании контекста сертификата. Это происходит потому, что старые адреса API УТМ 3 (например, /info/certificate/RSA?attachment=true) в новой версии УТМ 4 либо изменились, либо требуют иного подхода к обработке ответа.
Проанализируем функцию КодФСРАР(НастройкаОбменаЕГАИС). Нам нужно заменить адрес запроса. Более универсальный способ получения данных в современных УТМ — обращение к методу /diagnosis.
// Замена адреса в функции получения сертификата:
// Было: СтруктураДанныхHTTPЗапроса("GET", "/info/certificate/RSA?attachment=true")
// Стало:
СтруктураДанныхHTTPЗапроса("GET", "/api/certificate/download/RSA?attachment=true")
Если же вы хотите сделать решение универсальным, чтобы оно работало и с УТМ 3, и с УТМ 4, можно добавить проверку версии модуля или использовать метод /diagnosis, который поддерживается обоими версиями. Для обработки ответа от /diagnosis потребуется разобрать XML-ответ и извлечь идентификатор CN (или OID2_5_4_3), который и является кодом ФСРАР.
Если простая правка текстового документа не помогает, возможно, система требует отправки через ДвоичныеДанные. Рассмотрим вариант формирования запроса с использованием ПотокВПамяти:
ПотокДанных = Новый ПотокВПамяти;
ТелоЗапроса = Новый ЗаписьТекста(ПотокДанных, КодировкаТекста.UTF8);
ТелоЗапроса.ЗаписатьСтроку("--" + ВремГраница);
ТелоЗапроса.ЗаписатьСтроку("Content-Disposition: form-data; name=""xml_file""; filename=""file.xml""");
ТелоЗапроса.ЗаписатьСтроку("Content-Type: text/xml; charset=utf-8");
ТелоЗапроса.ЗаписатьСтроку("");
// Записываем сам XML-контент
// ...
ТелоЗапроса.Закрыть();
ДанныеДляОтправки = ПотокДанных.ЗакрытьИПолучитьДвоичныеДанные();
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДанныеДляОтправки);
Транспортер и может потреблять значительно больше оперативной памяти (до 350+ МБ), чем предыдущие версии. Учитывайте это при настройке серверов.Launcher в папке установки УТМ.WayBill_v4) — это отдельный процесс, который зависит не только от УТМ, но и от готовности вашей конфигурации 1С.Расширение конфигурации, если это возможно в вашей версии платформы.В заключение, отметим, что большинство проблем с УТМ 4 решаются приведением HTTP-запросов к стандартам, которые ожидает современный веб-сервер модуля. Будьте внимательны к заголовкам и разделителям строк — это ключ к стабильной работе вашей системы обмена с ЕГАИС.