К статье
Практический материал

Разработка и Конфигурация · 11 мин

Символ 29 в 1С: что это такое и зачем он нужен

Символ 29 (GS) в 1С — непечатаемый разделитель групп в штрихкодах DataMatrix и кодах маркировки. Разбираем, зачем он нужен, как вывести и обработать его в коде.

При работе с маркировкой товаров, штрихкодами DataMatrix и обменом данными с «Честным ЗНАКом» пользователи и разработчики 1С регулярно сталкиваются с «символом 29». Это непечатаемый управляющий символ с кодом 29 в таблице ASCII, который выполняет роль разделителя групп данных внутри составного кода. В документации и стандартах GS1 он обозначается как GS (Group Separator), а в коде 1С его получают через конструкцию Символ(29).

Проблема в том, что символ 29 невидим: при выводе строки с маркировкой на экран или в журнал он либо не отображается вовсе, либо превращается в квадратик, стрелку или другой служебный значок в зависимости от шрифта и среды. Из-за этого разработчики часто не понимают, почему «одинаковые на вид» строки кода маркировки не сравниваются между собой, а сканер передаёт данные, которые не совпадают с эталоном в базе.

Ниже разобрано, что представляет собой символ 29, где он встречается в типовых конфигурациях 1С, как корректно получить, вставить, найти и удалить его программно, а также какие ошибки при работе с ним встречаются чаще всего.

Что такое символ 29 и откуда он взялся

В таблице ASCII первые 32 кода (от 0 до 31) зарезервированы под управляющие символы: перевод строки, табуляцию, звонок и другие служебные сигналы. Символ с кодом 29 — это GS, Group Separator, «разделитель групп». Исторически он применялся для разделения полей в потоках данных, а с появлением стандартов GS1 стал обязательным элементом составных штрихкодов.

В стандарте GS1 DataMatrix один код содержит несколько полей: GTIN (идентификатор товара), серийный номер, код проверки, срок годности и другие. Поскольку поля имеют переменную длину, между ними нужен разделитель — им и служит символ 29. Сканер штрихкодов, считывая маркировку, передаёт в 1С строку, в которой поля разделены именно этим невидимым символом.

Где символ 29 встречается в 1С

Основной сценарий — работа с маркированными товарами: обувь, одежда, табак, лекарства, молочная продукция, вода и другие группы, подлежащие обязательной маркировке. Код DataMatrix с упаковки содержит GS-разделители, и типовые конфигурации (УТ, ERP, Розница, КА) при сканировании получают строку с этими символами.

Вторая область — обмен с внешними системами: передача кодов в «Честный ЗНАК», выгрузка данных для ТСД, интеграция с кассовым оборудованием. В некоторых протоколах разделитель требуется передавать «как есть», в других его нужно заменять на читаемое обозначение, например на сочетание <GS> или управляющую последовательность.

Третья ситуация — печать штрихкодов. При формировании этикетки с DataMatrix из 1С разделители нужно корректно вставить в данные, иначе напечатанный код не будет соответствовать стандарту и не прочитается проверочным оборудованием.

Строка маркировки длиннее ожидаемойВнутри есть невидимые GS

Проверьте длину строки функцией СтрДлина() и сравните с видимым числом знаков

Сравнение кодов не проходитОдин код с GS, другой без

Сравните посимвольно через КодСимвола() или приведите обе строки к одному виду

Квадратики или стрелки в строкеСимвол 29 отображается служебным значком

Это норма: символ непечатаемый, отображение зависит от шрифта

Как получить и вставить символ 29 в коде 1С

Во встроенном языке 1С символ по его коду получают функцией Символ(Код). Для разделителя GS это Символ(29). Типичный пример — сборка кода маркировки из отдельных полей:

РазделительГрупп = Символ(29);

КодМаркировки = "01" + GTIN + "21" + СерийныйНомер + РазделительГрупп + "91" + КлючПроверки + "92" + КодПроверки;

Обратная задача — разбор строки, полученной со сканера. Для этого строку разбивают по символу 29 с помощью СтрРазделить():

ЧастиКода = СтрРазделить(СтрокаСоСканера, Символ(29));

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

bsl
GS = Символ(29);
Если СтрНайти(КодМаркировки, GS) > 0 Тогда
  Части = СтрРазделить(КодМаркировки, GS);
КонецЕсли;

Как найти, заменить или удалить символ 29

Для поиска используют СтрНайти(Строка, Символ(29)) — функция вернёт позицию первого вхождения или 0, если символа нет. Для удаления или замены применяют СтрЗаменить(). Типовая задача — очистить код маркировки от разделителей перед сохранением в реквизит ограниченной длины или перед сравнением:

КодБезРазделителей = СтрЗаменить(КодМаркировки, Символ(29), "");

Иногда требуется наоборот — заменить GS на видимое обозначение для отображения пользователю или записи в лог:

ЧитаемыйКод = СтрЗаменить(КодМаркировки, Символ(29), "<GS>");

При выгрузке в текстовый файл или передаче через HTTP-запрос проверяйте требования принимающей стороны: одни API принимают «сырой» символ 29 в теле запроса, другие требуют его экранировать или заменять. Несоответствие формата — частая причина отказов при передаче данных в системы маркировки.

Как проверить строку на наличие символа 29
  1. 1
    Получите строку кода маркировки из сканера, регистра или файла
  2. 2
    Выполните СтрНайти(Строка, Символ(29)) — результат больше 0 означает наличие разделителя
  3. 3
    Для просмотра структуры замените Символ(29) на видимую метку, например "|", и выведите строку в сообщение
  4. 4
    Убедитесь, что количество разделителей соответствует ожидаемому числу полей кода

