Ошибка «Текст XML содержит недопустимый символ в позиции 31» при сканировании маркировки

· 7 мин

Содержание

Если 1С выдаёт Текст XML содержит недопустимый символ в позиции 31, дело почти никогда не в самой программе. В код маркировки попал управляющий символ-разделитель, который сканер передал «сырым», и 1С не смогла упаковать его в XML для отправки в ГИС МТ.

Ошибка вылезает при сканировании DataMatrix — на приёмке, при выводе из оборота или обмене с Честным знаком. Позиция 31 — это не случайность: ровно там в коде стоит служебный разделитель GS. Ниже разберём, почему недопустимый символ появляется именно в 1С при работе с маркировкой, и пройдём по способам от безопасного к радикальному.

Что за символ в позиции 31 и почему он ломает XML

Код маркировки DataMatrix состоит из нескольких групп: GTIN, серийный номер, ключ и код проверки. Между группами стоит невидимый разделитель — символ GS (Group Separator, код 29, он же  или <GS>).

Структура кода такая:

01 + GTIN(14) + 21 + серийный номер(13) + <GS> + 91 + ... + 92 + ...

Посчитайте символы: 01 + 14 + 21 + серийник — разделитель <GS> встаёт как раз около 31-й позиции. Отсюда и «недопустимый символ в позиции 31».

XML 1.0 запрещает большинство управляющих символов с кодами ниже 32. Когда 1С формирует пакет для ГИС МТ и натыкается на GS, обмен падает с ошибкой. То есть проблема не в базе, а в том, что именно приехало со сканера.

Быстрая проверка: отсканируйте код в обычный «Блокнот». Если между частями кода видны квадратик, пробел или строка рвётся — сканер отдаёт разделитель не так, как ждёт 1С.

Сначала определите источник символа

Прежде чем лезть в настройки, поймите, откуда прилетает управляющий символ. Это экономит полдня.

Диагностика: выберите симптом

Способ 1. Настроить сканер на передачу GS в Base64

Самое надёжное решение — заставить сканер передавать код в кодировке Base64. Тогда управляющие символы превращаются в безопасные буквы и цифры, и XML не ломается.

  1. Откройте настройку подключаемого оборудования в 1С: АдминистрированиеПодключаемое оборудование.
  2. Найдите ваш сканер штрихкодов, откройте Настроить....
  3. Включите режим передачи данных в Base64 (в драйверах 1С — галка «Использовать Base64» или «Кодировать управляющие символы»).
  4. Сохраните и проверьте тестовым сканированием прямо в окне настройки.

Перед изменением настроек оборудования сделайте резервную копию базы и запишите текущие параметры сканера — чтобы откатиться, если станет хуже.

Способ 2. Включить эмуляцию COM-порта

Если сканер подключён по USB и работает в режиме клавиатуры (HID), символ GS он «печатает» криво. Режим эмуляции COM-порта передаёт данные потоком, и 1С корректно читает разделитель.

  • Установите драйвер производителя (Honeywell, Zebra, АТОЛ и т.д.) в режиме USB-COM / Virtual COM.
  • В настройках оборудования 1С выберите тип подключения COM-порт, укажите номер порта.
  • Задайте символ-суффикс GS (код 29) в конфигураторе сканера, если он потерялся.

После переключения на COM-порт перезапустите 1С и проверьте, что порт не занят другой программой (кассой, ТСД-утилитой). Иначе сканер «замолчит».

Способ 3. Программно очистить строку от недопустимых символов

Когда битый символ уже попал в документ и мешает выгрузке, строку с кодом можно почистить обработкой. Способ рабочий, но лечит следствие, а не причину — сканер всё равно настройте.

Пример очистки строки от символов с кодами ниже 32 (кроме разрешённых) во встроенном языке:

