Как исправить ошибку «Текст XML содержит недопустимый символ» при оплате картой в 1С:Розница 2.2?

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

При проведении оплаты по платежной карте в режиме Рабочего места кассира (РМК) или при закрытии кассовой смены пользователи конфигурации 1С:Розница 2.2 могут столкнуться с проблемой. После проведения операции через эквайринговый терминал Сбербанка и перед печатью чека на фискальном регистраторе (например, Атол 30Ф) программа выдает ошибку вида: «Текст XML содержит недопустимый символ в позиции...». В результате чек не печатается, а работа кассы блокируется.

В этом материале мы подробно проанализируем причины возникновения этой проблемы и рассмотрим проверенные способы ее решения.

Выясним причину ошибки

Проанализируем ситуацию: платформа 1С:Предприятие 8 при формировании данных чека и обмене с драйвером подключаемого оборудования использует строгое соответствие спецификации XML 1.0. При приеме оплаты эквайринговый терминал Сбербанка возвращает в 1С текст слип-чека или служебные данные, в которых могут содержаться непечатные ASCII-символы (символы перевода строки, управляющие байты отреза чека, ESC-последовательности или спецсимволы разметки).

Когда 1С пытается сформировать XML-структуру из полученной строки, платформа обнаружвает спецсимволы (в диапазоне 0x00–0x1F) и прерывает операцию из-за невозможности выполнить XML-сериализацию.

Решение 1. Обновление и регистрация актуальных библиотек Сбербанка

Наиболее эффективным решением является обновление библиотек взаимодействия с банковским терминалом и правильная настройка оборудования в 1С.

Разберем порядок действий по шагам:

  1. Закроем сеанс программы 1С:Предприятие на рабочем месте кассира.
  2. Обновим внешние компоненты и файлы драйвера Сбербанка в рабочем каталоге банковского ПО (обычно папка C:\sc552).
  3. Запустим командную строку от имени Администратора, перейдем в папку с файлами эквайринга и выполним регистрацию библиотек с помощью утилиты regdll.bat.
  4. Запустим 1С и перейдем в раздел Администрирование – Подключаемое оборудование.
  5. Откроем карточку эквайрингового терминала и проверим параметры подключения: в настройках оборудования должен использоваться вариант драйвера с 7 параметрами.
  6. Нажмем Записать и закрыть и перезапустим РМК для проверки печати чеков.

Решение 2. Смена используемого драйвера эквайринга в 1С

Если обновление компонентов недоступно, проанализируем настройки подключаемого оборудования непосредственно в конфигурации. В некоторых релизах проблему удается решить сменной обработчика оборудования.

  1. Откроем справочник Подключаемое оборудование.
  2. Перейдем в группу Эквайринговые терминалы и откроем карточку используемого терминала.
  3. Изменим драйвер оборудования с 1С:Эквайринговые терминалы Сбербанк на СБРФ Эквайринг.
  4. Сохраним изменения, выполним повторную настройку параметров подключения и проверим работу кассы.

Решение 3. Редактирование файла pinpad.ini

Посмотрим на настройки взаимодействия банковской утилиты с печатающим устройством. В каталоге установки эквайрингового ПО найдем файл pinpad.ini.

  1. Откроем файл pinpad.ini через текстовый редактор.
  2. Найдем параметр PrinterEnd, отвечающий за отправку управляющих символов отреза чека.
  3. Если там указана последовательность спецсимволов, измените значение на стандартный код (например, 16) или очистите этот параметр, если автоотрез настроен средствами самого ККТ Атол.
  4. Сохраним файл и повторим тестовую оплату.

Решение 4. Удаление недопустимых символов XML в коде (для разработчиков)

Если конфигурация находится на доработке или используются расширения, рассмотрим программный способ фильтрации текста слип-чека перед его упаковкой в XML.

Для этого воспользуемся функциями Библиотеки Стандартных Подсистем (БСП) ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML() или системным методом НайтиНедопустимыеСимволыXML().

Рассмотрим пример кода:


// Очищаем текст слип-чека от непечатных управляющих символов
ТекстСлипа = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ТекстСлипа);

// Проверяем наличие управляющих символов в строке
ПозицияОшибки = НайтиНедопустимыеСимволыXML(ТекстСлипа);
Если ПозицияОшибки > 0 Тогда
    // Удаляем невалидный символ из строки
    ТекстСлипа = Лев(ТекстСлипа, ПозицияОшибки - 1) + Сред(ТекстСлипа, ПозицияОшибки + 1);
КонецЕсли;

Применение данных способов позволяет полностью устранить ошибку XML-сериализации при взаимодействии 1С:Розницы 2.2 с эквайринговыми терминалами и кассовой техникой.

← На главную