В программе УТ 10.3 на релизе 36.1, а так же в Рознице 1.0.19.16, которые на данный момент являеются последними при попытке продажи алкогольной продукции с отправкой данных в ЕГАИС, возникает ошибка "java.lang.IllegalArgumentException: org.xml.sax.SAXParseException; cvc-pattern-valid: Value '0' is not facet-valid with respect to pattern '[1-9][0-9]{0,9}' for type 'COUNT'". В процесе анализа ошибки выяснилось, что данная ошибка возникает из-за незаполненых полей в формируемом пакете, который и отправляется в ЕГАИС. Поле номер смены и номер чека ККМ, в программе выгружаются как значение '0'. В ЕГАИС по этим данным формируется информация о чеке, они должны быть заполнены обязательно. Проблема в том, что в общем модуле ИнтеграцияЕГАИСКлиентПредопределенный в функцию ПодготовитьВходящиеДанныеДляПодписиЧека не передаестя номер чека и смены. Номер смены особого значения не имеет, можно смело ставить 1, просто при загрузке в ЕГАИС нулевое значение не принимается. Так же важно указать номер чека, для этого в модуле функции Чека ККМ в функции ПараметрыЧекаДляПодписиВЕГАИС в параметр чека можно передать и его номер.
Для исправления текущей ошибки можно исправить две функции, которые я описал выше следующим образом:
1.Функция ПараметрыЧекаДляПодписиВЕГАИС в модуле Чека ККМ.
Функция ПараметрыЧекаДляПодписиВЕГАИС(ТаблицаТоваров, СуммаНал, СуммаБезНал, ТранспортныйМодуль = Неопределено)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| ЧекККМ.Организация.ИНН КАК ИНН,
| ЧекККМ.Организация.КПП КАК КПП,
| """" КАК АдресМагазина,
| ЧекККМ.Склад.Наименование КАК НаименованиеМагазина,
| 0 КАК ЗаводскойНомерККМ,
| ВЫБОР
| КОГДА ЧекККМ.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЧекККМ.Возврат)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК Возврат,
| ЧекККМ.Организация КАК Организация,
| ЧекККМ.Склад КАК Склад
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
|ГДЕ
| ЧекККМ.Ссылка = &Ссылка";
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ПараметрыЧека = Новый Массив;
ПараметрыЧека.Добавить(ТаблицаТоваров);
ПараметрыЧека.Добавить(СуммаНал);
ПараметрыЧека.Добавить(СуммаБезНал);
ПараметрыЧека.Добавить(Выборка.Возврат);
ПараметрыЧека.Добавить(Выборка.ИНН);
ПараметрыЧека.Добавить(Выборка.КПП);
ПараметрыЧека.Добавить(Выборка.АдресМагазина);
ПараметрыЧека.Добавить(Выборка.НаименованиеМагазина);
ПараметрыЧека.Добавить(Выборка.ЗаводскойНомерККМ);
ТранспортныйМодуль = ИнтеграцияЕГАИСПереопределяемый.ИспользуемыйТранспортныйМодуль(Выборка.Склад, Выборка.Организация);
ПараметрыЧека[6] = ТранспортныйМодуль.Адрес;
ПараметрыЧека[9] = Прав(Ссылка.Номер,5);
Возврат ПараметрыЧека;
КонецФункции
Прав(Ссылка.Номер,5) - применяется для того, чтобы исбавиться от префикса в номере чека. Если у Вас в программе установлен префикс в номере документов, то это не позволит использовать номер при передачи в ЕГАИС, так как в стандарте обмена прописано, что номер чека является числовым значением.
2. Функция ПодготовитьВходящиеДанныеДляПодписиЧека в общем модуле ИнтеграцияЕГАИСКлиентПредопределенный.
Функция ПодготовитьВходящиеДанныеДляПодписиЧека(ПараметрыЧека, НомерЧека = 0, НомерСмены = 1, РезультатПодготовки = Неопределено) Экспорт
РезультатПодготовки = Новый Структура("Результат, ОписаниеОшибки", Ложь, "");
ВходящиеДанные = СтруктураДанныхЧекаККМ();
ТаблицаТоваров = ПараметрыЧека[0];
Если ТаблицаТоваров.Колонки.Найти("ПараметрыАлкогольнойПродукции") = Неопределено Тогда
РезультатПодготовки.ОписаниеОшибки = НСтр("ru = 'В процедуру подготовки входящих данных передана некорректная структура параметров.'");
Возврат ВходящиеДанные;
КонецЕсли;
ВыгружатьНемаркируемуюПродукцию = ИнтеграцияЕГАИСКлиентПовтИсп.ВыгружатьПродажиНемаркируемойПродукцииВЕГАИС();
ВходящиеДанные.ИНН = ПараметрыЧека[4];
ВходящиеДанные.КПП = ПараметрыЧека[5];
ВходящиеДанные.АдресМагазина = ПараметрыЧека[6];
ВходящиеДанные.НаименованиеМагазина = ПараметрыЧека[7];
ВходящиеДанные.ЗаводскойНомерККМ = ПараметрыЧека[8];
ВходящиеДанные.НомерСменыККМ = НомерСмены;
ВходящиеДанные.НомерЧекаККМ = ПараметрыЧека[9];
ВходящиеДанные.ДатаВремяЧека = ТекущаяДата();
ВходящиеДанные.Возврат = ПараметрыЧека[3];
Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
ПараметрыАлкогольнойПродукции = СтрокаТаблицы.ПараметрыАлкогольнойПродукции;
Если ТипЗнч(ПараметрыАлкогольнойПродукции) <> Тип("Структура") Тогда
РезультатПодготовки.ОписаниеОшибки = НСтр("ru = 'В процедуру подготовки входящих данных передана некорректная структура параметров.'");
Возврат ВходящиеДанные;
КонецЕсли;
Если НЕ ПараметрыАлкогольнойПродукции.Свойство("АлкогольнаяПродукция")
ИЛИ НЕ ПараметрыАлкогольнойПродукции.Свойство("Маркируемая")
ИЛИ НЕ ПараметрыАлкогольнойПродукции.Свойство("Штрихкод")
ИЛИ НЕ ПараметрыАлкогольнойПродукции.Свойство("Объем") Тогда
РезультатПодготовки.ОписаниеОшибки = НСтр("ru = 'В процедуру подготовки входящих данных передана некорректная структура параметров.'");
Возврат ВходящиеДанные;
КонецЕсли;
Если НЕ ПараметрыАлкогольнойПродукции.АлкогольнаяПродукция Тогда
Продолжить;
КонецЕсли;
Если ПараметрыАлкогольнойПродукции.Маркируемая Тогда
Если НЕ ПараметрыАлкогольнойПродукции.Свойство("ШтрихкодМарки") Тогда
РезультатПодготовки.ОписаниеОшибки = НСтр("ru = 'Отсутствует обязательное поле ""Штрихкод марки"".'");
Возврат ВходящиеДанные;
КонецЕсли;
Иначе
Если НЕ ВыгружатьНемаркируемуюПродукцию Тогда
Продолжить;
КонецЕсли;
Если НЕ ПараметрыАлкогольнойПродукции.Свойство("Крепость") Тогда
РезультатПодготовки.ОписаниеОшибки = НСтр("ru = 'Отсутствует обязательное поле ""Крепость"".'");
Возврат ВходящиеДанные;
КонецЕсли;
Если НЕ ПараметрыАлкогольнойПродукции.Свойство("КодВидаПродукции") Тогда
РезультатПодготовки.ОписаниеОшибки = НСтр("ru = 'Отсутствует обязательное поле ""Код вида алкогольной продукции"".'");
Возврат ВходящиеДанные;
КонецЕсли;
КонецЕсли;
КоличествоСтрок = ?(ПараметрыАлкогольнойПродукции.Маркируемая, СтрокаТаблицы.Количество, 1);
Для Сч = 1 По КоличествоСтрок Цикл
СтрокаЧека = СтруктураДанныхСтрокиЧекаККМ();
СтрокаЧека.Наименование = СтрокаТаблицы.Наименование;
СтрокаЧека.Количество = ?(ПараметрыАлкогольнойПродукции.Маркируемая, 1, СтрокаТаблицы.Количество);
Если СтрокаТаблицы.Количество = 0 ИЛИ СтрокаТаблицы.Скидка = 0 Тогда
СтрокаЧека.Цена = СтрокаТаблицы.Цена;
Иначе
СтрокаЧека.Цена = Окр(СтрокаТаблицы.Цена * СтрокаТаблицы.Скидка * 0.01, 2);
КонецЕсли;
СтрокаЧека.ШтрихкодТовара = ПараметрыАлкогольнойПродукции.Штрихкод;
СтрокаЧека.Объем = ПараметрыАлкогольнойПродукции.Объем;
Если НЕ ПараметрыАлкогольнойПродукции.Маркируемая Тогда
СтрокаЧека.Крепость = ПараметрыАлкогольнойПродукции.Крепость;
СтрокаЧека.КодВидаПродукции = ПараметрыАлкогольнойПродукции.КодВидаПродукции;
ВходящиеДанные.ТаблицаТоваровБезМарки.Добавить(СтрокаЧека);
Иначе
Если ТипЗнч(ПараметрыАлкогольнойПродукции.ШтрихкодМарки) = Тип("Массив") Тогда
СтрокаЧека.ШтрихкодМарки = ?(ПараметрыАлкогольнойПродукции.ШтрихкодМарки.ВГраница() < Сч - 1, "", ПараметрыАлкогольнойПродукции.ШтрихкодМарки[Сч - 1]);
ИначеЕсли ТипЗнч(ПараметрыАлкогольнойПродукции.ШтрихкодМарки) = Тип("Строка") И Сч = 1 Тогда
СтрокаЧека.ШтрихкодМарки = ПараметрыАлкогольнойПродукции.ШтрихкодМарки;
КонецЕсли;
ВходящиеДанные.ТаблицаТоваров.Добавить(СтрокаЧека);
КонецЕсли;
КонецЦикла;
КонецЦикла;
РезультатПодготовки.Результат = Истина;
Возврат ВходящиеДанные;
КонецФункции // ПодготовитьВходящиеДанныеДляПодписиЧека()
Еще в рознице может возникать ошибка:
java.lang.IllegalArgumentException: org.xml.sax.SAXParseException; cvc-pattern-valid: Value '' is not facet-valid with respect to pattern '\S{1,128}' for type 'NOEMPTY'
Как и с предыдущей ошибкой из текста ясно лишь одно, что какое-то поле из передаваемых данных не заполнено или заполнено не корректно. Как оказалось после анализа отправляеммых данных, что проблема в незаполненных данных кассы. В рознице в кассе проставляются данные "Серийный номер" и "Регистрационный номер" кассового аппарата. Данные эти не выжны, но не должны быть пустыми, можно поставить просто 1, после этого ошибка исчезнет и данные будут отправляться нормально. В управлении торговлей данная ошибка не возникает, т.к. в настройках кассы нет серийного номера и 1с передает в ЕГАИС значение по умолчанию "0", а это удовлетворяет требованиям выгрузки.
P.S. Если у Вас есть еще какие-либо ошибки, с которыми Вы столкнулись в момент начала продаж алкогольной продукции через систему ЕГАИС, пишите в комментариях, с радостью добавлю описание и решение их в статью.