При отправке акта постановки на баланс версии 2.0 (документ ActChargeOn_v2) или акта списания в ЕГАИС разработчики 1С часто сталкиваются с ошибкой проверки XML-документа службой УТМ:
org.xml.sax.SAXParseException; cvc-complex-type.2.4.a: Invalid content was found starting with element 'MarkCode'. One of '{MarkCode}' is expected.
или аналогичным сообщением, где перед названием элемента указывается префикс схемы, например ainp:MarkCode.
В этой статье мы подробно разберем причины этой проблемы, проанализируем специфику XML-схем ЕГАИС и рассмотрим правильные варианты формирования документов из 1С.
Проблема заключается в том, как XSD-схемы ЕГАИС определяют элемент MarkCode, и как платформа 1С сериализует объекты XDTO в XML.
По правилам ЕГАИС элемент MarkCode является локальным (неквалифицированным) элементом схемы. Это означает, что данный тег не должен принадлежать ни основному пространству имен документа ЕГАИС, ни пространству имен самого акта.
Рассмотрим ситуацию, когда при сериализации XDTO в 1С корневой узел записывается с пространством имен по умолчанию:
<Documents xmlns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01">
...
<MarkCode>22N00002NVT9...</MarkCode>
...
</Documents>
По правилам XML, если у дочернего элемента MarkCode нет собственного префикса, он автоматически наследует пространство имен по умолчанию (xmlns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"). Парсер УТМ ЕГАИС при проверке схемы ожидает увидеть элемент без пространства имен, видит привязку к WB_DOC_SINGLE_01 и отклоняет документ с ошибкой SAXParseException.
Если же добавить префикс пространства имен вручную (например, ainp:MarkCode), парсер выдает ошибку, так как элемент ожидает имя без какого-либо префикса.
Чтобы элемент MarkCode выгружался без пространства имен и успешно проходил валидацию в УТМ, разберем два основных подхода.
Способ 1. Использование явного префикса для пространства имен документа
Самый надежный и правильный метод — исключить использование пространства имен по умолчанию на уровне корневого узла. Для этого корневому элементу Documents назначается префикс (например, ns или p standard).
При формировании XML через объект ЗаписьXML перед вызовом сериализации XDTO выполним привязку префикса:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Явно задаем префикс для основного пространства имен
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ain", "http://fsrar.ru/WEGAIS/ActChargeOn_v2");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("pref", "http://fsrar.ru/WEGAIS/ProductRef_v2");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("oref", "http://fsrar.ru/WEGAIS/ClientRef_v2");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("iab", "http://fsrar.ru/WEGAIS/ActInventoryF1F2Info");
// Записываем объект XDTO в подготовленный контекст XML
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTOДокумент);
ЗаписьXML.Закрыть();
При такой настройке пространства имен элемент MarkCode записывается без префикса и не наследует пространство по умолчанию, что полностью соответствует требованиям валидатора ЕГАИС.
Способ 2. Корректировка XML-строки перед отправкой
Если структура документа формируется сторонним модулем или готовым пакетом XDTO, где префикс ce:MarkCode добавляется автоматически, можно очистить префикс путем обработки итоговой строки XML перед отправкой в УТМ:
Если НаименованиеПакета = ВРег("АктПостановкиНаБаланс_v2")
Или НаименованиеПакета = ВРег("АКТСПИСАНИЯ_V2") Тогда
// Заплатка для совместимости с требованиями УТМ
ТекстXML = СтрЗаменить(ТекстXML, "ce:MarkCode", "MarkCode");
ТекстXML = СтрЗаменить(ТекстXML, "ainp:MarkCode", "MarkCode");
КонецЕсли;
Рассмотрим образец правильно сформированного документа ActChargeOn_v2, который успешно принимается УТМ ЕГАИС:
<ns:Documents xmlns:ain="http://fsrar.ru/WEGAIS/ActChargeOn_v2"
xmlns:iab="http://fsrar.ru/WEGAIS/ActInventoryF1F2Info"
xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"
xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef_v2"
xmlns:pref="http://fsrar.ru/WEGAIS/ProductRef_v2"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns:Owner>
<ns:FSRAR_ID>010000006865</ns:FSRAR_ID>
</ns:Owner>
<ns:Document>
<ns:ActChargeOn_v2>
<ain:Identity>3de7570a-0d35-11e8-8639-0013ce8a85e4</ain:Identity>
<ain:Header>
<ain:Number>000000001</ain:Number>
<ain:ActDate>2018-02-09</ain:ActDate>
<ain:TypeChargeOn>Излишки</ain:TypeChargeOn>
<ain:Note>Акт постановки на баланс</ain:Note>
</ain:Header>
<ain:Content>
<ain:Position>
<ain:Identity>1</ain:Identity>
<ain:Product>
<pref:UnitType>Packed</pref:UnitType>
<pref:Type>АП</pref:Type>
<pref:FullName>Водка "ХАСКИ (HUSKY)"</pref:FullName>
<pref:AlcCode>0350566000001310276</pref:AlcCode>
<pref:Capacity>0.7</pref:Capacity>
<pref:AlcVolume>40</pref:AlcVolume>
<pref:Producer>
<oref:UL>
<oref:ClientRegId>010060693343</oref:ClientRegId>
<oref:FullName>Общество с ограниченной ответственностью "Рузский Купажный завод"</oref:FullName>
<oref:ShortName>ООО "Рузский Купажный завод"</oref:ShortName>
<oref:INN>5075029180</oref:INN>
<oref:KPP>507501001</oref:KPP>
<oref:address>
<oref:Country>643</oref:Country>
<oref:RegionCode>50</oref:RegionCode>
<oref:description>РОССИЯ, МОСКОВСКАЯ ОБЛ, Рузский р-н</oref:description>
</oref:address>
</oref:UL>
</pref:Producer>
<pref:ProductVCode>200</pref:ProductVCode>
</ain:Product>
<ain:Quantity>1</ain:Quantity>
<ain:InformF1F2>
<ain:InformF1F2Reg>
<ain:InformF1>
<iab:Quantity>10656</iab:Quantity>
<iab:BottlingDate>2017-08-11</iab:BottlingDate>
<iab:TTNNumber>С000021260</iab:TTNNumber>
<iab:TTNDate>2017-09-21</iab:TTNDate>
<iab:EGAISFixNumber>WBF-201700117546164</iab:EGAISFixNumber>
<iab:EGAISFixDate>2017-08-18</iab:EGAISFixDate>
</ain:InformF1>
</ain:InformF1F2Reg>
</ain:InformF1F2>
<ain:MarkCodeInfo>
<MarkCode>22N00002NVT9X3YVYH07IHY70810004009476PB4IDYGXRZVWQUY8M6X9N59PK5S1W3L</MarkCode>
</ain:MarkCodeInfo>
</ain:Position>
</ain:Content>
</ns:ActChargeOn_v2>
</ns:Document>
</ns:Documents>
После исправления структуры XML часто возникает следующая логическая ошибка от сервера ЕГАИС:
Регистрационный номер отчета о производстве/импорте : "WBF-..." отсутствует в системе.
Выясним причину этой ошибки при заполнении блока InformF1:
RPM-, RPT-, RPA-, RPI-), а не номер фиксации накладной ТТН (начинающийся на WBF-).AlcCode).Проверьте правильность заполнения Справки 1 (Справки А) в базе 1С и убедитесь, что в качестве номера фиксации документа-основания передается номер первичного отчета о производстве/импорте от производителя.