Ошибка «Текст XML содержит недопустимый символ в позиции 31» при сканировании маркировки
Содержание
Если 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С:
Администрирование→Подключаемое оборудование. - Найдите ваш сканер штрихкодов, откройте
Настроить.... - Включите режим передачи данных в Base64 (в драйверах 1С — галка «Использовать Base64» или «Кодировать управляющие символы»).
- Сохраните и проверьте тестовым сканированием прямо в окне настройки.
Перед изменением настроек оборудования сделайте резервную копию базы и запишите текущие параметры сканера — чтобы откатиться, если станет хуже.
Способ 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С (входит в БСП).
- Если ошибка только на одной базе — сравните версии драйверов на проблемном и рабочем месте, приведите к одной.
Пошаговый порядок действий
Чтобы не метаться между способами, идите по порядку — от простого к сложному.
Частые ошибки и как их избежать
- ❌ Меняют настройки сразу на всех рабочих местах. Сначала почините одно, убедитесь, что помогло, потом тиражируйте.
- ❌ Вырезают разделитель
GSцеликом. Тогда ГИС МТ не разберёт код на группы и вернёт отказ. Символ нужно корректно передать, а не удалить. - ❌ Грешат на 1С и переустанавливают конфигурацию. В 99% случаев виноват сканер или драйвер, а не платформа.
- ❌ Игнорируют кабель и хаб. Самая обидная причина: настройки идеальны, а символ бьётся на дешёвом удлинителе.
Если не помогло
Символ по-прежнему в позиции 31 после всех способов? Проверьте нестандартные места:
- Другая модель сканера на этом же месте — проблема точно в железе или его настройке.
- Прошивка сканера. Сбросьте к заводским и заново задайте суффикс-разделитель по инструкции производителя.
- Обмен через промежуточную систему (ТСД, кассовое ПО, обмен между базами) — символ может искажаться на стыке. Тестируйте каждое звено отдельно.
- Обращение к интегратору. Если стоит нетиповая обработка выгрузки в ГИС МТ, битый символ может добавлять она.
Частые вопросы
Что за символ в позиции 31 и почему именно 31?
GS (код 29) между группами кода маркировки. По структуре DataMatrix он встаёт около 31-го символа, поэтому 1С сообщает именно эту позицию.Ошибка в 1С или в сканере?
Поможет ли переустановка 1С?
Почему ошибка только на одной базе из нескольких?
Можно ли просто удалить недопустимый символ?
GS нельзя — код перестанет делиться на группы, и ГИС МТ его отклонит. Разделитель нужно передать корректно, а очистка применяется только к «мусорным» символам.Что такое передача в Base64 и зачем она нужна?
GS не ломает XML, и обмен с Честным знаком проходит без ошибки.