Типичные проблемы и ошибки при работе с GS

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

Вторая ошибка — потеря символа при копировании через буфер обмена или через текстовые редакторы. Многие редакторы при вставке удаляют управляющие символы или заменяют их на пробелы. Если код маркировки «прогнали» через Блокнот для анализа, обратно в базу он может вернуться уже повреждённым.

Третья группа проблем — настройки сканера. Сканер можно настроить так, чтобы он заменял GS на другой символ (например, на табуляцию или F1) либо вообще не передавал его. Если в 1С коды приходят в неожиданном виде, первым делом проверяйте прошивку и настройки суффиксов/префиксов сканера, а не код конфигурации.

Типичные ошибки
01
Сравнение кода со сканера с кодом из базы без нормализации — строки не совпадают из-за невидимого GS
02
Копирование кода маркировки через Блокнот — управляющие символы теряются или заменяются
03
Запись полного кода с GS в реквизит с ограничением длины — конец кода обрезается
04
Передача кода в API без проверки требований к разделителю — сервер отклоняет запрос
05
Замена GS на пробел при очистке — лишние пробелы ломают последующий разбор строки

Символ 29 при печати этикеток и в обмене данными

При печати DataMatrix-этикеток из 1С разделитель обязан присутствовать в данных в правильных позициях — это требование стандарта GS1. Компоненты формирования штрихкода (встроенная компонента 1С или внешние) воспринимают Символ(29) в строке данных и кодируют его в графику. Если собрать строку без разделителей, этикетка напечатается, но код не пройдёт проверку верификатором и может быть отклонён при приёмке у контрагента.

В обмене с ТСД и кассами действия зависят от прошивки устройства: часть оборудования сама добавляет GS при считывании, часть — передаёт данные в «очищенном» виде. Перед внедрением обмена снимите тестовую строку с реального устройства и посмотрите посимвольный состав через КодСимвола() — это снимет большинство вопросов до начала отладки.

Как проверить результат и отличить норму от проблемы

Базовая проверка — посимвольный разбор строки. Пройдите по строке циклом, выведите код каждого символа через КодСимвола() и убедитесь, что значения 29 стоят именно там, где ожидаются границы полей. Для кода маркировки структура полей определяется идентификаторами применения (01, 21, 91, 92 и другие), поэтому позиции GS не произвольны.

После нормализации (удаления или замены GS) проверьте длину результата и успешность сравнения с эталонным значением. Если после очистки строки совпали — проблема была только в разделителях. Если расхождения остались — ищите различия в самих полях: обрезанный GTIN, лишние символы от суффикса сканера, различия в регистре букв серийного номера.

Контрольные точки

Как проверить результат

Позиции символа 29 в строке
Норма

GS стоят между полями согласно идентификаторам применения GS1

Тревожный признак

GS в начале, в конце или в середине поля — строка повреждена

Сравнение после нормализации
Норма

Очищенные от GS строки совпадают посимвольно

Тревожный признак

Различия остаются — проверяйте состав полей и настройки сканера

Печать этикетки
Норма

Напечатанный DataMatrix читается сканером и передаёт корректную структуру

Тревожный признак

Код не читается или читается без разделителей — проверяйте передачу данных в компоненту печати

Удобно завести в общем модуле функцию НормализоватьКодМаркировки(), которая удаляет Символ(29) и пробелы, и вызывать её на каждом входе данных. Тогда во всей логике сравнения и поиска работают уже очищенные значения, а исходный код сохраняют отдельно для передачи во внешние системы.
ПЗ
Практическое замечание

Частые вопросы о символе 29 в 1С

Почему в строке маркировки видны квадратики или стрелки?

Это отображение непечатаемых управляющих символов, в первую очередь символа 29 (GS). Шрифт и среда отображения по-разному показывают такие символы: квадратиком, стрелкой влево или пустотой. Сами данные при этом не повреждены — проблема только в визуализации.

Можно ли ввести символ 29 с клавиатуры?

Штатной комбинации клавиш для ввода символа 29 в полях 1С нет. Его получают программно через Символ(29) либо он приходит от сканера штрихкодов. Если нужен тестовый код с разделителем, сформируйте его обработкой и скопируйте результат.

Почему одинаковые коды маркировки не равны при сравнении?

Почти всегда причина в том, что одна строка содержит символы 29, а другая — нет, либо разделители стоят в разных позициях. Приведите обе строки к одному виду через СтрЗаменить(Строка, Символ(29), "") и сравните повторно.

Нужно ли удалять символ 29 перед записью кода в базу?

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

Сканер не передаёт символ 29 — это поломка?

Чаще всего нет: во многих сканерах передача GS отключается или заменяется в настройках. Проверьте параметры сканера (префиксы, суффиксы, режим эмуляции клавиатуры или COM-порта) по руководству производителя и включите передачу разделителя, если он нужен конфигурации.

Чем символ 29 отличается от FNC1 в штрихкодах?

FNC1 — служебный символ внутри самого штрихкода, который в режиме GS1 ставится в начало данных и после полей переменной длины. При передаче в компьютер сканеры обычно преобразуют FNC1 в позициях разделителя именно в символ 29. Поэтому в строке от сканера вы видите GS, а не FNC1.

Итог

Что важно запомнить

Символ 29 — это невидимый разделитель групп GS в кодах маркировки и штрихкодах GS1. В 1С его получают через Символ(29), ищут через СтрНайти и удаляют через СтрЗаменить. Большинство проблем решается нормализацией кодов на входе и проверкой настроек сканера.