При закрытии кассовой смены в конфигурациях 1С, работающих с контрольно-кассовой техникой по требованиям 54-ФЗ, пользователи нередко сталкиваются с аварийным завершением операции. Кассовый аппарат распечатывает Z-отчет, фискальные данные успешно уходят оператору фискальных данных (ОФД), но в самой учетной системе смена зависает в статусе Открыта, а документ ОтчетОРозничныхПродажах не создается. В журнале регистрации при этом фиксируется исключение: «Ошибка при вызове метода контекста (XMLЗначение): Несоответствие типов (параметр номер '2')». Разберем детально, почему возникает данный сбой, как исправить программный код и как завершить оформление документов в учетной системе.
Проанализируем механизм закрытия смены и взаимодействия платформы с драйвером торгового оборудования. В типовых конфигурациях и Библиотеке подключаемого оборудования (БПО) при получении ответа от фискального регистратора вызывается обработка входящего XML-пакета состояния кассы. В этом пакете передаются параметры неотправленных фискальных документов:
BacklogDocumentsCounter — количество фискальных документов, ожидающих отправки в ОФД.BacklogDocumentFirstNumber — номер первого непереданного документа.BacklogDocumentFirstDateTime — дата и время первого непереданного документа.Проблема кроется в поведении драйвера ККТ: если касса успешно отправила абсолютно все фискальные документы в ОФД (счетчик BacklogDocumentsCounter равен 0), атрибут даты первого неотправленного документа BacklogDocumentFirstDateTime попросту отсутствует в XML-структуре. Метод ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime") в такой ситуации возвращает значение Неопределено.
Типовой код пытается выполнить преобразование полученной строки в дату вызовом платформенного метода XMLЗначение(Тип("Дата"), ...). Функция XMLЗначение строго требует передачи строкового значения во второй параметр. Когда в нее передается Неопределено, генерируется исключение «Несоответствие типов (параметр номер '2')», выполнение транзакции закрытия смены прерывается, и программа не переходит к созданию учетных документов.
Для устранения первичного сбоя откроем конфигуратор и внесем исправление в общий модуль обработки данных торгового оборудования. Разберем по шагам необходимые действия:
МенеджерОборудованияВызовСервера (в некоторых конфигурациях логика находится в модуле МенеджерОборудованияКлиентСервер).ПолучитьПараметрыСостоянияСменыИзXMLПакета.
Функция ПолучитьПараметрыСостоянияСменыИзXMLПакета(Данные, НомерСмены) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Данные);
ЧтениеXML.ПерейтиКСодержимому;
Параметры = МенеджерОборудованияКлиентСервер.ПараметрыНормализуемыхФискальныхДанных;
Параметры.НомерСменыККТ = НомерСмены;
Если ЧтениеXML.Имя = "StatusParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Прочитать И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.КоличествоНепереданныхФД = Число(ЧтениеXML.ЗначениеАтрибута("BacklogDocumentsCounter"));
Параметры.НомерПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstNumber");
Параметры.ДатаПервогоНепереданногоФД = XMLЗначение(Тип("Дата"), ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime"));
КонецЕсли;
КонецЕсли;
Возврат Параметры;
КонецФункции
Добавим обязательную проверку заполненности считанной строки перед передачей ее в метод XMLЗначение. Если атрибут в XML отсутствует или пуст, будем устанавливать пустую дату:
Функция ПолучитьПараметрыСостоянияСменыИзXMLПакета(Данные, НомерСмены) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Данные);
ЧтениеXML.ПерейтиКСодержимому;
Параметры = МенеджерОборудованияКлиентСервер.ПараметрыНормализуемыхФискальныхДанных;
Параметры.НомерСменыККТ = НомерСмены;
Если ЧтениеXML.Имя = "StatusParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Прочитать И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.КоличествоНепереданныхФД = Число(ЧтениеXML.ЗначениеАтрибута("BacklogDocumentsCounter"));
Параметры.НомерПервогоНепереданногоФД = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstNumber");
BacklogDocumentFirstDateTime = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime");
Если ЗначениеЗаполнено(BacklogDocumentFirstDateTime) Тогда
Параметры.ДатаПервогоНепереданногоФД = XMLЗначение(Тип("Дата"), BacklogDocumentFirstDateTime);
Иначе
Параметры.ДатаПервогоНепереданногоФД = Дата(1, 1, 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Параметры;
КонецФункции
Сохраним изменения и обновим конфигурацию базы данных. Данная доработка полностью исключает появление ошибки парсинга при пустой очереди отправки в ОФД.
После исправления кода и повторной попытки закрыть смену часто возникает вторичная проблема: драйвер ККТ выдает ошибку «Смена закрыта — операция невозможна». Документ КассоваяСмена по-прежнему остается со статусом Открыта, а ОтчетОРозничныхПродажах так и не появляется.
Проанализируем причину рассинхронизации: при первой аварийной попытке аппарат уже выполнил команду закрытия в фискальном накопителе и вывел чек. Однако учетная система откатила свои действия из-за ошибки в коде. При повторном запуске процедуры программа вновь пытается закрыть смену на аппарате, на что касса отвечает отказом, так как смена в ней уже закрыта. Рассмотрим рабочие способы завершить процесс закрытия в 1С:
ОтчетОРозничныхПродажах, архивирует чеки и сменит статус смены на Закрыта. Затем вернем настройки оборудования в исходное состояние.ОтчетОРозничныхПродажах вручную, заполнив его по чекам за день, и проведем его. Затем через внешнюю обработку или обработку ГрупповоеИзменениеРеквизитов установим у зависшего документа КассоваяСмена реквизит Статус в значение Закрыта, а для кассовых чеков смены установим признак архивных.Рассмотренная ошибка характерна для ранних релизов конфигураций времен перехода на 54-ФЗ. Чтобы исключить подобные сбои в будущем, рекомендуется: