Интеграция с системой межведомственного электронного взаимодействия (СМЭВ) версии 3.0 — это сложная техническая задача, требующая от разработчика 1С глубокого понимания протоколов HTTP (в чем помогут инструменты тестирования http сервисов), структуры XML-пакетов и механизмов криптографической подписи. Часто возникают ситуации, когда сформированный запрос успешно проходит проверку в сторонних утилитах вроде SoapUI или Post1С - аналоге Postman, но при отправке непосредственно из кода 1С возвращает ошибки уровня Incoming message is not xml message или Unmarshalling Error. В данной статье мы подробно разберем, как избежать типичных ошибок при настройке HTTPСоединение и формировании запроса.
Одной из самых коварных проблем является несоответствие реального размера передаваемых данных значению, указанному в заголовках. Рассмотрим ситуацию: разработчик вручную устанавливает заголовок Content-Length, используя функцию СтрДлина(). В 1С эта функция возвращает количество символов в строке, однако протокол HTTP требует указания длины тела запроса в байтах. Поскольку СМЭВ работает в кодировке UTF-8, где кириллические символы занимают по 2 байта, значение Content-Length оказывается меньше реального объема данных. В результате сервер СМЭВ обрезает пакет, получает невалидный XML и возвращает ошибку. Для гибкой трансформации данных может пригодиться модуль «Трансформер» для конвертации JSON/XML/CSV.
Важное правило: в современных версиях платформы 1С (8.3.x) не рекомендуется устанавливать заголовок Content-Length вручную. Платформа делает это автоматически и корректно при вызове метода УстановитьТелоИзСтроки() или передаче данных в ОтправитьДляОбработки().
Разберем по шагам процесс подготовки соединения. СМЭВ 3.0 требует использования защищенного соединения и специфических заголовков SOAP. Проанализируем пример кода для инициализации обмена:
// Определяем параметры сервера и ресурса
СерверСМЭВ = "smev3-n0.test.gosuslugi.ru";
ПортСМЭВ = 7500;
АдресРесурса = "smev/v1.2/ws"; // Без ?wsdl, если отправляем POST запрос
// Настраиваем заголовки
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Заголовки.Вставить("Connection", "Keep-Alive");
// SOAPAction определяет тип операции (SendRequest, GetResponse, Ack)
// В СМЭВ 3.0 значение должно быть в двойных кавычках
Заголовки.Вставить("SOAPAction", """urn:SendRequest""");
// Инициализируем защищенное соединение (для тестового контура может потребоваться настройка сертификатов)
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(СерверСМЭВ, ПортСМЭВ, , , , , Защита);
// Подготавливаем запрос
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса, Заголовки);
СМЭВ крайне чувствителен к наличию невидимых символов в начале сообщения. Одной из частых причин ошибки Unexpected character (CTRL-CHAR, code 152) является использование BOM (Byte Order Mark). Это три байта в начале файла/строки, которые 1С может добавить при сохранении в UTF-8.
Для корректной работы необходимо явно указывать платформе, что BOM использовать не нужно. Рассмотрим, как установить тело запроса правильно:
// ТекстЗапросаXML — это ваша полностью сформированная и подписанная XML-строка
ЗапросHTTP.УстановитьТелоИзСтроки(ТекстЗапросаXML, КодировкаТекста.UTF8, ИспользоватьBOM.НеИспользовать);
// Теперь отправляем пакет
Попытка
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
РезультатТекст = Ответ.ПолучитьТелоКакСтроку();
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;
Если запрос все равно не проходит, проанализируем ситуацию с помощью прокси-отладчика Fiddler. Это позволит сравнить "байт в байт" запрос из SoapUI (который работает) и запрос из 1С. Для того чтобы 1С отправляла данные через Fiddler, необходимо настроить прокси-сервер в коде или в настройках платформы:
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "127.0.0.1", 8888); // Стандартный порт Fiddler
Соединение = Новый HTTPСоединение(СерверСМЭВ, ПортСМЭВ, , , Прокси, , Защита);
При сравнении обратите внимание на вкладку RAW. Проверьте:
<?xml.Content-Length фактическому объему данных.SOAPAction.В СМЭВ 3.0 подписывается не весь документ, а конкретные узлы (обычно это MessagePrimaryContent и сам Timestamp). Если вы используете механизмы из конфигурации "Бухгалтерия государственного учреждения" (БГУ) или БСП, помните о следующем:
ru_RU.UTF-8).SmevSignature.Важно понимать, что успешный ответ от SendRequest — это еще не данные от ведомства. Выясним алгоритм полного цикла взаимодействия:
MessageID.urn:GetResponse.urn:Ack), иначе сообщение будет считаться недоставленным и продолжит приходить при каждом запросе GetResponse.Соблюдение этих правил и внимательный контроль за формированием заголовков позволят реализовать надежный обмен данными со СМЭВ непосредственно из 1С без использования сторонних прослоек.