Как найти и устранить недопустимые символы в коде маркировки при передаче с клиента на сервер

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

При работе с системой «Честный ЗНАК» и кодами маркировки формата DataMatrix программисты 1С часто сталкиваются с ошибкой «Недопустимый символ при чтении XML» или «Неверный формат кода». Особенно остро эта проблема проявляется в момент передачи считанной строки с клиента на сервер. В данной статье мы подробно разберем, почему возникают такие ошибки, как выявить «невидимые» символы-вредители и как правильно настроить оборудование для корректной работы.

Почему возникает ошибка при переходе с клиента на сервер

Разберем ситуацию: на клиенте код считан, но при попытке передать его в серверную процедуру в качестве параметра платформа выдает ошибку. Основная причина кроется в механизмах 1С. Для передачи данных между контекстами часто используется XML-сериализация. Согласно стандарту XML 1.0, управляющие символы ASCII с кодами от 0 до 31 (за исключением табуляции, перевода строки и возврата каретки) являются недопустимыми. Если ваш сканер добавил в строку спецсимвол, например, STX (код 2), ETX (код 3) или даже GS (код 29), платформа может заблокировать передачу данных еще до того, как управление перейдет на сервер.

Метод 1: Программный поиск скрытых символов

Самый надежный способ выяснить, что именно «сидит» в вашей строке — это тестирование регулярных выражений или перебор каждого символа и вывод его числового кода. Рассмотрим следующий пример кода, который поможет проанализировать строку:


// Стр — это считанный код маркировки
Для к = 1 По СтрДлина(Стр) Цикл
    СимволТекущий = Сред(Стр, к, 1);
    КодТекущий = КодСимвола(Стр, к);
    Сообщить(СтрШаблон("Позиция %1: Символ '%2' = [Код %3]", к, СимволТекущий, КодТекущий));
КонецЦикла;

Проанализируем результаты выполнения этого кода. Если вы увидите коды в диапазоне 0–31, это и есть причина ошибки. Особое внимание стоит уделить коду 29 (Group Separator), который является стандартным разделителем в GS1 DataMatrix, но может конфликтовать с XML-передачей, и коду 2 (STX), который часто вставляется сканерами как префикс начала текста.

Метод 2: Использование внешних редакторов (Notepad++)

Иногда отладчик 1С не позволяет наглядно увидеть спецсимволы, особенно если требуется извлечение DataMatrix кодов из PDF документов. В этом случае мы можем воспользоваться внешними инструментами. Рассмотрим этот процесс по шагам:

  1. Запустите отладку и остановитесь на точке перед вызовом серверного метода.
  2. Скопируйте содержимое переменной, содержащей код маркировки.
  3. Создайте новый текстовый файл и вставьте туда строку.
  4. Откройте файл в редакторе Notepad++.
  5. Включите режим «Отображать все символы» (Вид -> Отображение символов -> Отображать все символы).

В этом режиме такие символы, как GS, STX, ACK, будут отображены в виде специальных черных плашек. Если источником данных является файл, может потребоваться чтение штрих-кодов из PDF и картинок. Это позволит вам точно определить, какой мусор добавляет сканер.

Метод 3: Кодирование в Base64 для безопасной передачи

Если специфика вашей задачи требует передачи символов, которые XML считает «запрещенными» (например, управляющие символы разделителей), проанализируем вариант с использованием Base64. Этот метод превращает любую бинарную последовательность в строку из «безопасных» символов (латиница и цифры).

Рассмотрим пример реализации:


// На стороне клиента перед отправкой на сервер
ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(КодМаркировки, КодировкаТекста.UTF8);
БезопаснаяСтрока = Base64Строка(ДвоичныеДанныеСтроки);
РезультатСервера = МойСерверныйМодуль.ОбработатьКод(БезопаснаяСтрока);

// На стороне сервера
&НаСервере
Функция ОбработатьКод(БезопаснаяСтрока)
    ДвоичныеДанные = Base64Значение(БезопаснаяСтрока);
    ЧистыйКодМаркировки = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8);
    // Теперь здесь можно работать с кодом, содержащим любые спецсимволы
КонецФункции

Проблема символа STX (ASCII 2) и настройка сканера

Выясним причину появления символа STX. Многие сканеры «из коробки» настроены на добавление префиксов. Символ STX (Start of Text) сообщает принимающей стороне, что далее следует полезная нагрузка. Однако 1С при проверке структуры кода через стандартные библиотеки (например, БПО) ожидает «чистый» код, начинающийся сразу с идентификатора применения (AI).

Если вы обнаружили STX в начале строки, у вас есть два пути решения:

  1. Программная очистка: Использовать функцию СтрЗаменить(Код, Символ(2), "") или Сред(Код, 2). Но это лишь борьба со следствием.
  2. Настройка оборудования (рекомендуется): Необходимо найти инструкцию к вашему сканеру и считать управляющий штрих-код "Clear All Prefixes" или "Reset to Defaults". Правильно настроенный сканер не должен добавлять лишних символов в начале строки.

Специфика символа FNC1 и кода 232

В стандартах маркировки важную роль играет символ FNC1. В 1С он имеет специфическое внутреннее представление — символ с кодом 232. Важно помнить:

Работа с «криптохвостом»

Не забываем про часть кода маркировки, называемую «криптохвостом» (код проверки). В нем часто встречаются такие символы, как /, \, ", &. При передаче их в строковых параметрах, особенно если они участвуют в формировании URL-запросов к API «Честного ЗНАКА», их необходимо экранировать. Также критически важен регистр: символы a и A в криптохвосте — это разные данные. Проанализируем настройки вашего сканера: если включена функция «Auto Caps Lock» или принудительный перевод в верхний регистр, код маркировки станет невалидным.

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

← На главную