Как правильно прикрепить PDF-файл в формате Base64 в XML для ЕГАИС?

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

При интеграции учетных систем на платформе 1С с ЕГАИС нередко возникает задача передачи дополнительных файлов, например, PDF-документов в составе XML-сообщений. Стандартным способом передачи бинарных данных в XML является использование кодировки Base64. Однако при реализации этой задачи разработчики часто сталкиваются с тем, что принимающая сторона выдает ошибку или некорректно обрабатывает файл. Давайте разберем, в чем кроется причина и как правильно сформировать XML, чтобы данные проходили валидацию.

Анализ проблемы формирования Base64

Основная сложность заключается в том, как платформа 1С по умолчанию преобразует двоичные данные в строковый формат. Метод Base64Строка(), используемый для конвертации, ориентирован на стандарты MIME (RFC 2045). Согласно этим стандартам, длинная строка Base64 должна быть разбита на части по 76 символов с использованием переносов строк.

В контексте формирования XML для государственных систем, таких как ЕГАИС, наличие таких «технических» переносов внутри тега данных является критической ошибкой. Парсер на стороне ЕГАИС ожидает непрерывную последовательность символов. Если в строке присутствуют символы возврата каретки (Символ 13) или перевода строки (Символ 10), структура XML нарушается, и вложенный документ становится нечитаемым.

Пошаговое решение задачи

Чтобы успешно прикрепить PDF-файл к вашему XML-запросу, необходимо выполнить следующие действия:

  1. Получение двоичных данных: Сначала необходимо считать файл с диска в переменную типа ДвоичныеДанные. Важно использовать конструктор Новый ДвоичныеДанные(ПутьКФайлу). Ни в коем случае не пытайтесь читать файл как текстовый, это приведет к порче содержимого.
  2. Конвертация в строку: Преобразуйте полученные данные в строку с помощью функции Base64Строка().
  3. Очистка от служебных символов: Полученную строку необходимо «очистить» от всех символов переноса строки, которые 1С добавляет автоматически.

Пример программного кода

Рассмотрим реализацию этого алгоритма на практике. Мы будем использовать функцию СтрЗаменить() для удаления лишних спецсимволов. Это позволит привести строку к формату непрерывного блока данных:


// Считываем двоичные данные файла
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлуPDF);

// Получаем строковое представление Base64
Base64СтрокаPDF = Base64Строка(ДвоичныеДанныеФайла);

// Удаляем символы переноса строки (Символ 10) и возврата каретки (Символ 13)
ОчищеннаяСтрока = СтрЗаменить(СтрЗаменить(Base64СтрокаPDF, Символ(13), ""), Символ(10), "");

// Теперь записываем результат в XML
ЗаписьXML.ЗаписатьНачалоЭлемента("rpp:LabelFoto");
ЗаписьXML.ЗаписатьТекст(ОчищеннаяСтрока);
ЗаписьXML.ЗаписатьКонецЭлемента();

Почему это важно для ЕГАИС

Система ЕГАИС предъявляет строгие требования к XML-документам, которые проверяются по XSD-схемам. Элемент, содержащий изображение или документ, обычно описан как тип xs:base64Binary. Когда вы передаете «чистую» строку без переносов, парсер воспринимает её как единый блок данных и успешно декодирует обратно в PDF. Если же оставить переносы, структура XML визуально выглядит разбитой на несколько строк, что парсер интерпретирует как ошибку структуры или некорректное значение данных.

Советы по оптимизации и отладке

При работе с вложениями помните о следующих рекомендациях:

Следуя этим простым правилам, вы сможете избежать распространенных ошибок интеграции и успешно передавать необходимые вложения в ЕГАИС без лишних затрат времени на поиск проблем с форматом данных.

← На главную