Функция ОчиститьУправляющиеСимволы(Строка)
    Результат = "";
    Для Позиция = 1 По СтрДлина(Строка) Цикл
        Символ = Сред(Строка, Позиция, 1);
        Код = КодСимвола(Символ);
        Если Код >= 32 Или Код = 9 Тогда
            Результат = Результат + Символ;
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Символ GS (код 29) при этом заменяется на корректный разделитель или удаляется в зависимости от требований обмена. Не трогайте сам код маркировки бездумно: если вырезать разделитель полностью, ГИС МТ может не принять пакет.

Способ 4. Проверить скорость и стабильность передачи

Иногда символ бьётся из-за помех на линии, а не из-за логики.

  • Слишком высокая скорость COM-порта (115200 там, где сканер рассчитан на 9600) даёт «мусор» в потоке. Снизьте скорость до значения из паспорта сканера.
  • Длинные пассивные USB-хабы, переходники и удлинители искажают сигнал — подключите сканер напрямую в порт компьютера.
  • Перебитый или дешёвый кабель тоже добавляет случайные символы. Замените на заведомо рабочий.

Способ 5. Обновить драйвер и библиотеку оборудования

Старый драйвер подключаемого оборудования не знает про новые правила передачи GS для маркировки.

  • Обновите драйвер сканера до актуальной версии от производителя.
  • Обновите библиотеку подключаемого оборудования в 1С (входит в БСП).
  • Если ошибка только на одной базе — сравните версии драйверов на проблемном и рабочем месте, приведите к одной.

Пошаговый порядок действий

Чтобы не метаться между способами, идите по порядку — от простого к сложному.

Пошаговый помощник
Проверьте код в Блокноте
Отсканируйте проблемный DataMatrix в текстовый редактор. Убедитесь, что разделитель между группами есть и не рвёт строку.

Частые ошибки и как их избежать

  • Меняют настройки сразу на всех рабочих местах. Сначала почините одно, убедитесь, что помогло, потом тиражируйте.
  • Вырезают разделитель GS целиком. Тогда ГИС МТ не разберёт код на группы и вернёт отказ. Символ нужно корректно передать, а не удалить.
  • Грешат на 1С и переустанавливают конфигурацию. В 99% случаев виноват сканер или драйвер, а не платформа.
  • Игнорируют кабель и хаб. Самая обидная причина: настройки идеальны, а символ бьётся на дешёвом удлинителе.

Если не помогло

Символ по-прежнему в позиции 31 после всех способов? Проверьте нестандартные места:

  • Другая модель сканера на этом же месте — проблема точно в железе или его настройке.
  • Прошивка сканера. Сбросьте к заводским и заново задайте суффикс-разделитель по инструкции производителя.
  • Обмен через промежуточную систему (ТСД, кассовое ПО, обмен между базами) — символ может искажаться на стыке. Тестируйте каждое звено отдельно.
  • Обращение к интегратору. Если стоит нетиповая обработка выгрузки в ГИС МТ, битый символ может добавлять она.

Частые вопросы

Что за символ в позиции 31 и почему именно 31?
Это служебный разделитель GS (код 29) между группами кода маркировки. По структуре DataMatrix он встаёт около 31-го символа, поэтому 1С сообщает именно эту позицию.
Ошибка в 1С или в сканере?
Почти всегда в сканере или его драйвере. Программа лишь не может упаковать управляющий символ в XML. Начните с настроек оборудования.
Поможет ли переустановка 1С?
Нет. Переустановка платформы или конфигурации не влияет на то, как сканер передаёт разделитель. Это потеря времени.
Почему ошибка только на одной базе из нескольких?
Разные версии драйвера сканера или библиотеки подключаемого оборудования на рабочих местах. Приведите настройки и версии к одинаковым.
Можно ли просто удалить недопустимый символ?
Полностью удалять GS нельзя — код перестанет делиться на группы, и ГИС МТ его отклонит. Разделитель нужно передать корректно, а очистка применяется только к «мусорным» символам.
Что такое передача в Base64 и зачем она нужна?
Base64 кодирует управляющие символы в обычные буквы и цифры. Тогда GS не ломает XML, и обмен с Честным знаком проходит без ошибки.