Как исправить ошибку «XMLЗначение: Несоответствие типов» при закрытии кассовой смены в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При закрытии кассовой смены в конфигурациях 1С, работающих с контрольно-кассовой техникой по требованиям 54-ФЗ, пользователи нередко сталкиваются с аварийным завершением операции. Кассовый аппарат распечатывает Z-отчет, фискальные данные успешно уходят оператору фискальных данных (ОФД), но в самой учетной системе смена зависает в статусе Открыта, а документ ОтчетОРозничныхПродажах не создается. В журнале регистрации при этом фиксируется исключение: «Ошибка при вызове метода контекста (XMLЗначение): Несоответствие типов (параметр номер '2')». Разберем детально, почему возникает данный сбой, как исправить программный код и как завершить оформление документов в учетной системе.

Выясним причину ошибки XMLЗначение

Проанализируем механизм закрытия смены и взаимодействия платформы с драйвером торгового оборудования. В типовых конфигурациях и Библиотеке подключаемого оборудования (БПО) при получении ответа от фискального регистратора вызывается обработка входящего XML-пакета состояния кассы. В этом пакете передаются параметры неотправленных фискальных документов:

  1. BacklogDocumentsCounter — количество фискальных документов, ожидающих отправки в ОФД.
  2. BacklogDocumentFirstNumber — номер первого непереданного документа.
  3. BacklogDocumentFirstDateTime — дата и время первого непереданного документа.

Проблема кроется в поведении драйвера ККТ: если касса успешно отправила абсолютно все фискальные документы в ОФД (счетчик BacklogDocumentsCounter равен 0), атрибут даты первого неотправленного документа BacklogDocumentFirstDateTime попросту отсутствует в XML-структуре. Метод ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime") в такой ситуации возвращает значение Неопределено.

Типовой код пытается выполнить преобразование полученной строки в дату вызовом платформенного метода XMLЗначение(Тип("Дата"), ...). Функция XMLЗначение строго требует передачи строкового значения во второй параметр. Когда в нее передается Неопределено, генерируется исключение «Несоответствие типов (параметр номер '2')», выполнение транзакции закрытия смены прерывается, и программа не переходит к созданию учетных документов.

Исправляем ошибку в модуле конфигурации

Для устранения первичного сбоя откроем конфигуратор и внесем исправление в общий модуль обработки данных торгового оборудования. Разберем по шагам необходимые действия:

  1. Откроем общий модуль МенеджерОборудованияВызовСервера (в некоторых конфигурациях логика находится в модуле МенеджерОборудованияКлиентСервер).
  2. Найдем функцию ПолучитьПараметрыСостоянияСменыИзXMLПакета.
  3. Посмотрим на исходную реализацию чтения 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С:

  1. Временное отключение фискального регистратора: перейдем в справочник подключаемого оборудования, откроем карточку кассы ККМ и временно отключим флаг использования оборудования на рабочем месте (либо переключим тип кассы на эмулятор). После этого запустим стандартное закрытие смены в 1С. Поскольку обращение к физическому фискальному регистратору производиться не будет, программа без препятствий сформирует документ ОтчетОРозничныхПродажах, архивирует чеки и сменит статус смены на Закрыта. Затем вернем настройки оборудования в исходное состояние.
  2. Программный пропуск команды закрытия ККТ: с помощью отладчика или временной правки в модуле закрытия смены обойдем метод вызова закрытия фискальной смены на оборудовании, пропустив выполнение сразу к этапу создания учетных документов и проведения отчета.
  3. Ручное оформление документов: создадим новый документ ОтчетОРозничныхПродажах вручную, заполнив его по чекам за день, и проведем его. Затем через внешнюю обработку или обработку ГрупповоеИзменениеРеквизитов установим у зависшего документа КассоваяСмена реквизит Статус в значение Закрыта, а для кассовых чеков смены установим признак архивных.

Долгосрочные системные рекомендации

Рассмотренная ошибка характерна для ранних релизов конфигураций времен перехода на 54-ФЗ. Чтобы исключить подобные сбои в будущем, рекомендуется:

  1. Обновить конфигурацию: в актуальных релизах конфигураций 1С и свежих версиях Библиотеки подключаемого оборудования (БПО) проверка заполненности атрибутов состояния смены уже реализована вендором штатно.
  2. Обновить драйвер ККТ: установка последних версий интеграционных компонент производителя оборудования (например, ДККТ АТОЛ) нормализует формат выгружаемых XML-структур и гарантирует корректный обмен данными.
← На главную