Работа с порталом ЕИС Госзакупок (Единая информационная система) часто сопряжена с техническими трудностями, особенно когда речь идет о ручном формировании и загрузке транспортных пакетов с документами приемки (УПД). В этой статье мы подробно разберем, как избежать ошибок валидации, правильно подготовить кодировку и структуру XML-файла, а также реализуем корректную выгрузку на языке 1С. Для предварительной проверки структуры сформированных документов пригодится обработка для валидации XML-файлов по XSD-схемам.
При попытке загрузить сформированный вручную файл пользователи часто сталкиваются с ошибками вида РДИК_ИК_0003. Проанализируем основные причины их возникновения:
Контент не является валидным для типа base64Binary. Чаще всего это происходит из-за наличия невидимых символов переноса строки, которые платформа 1С по умолчанию добавляет в длинные строки Base64.Cannot find the declaration of element 'Файл' или жалобы на отсутствие структуры DP_PAKET означают, что нарушена иерархия тегов в транспортном пакете.encoding="WINDOWS-1251", но фактическое содержимое, упакованное в Base64, оказывается в кодировке UTF-8. Для ЕИС это критично.Рассмотрим структуру правильного транспортного пакета. Он должен соответствовать схеме DP_PAKET_EIS. В упрощенном виде пакет выглядит следующим образом:
<?xml version="1.0" encoding="WINDOWS-1251"?>
<ФайлПакет ИдТрПакет="GUID" ИдФайл="ИМЯ_ФАЙЛА" ДатаВрФормир="ДАТА" ТипПрилож="УПДПрод" ВерсФорм="1.00">
<Документ>
<Контент>[Base64 код вашего УПД]</Контент>
</Документ>
<Прилож>
<Контент>[Base64 код технического файла ФайлУПДПрод]</Контент>
</Прилож>
</ФайлПакет>
Важно: Блок Прилож является обязательным. В нем передается XML-файл дополнительных сведений, который система ожидает увидеть вместе с основным титулом продавца.
Одной из главных проблем является метод 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-парсер встретил символ < или & в тексте (например, в наименовании товара), который он принял за начало нового тега. Чтобы избежать этого, перед формированием итогового текста УПД необходимо экранировать спецсимволы:
& заменяется на &< заменяется на <> заменяется на >" заменяются на "Чтобы ваш файл был принят системой с первого раза, пройдемся по следующим шагам:
ИдФайл в транспортном пакете в точности совпадает с именем файла, который вы загружаете. Любое различие приведет к ошибке валидации.ИдТрПакет должен быть уникальным для каждой попытки загрузки. Если вы исправляете ошибку и загружаете файл повторно, сгенерируйте новый GUID, чтобы система не посчитала пакет дублем.Windows-1251 перед кодированием. Использование UTF-8 внутри Base64 — самая частая причина отказа в обработке документа.5.01, а для транспортного пакета ВерсФорм="1.00".Следуя этим правилам и используя приведенный выше код на языке 1С, вы сможете успешно формировать документы для ручной загрузки в личный кабинет поставщика ЕИС Госзакупок, минуя сложности интеграции через электронный документооборот на начальных этапах автоматизации. Для автоматизации этого процесса можно использовать готовое решение для групповой выгрузки документов в XML-формате ЭДО.