В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает необходимость проверки длины введенных данных. Особенно остро этот вопрос встает при реализации механизмов работы с торговым оборудованием, например, при обработке штрихкодов. В данной статье мы подробно разберем, как использовать встроенные функции для подсчета символов, почему простая проверка может не работать с реквизитами справочников и как правильно организовать логику разделения обычных штрихкодов EAN-13 и длинных кодов маркировки (DataMatrix).
Для определения количества символов в строке в языке программирования 1С 7.7 предназначена встроенная функция СтрДлина(). Рассмотрим простейший пример, который иллюстрирует синтаксис этой функции внутри условного оператора Если...Тогда. Допустим, нам нужно выполнить определенное действие, если длина текстового поля не превышает 13 символов.
Если СтрДлина(ТекстПоле) <= 13 Тогда
// Выполняем действия для коротких строк (например, EAN-13)
Предупреждение("Это обычный штрихкод или артикул");
Иначе
// Выполняем действия для длинных строк (например, код маркировки)
Предупреждение("Обнаружена длинная последовательность символов");
КонецЕсли;
На первый взгляд решение кажется исчерпывающим, однако при работе с реальными данными в 1С 7.7 программисты часто сталкиваются с тем, что условие всегда уходит в ветку Иначе. Разберемся, почему это происходит.
Проанализируем особенность хранения строковых данных в 1С 7.7. Если ТекстПоле является реквизитом справочника или документа с типом "Строка" и установленной длиной (например, 20 или 100 символов), система всегда хранит в нем строку именно этой длины, дополняя значащие символы пробелами справа.
Рассмотрим ситуацию: у вас есть реквизит КодМаркера с длиной 50 символов. Если в него записано значение "12345", то функция СтрДлина(КодМаркера) вернет 50, а не 5. Чтобы получить реальное количество символов, необходимо предварительно обрезать незначащие пробелы. Для этого мы используем функцию СокрЛП() (сокращение левых и правых пробелов).
Правильный вариант условия для проверки длины реквизита будет выглядеть так:
Если СтрДлина(СокрЛП(КодМаркера)) > 13 Тогда
// Теперь мы точно знаем количество реально введенных символов
КодМаркировки = СокрЛП(КодМаркера);
КонецЕсли;
Когда мы пытаемся внедрить поддержку маркировки (например, для системы "Честный Знак") в старые конфигурации, недостаточно просто добавить проверку длины в процедуру обработки. Выясним основную причину, по которой код может не работать, даже если функция СтрДлина() написана верно.
В типовых решениях 7.7 логика обработки штрихкода обычно сосредоточена в глобальном модуле, в процедуре глОбработкаВнешнегоСобытия или аналогичной. Процесс стандартно выглядит так:
Номенклатура по штрихкоду.Проблема заключается в том, что код маркировки (DataMatrix) содержит в себе GTIN товара (14 цифр), который часто совпадает с EAN-13 (с добавленным нулем впереди). Если ваша доработка стоит "слишком поздно" по коду, то система может попытаться обработать первые 13 символов марки как обычный штрихкод, найти товар и завершить выполнение, так и не дойдя до вашей проверки Если СтрДлина > 13.
Разберем по шагам, как следует организовать логику, чтобы избежать ошибок "двойного пика" или неправильного распознавания товара. Мы должны перехватить данные в момент их поступления от сканера (в процедуре ВнешнееСобытие).
Проанализируем примерную структуру обработки события:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Перем ТекШтрихкод;
ТекШтрихкод = СокрЛП(Данные);
Если СтрДлина(ТекШтрихкод) > 13 Тогда
// Это потенциально код маркировки
// Здесь должна быть логика поиска товара по GTIN внутри марки
// и запись самой марки в табличную часть
ОбработатьМаркировку(ТекШтрихкод);
ИначеЕсли СтрДлина(ТекШтрихкод) = 13 Тогда
// Это обычный EAN-13
ОбработатьОбычныйШК(ТекШтрихкод);
КонецЕсли;
КонецПроцедуры
Нужно учитывать, что при работе с кодами маркировки пользователь может совершить ошибку. Например, сначала отсканировать EAN-13 с упаковки, а затем — код маркировки. Если ваша программа просто увеличивает количество товара при каждом сканировании, то в чеке окажется две единицы товара вместо одной (одна по обычному ШК, другая — по коду маркировки).
Чтобы минимизировать человеческий фактор, профессиональные разработчики 1С 7.7 применяют следующие подходы:
(01) указывает на GTIN. Программно "вырезав" эти данные, мы можем найти товар в базе еще до того, как будет считан обычный штрихкод.Штрихкод1 = Штрихкод2) должно сопровождаться очисткой от пробелов, иначе результат будет непредсказуемым.Подводя итог, отметим, что функция СтрДлина() является лишь верхушкой айсберга. Основная сложность в 1С 7.7 заключается в правильном встраивании этой проверки в существующую архитектуру конфигурации, которая изначально не была рассчитана на работу со строками переменной и большой длины, характерными для современных систем маркировки товаров.