Как вручную сформировать XML-файл для загрузки в ЕИС Госзакупок без ошибок?

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

Работа с порталом ЕИС Госзакупок (Единая информационная система) часто сопряжена с техническими трудностями, особенно когда речь идет о ручном формировании и загрузке транспортных пакетов с документами приемки (УПД). В этой статье мы подробно разберем, как избежать ошибок валидации, правильно подготовить кодировку и структуру XML-файла, а также реализуем корректную выгрузку на языке 1С. Для предварительной проверки структуры сформированных документов пригодится обработка для валидации XML-файлов по XSD-схемам.

Разбор типичных ошибок валидации

При попытке загрузить сформированный вручную файл пользователи часто сталкиваются с ошибками вида РДИК_ИК_0003. Проанализируем основные причины их возникновения:

  1. Ошибка валидации base64Binary: Система сообщает, что значение внутри тега Контент не является валидным для типа base64Binary. Чаще всего это происходит из-за наличия невидимых символов переноса строки, которые платформа 1С по умолчанию добавляет в длинные строки Base64.
  2. Ошибка декларации элемента: Ошибка Cannot find the declaration of element 'Файл' или жалобы на отсутствие структуры DP_PAKET означают, что нарушена иерархия тегов в транспортном пакете.
  3. Несоответствие кодировок: В заголовке XML может быть указано encoding="WINDOWS-1251", но фактическое содержимое, упакованное в Base64, оказывается в кодировке UTF-8. Для ЕИС это критично.
  4. Отсутствие обязательных блоков: Современные требования ЕИС (версии 12.0 и выше) требуют наличия не только самого УПД, но и технического приложения к нему (титула продавца).

Подготовка структуры транспортного пакета

Рассмотрим структуру правильного транспортного пакета. Он должен соответствовать схеме DP_PAKET_EIS. В упрощенном виде пакет выглядит следующим образом:


<?xml version="1.0" encoding="WINDOWS-1251"?>
<ФайлПакет ИдТрПакет="GUID" ИдФайл="ИМЯ_ФАЙЛА" ДатаВрФормир="ДАТА" ТипПрилож="УПДПрод" ВерсФорм="1.00">
    <Документ>
        <Контент>[Base64 код вашего УПД]</Контент>
    </Документ>
    <Прилож>
        <Контент>[Base64 код технического файла ФайлУПДПрод]</Контент>
    </Прилож>
</ФайлПакет>

Важно: Блок Прилож является обязательным. В нем передается XML-файл дополнительных сведений, который система ожидает увидеть вместе с основным титулом продавца.

Реализация формирования Base64 в 1С

Одной из главных проблем является метод Base64Строка(). В 1С этот метод вставляет символы возврата каретки (CR) и переноса строки (LF) каждые 72 символа. Парсер ЕИС воспринимает эти символы как недопустимые внутри типа base64Binary. Выясним, как правильно подготовить строку.

Рассмотрим правильный алгоритм преобразования текста в Base64 для ЕИС:


// 1. Создаем поток в памяти для управления кодировкой
ПотокВПамяти = Новый ПотокВПамяти();
// Обязательно используем кодировку Windows-1251, как того требует ЕИС
ЗаписьТекста = Новый ЗаписьТекста(ПотокВПамяти, "windows-1251");
ЗаписьТекста.Записать(ТекстВашегоУПД);
ЗаписьТекста.Закрыть();

// 2. Получаем двоичные данные из потока
ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();

// 3. Кодируем в Base64
СтрокаBase64 = Base64Строка(ДвоичныеДанные);

// 4. ОЧИЩАЕМ строку от переносов, которые добавила 1С
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");

ПолеВводаКонтент = СтрокаBase64;

Проанализируем ситуацию: использование ПотокВПамяти позволяет избежать создания временных файлов на диске и гарантирует, что мы работаем с нужной кодировкой windows-1251 до момента кодирования в Base64. Очистка через СтрЗаменить убирает лишние невидимые символы, делая строку "непрерывной".

Работа с кодировкой и спецсимволами

Техподдержка ЕИС часто указывает на то, что даже если в прологе XML указано WINDOWS-1251, сами данные внутри могут быть в UTF-8. Это происходит, если вы сначала сохраняете файл в UTF-8, а потом считываете его как двоичные данные. Всегда явно указывайте кодировку при создании ЗаписьТекста.

Также проанализируем ошибку Element type "Р" must be followed by.... Эта ошибка указывает на то, что XML-парсер встретил символ < или & в тексте (например, в наименовании товара), который он принял за начало нового тега. Чтобы избежать этого, перед формированием итогового текста УПД необходимо экранировать спецсимволы:

Итоговый чек-лист для успешной загрузки

Чтобы ваш файл был принят системой с первого раза, пройдемся по следующим шагам:

  1. Имена файлов и Идентификаторы: Убедитесь, что значение атрибута ИдФайл в транспортном пакете в точности совпадает с именем файла, который вы загружаете. Любое различие приведет к ошибке валидации.
  2. GUIDы: Атрибут ИдТрПакет должен быть уникальным для каждой попытки загрузки. Если вы исправляете ошибку и загружаете файл повторно, сгенерируйте новый GUID, чтобы система не посчитала пакет дублем.
  3. Кодировка внутри Base64: Проверьте, что текстовое содержимое (УПД) было переведено в Windows-1251 перед кодированием. Использование UTF-8 внутри Base64 — самая частая причина отказа в обработке документа.
  4. Версии форматов: На текущий момент для самого УПД актуальна версия 5.01, а для транспортного пакета ВерсФорм="1.00".
  5. Отсутствие переносов: Проверьте финальную строку Base64 в любом текстовом редакторе (например, Notepad++). Она должна представлять собой одну очень длинную строку без разрывов.

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

← На главную