При самостоятельной разработке выгрузки универсального передаточного документа (УПД) по формату приказа ФНС России от 24.03.2016 № ММВ-7-15/155@ разработчики нередко сталкиваются с ситуацией, когда оператор электронного документооборота возвращает ошибки или документ не проходит автоматический входной контроль. Выясним причину такого поведения транспортных систем, разберем типовые ошибки в структуре файла и рассмотрим способы автоматической проверки XML-документа средствами платформы 1С.
В тексте ответа от транспортной системы оператора часто можно встретить внутренние сообщения базы данных, например: from m in class lv.fis.edi.comp.edi.OrgRelationsModel WHERE m.orgIdSend = ? and m.orgIdRec = ? and m.type=?. Проанализируем, почему возникает данный сбой.
Подобное исключение свидетельствует о том, что транспортный шлюз пытается определить маршрут доставки документа между участниками документооборота, выполняя поиск установленной связи между отправителем и получателем. Посмотрим на блок служебной информации в выгружаемом файле:
<СвУчДокОбор ИдОтпр="" ИдПол="2IJA">
<СвОЭДОтпр НаимОрг="Эдисофт, ООО" ИдЭДО="2IJ" ИННЮЛ="7801471082"/>
</СвУчДокОбор>
В атрибуте ИдОтпр передана пустая строка. Из-за отсутствия идентификатора отправителя система оператора не может подставить параметры в запрос маршрутизации, что приводит к критической ошибке обработки еще до того, как начнется проверка содержимого по схеме XSD. Для устранения проблемы необходимо передавать корректные уникальные идентификаторы участников ЭДО, присвоенные оператором (например, вида 2BM-7701234567-770101001-2016010100000000000):
<СвУчДокОбор ИдОтпр="2IJ-7801111111-780101001-1111111111111111" ИдПол="2IJAD6-...">
Разберем структуру имени файла и корректность XML-разметки. Согласно требованиям формата, атрибут ИдФайл формируется по жестко заданному шаблону, включающему идентификаторы отправителя и получателя. Если между разделителями идентификатор опущен (например, ON_SCHFDOPPR_2IJ__...), файл считается некорректным.
Кроме того, в XML-документе недопустимы синтаксические ошибки формирования атрибутов. Обратим внимание на тег адреса покупателя:
<АдрРФ Индекс="111111" КодРегион="111" Район="" Город="" НаселПункт="" Улица=1111" Дом="111111" />
Здесь пропущена открывающая кавычка перед значением атрибута Улица=1111". В результате файл перестает быть синтаксически правильным (not well-formed XML). Любой стандартный парсер прервет разбор на этой строке, не доходя до сопоставления с XSD-схемой.
Рассмотрим подробнее элементы, которые нарушают ограничения схемы приказа 155@:
xs:string с ограничением minLength="1"). В блоке сведений о лице, передавшем товар, нельзя оставлять атрибуты пустыми:
<РабОргПрод Должность="Менеджер продаж">
<ФИО Фамилия="" Имя="" Отчество=""/>
</РабОргПрод>
Фамилия и Имя являются строго обязательными. Если данные отсутствуют, документ не пройдет валидацию.<Контакт/> без заполненных атрибутов (телефон, адрес электронной почты) недопустим по схеме. Если контактная информация контрагента отсутствует в информационной базе, данный узел необходимо полностью исключать из XML, а не создавать пустым.<Подписант> указания одних лишь атрибутов ОблПолн, Статус и ОснПолн недостаточно. По формату данный элемент обязан содержать дочерний узел с идентификацией лица (например, <ФЛ>, <ИП> или <ЮЛ> с вложенными ФИО и должностью).НалСт значение должно передаваться строго из списка фиксированных перечислений (например, 18% или без НДС), а не числовой дробью 18.00.Для того чтобы оперативно находить ошибки структуры без загрузки файла к оператору, используем встроенные возможности платформы 1С:Предприятие по работе с XDTO. Механизм позволяет программно сопоставить сформированный XML с официальной схемой XSD и получить подробный список несовпадений.
Разберем по шагам пример процедуры проверки:
&НаСервере
Процедура ПроверитьXMLПоСхеме(ПутьКФайлуXML, ПутьКСхемеXSD)
// Создаем фабрику XDTO на основании файла схемы
Попытка
Фабрика = СоздатьФабрикуXDTO(ПутьКСхемеXSD);
Исключение
ВызватьИсключение "Ошибка инициализации XSD-схемы: " + ОписаниеОшибки();
КонецПопытки;
// Инициализируем чтение файла выгрузки
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлуXML);
// Выполняем десериализацию и проверку структуры
Попытка
Фабрика.ПрочитатьXML(Чтение);
Сообщить("Файл успешно прошел проверку по схеме XSD!");
Исключение
// В случае несоответствия метод выбросит исключение с указанием узла и типа ошибки
Сообщить("Обнаружены ошибки формата:");
Сообщить(ОписаниеОшибки());
КонецПопытки;
Чтение.Закрыть();
КонецПроцедуры
При возникновении ошибки метод ПрочитатьXML сгенерирует точное диагностическое сообщение, в котором будут указаны имя некорректного элемента, ожидаемый тип данных и характер нарушения (отсутствие обязательного атрибута, нарушение длины или недопустимое перечисление).
Посмотрим на общие правила, которые позволят избежать ошибок при реализации собственных обработок выгрузки:
ДД.ММ.ГГГГ, а время — ЧЧ:ММ:СС.