Почему при сканировании штрихкода в 1С 7.7 поиск дублей в таблице значений работает некорректно?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Разберем типичную проблему, с которой сталкиваются разработчики при написании кода для обработки событий сканера штрихкодов. Часто возникают ситуации, когда система «пропускает» повторное сканирование одного и того же кода, хотя логика предполагает выдачу предупреждения о дубле. Давайте проанализируем, почему это происходит и как правильно организовать поиск в ТаблицаЗначений.

Шаг 1: Правильная инициализация переменных поиска

Одной из самых частых ошибок в коде является использование переменной, которая сохраняет свое значение от предыдущих итераций или операций поиска. Метод НайтиЗначение использует переменную-счетчик (в нашем случае стр) для записи номера найденной строки. Если перед вызовом этого метода мы явно не установим стр = 0, 1С продолжит поиск не с самого начала таблицы, а начиная со строки, номер которой был записан в переменную в прошлый раз.

Рассмотрим, как правильно обнулять переменную перед поиском:


// Обязательно сбрасываем счетчик перед поиском
стр = 0; 
Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
    // Если код не найден, добавляем новую строку
    ИтогТЗ.НоваяСтрока();
    ИтогТЗ.КодМаркировки = Штрихкод;
Иначе
    // Если поиск вернул 1, значит дубль найден
    Предупреждение("Данный код маркировки уже был проверен!");
КонецЕсли;

Важно помнить: если в коде выше уже выполнялся поиск в другой таблице, например, в ТЗШКоды, то переменная стр уже содержит номер строки из той операции. Всегда инициализируйте ее непосредственно перед вызовом поиска в целевой таблице.

Шаг 2: Обработка невидимых символов и «чистота» данных

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

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

Рассмотрим, как внедрить это в обработчик внешнего события:


Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если Событие = "BarCodeValue" Тогда
        // Очищаем данные от лишних символов сразу при получении
        Штрихкод = СокрЛП(Данные);
        
        стр = 0;
        Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
            // Логика добавления нового кода
        Иначе
            Предупреждение("Дубликат кода!");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Шаг 3: Учет типизации колонок таблицы значений

При работе с ТаблицаЗначений важно учитывать, как была определена колонка. Если при создании колонки была задана фиксированная длина (например, 20 символов), а искомый штрихкод короче, 1С может дополнить значение пробелами справа. В этом случае обычный поиск может не сработать. Использование функции СокрЛП() для обоих сравниваемых значений — и того, что мы ищем, и того, что уже лежит в таблице — является универсальным решением.

Итоги и рекомендации

Подводя итог, можно выделить три золотых правила успешного поиска в 1С 7.7:

  1. Всегда обнуляйте счетчик (стр = 0) непосредственно перед вызовом метода НайтиЗначение. Никогда не полагайтесь на то, что переменная «чиста» из-за предыдущих действий в коде.
  2. Нормализуйте входящие данные с помощью СокрЛП(). Это защитит вас от невидимых символов, которые передает сканер, и от лишних пробелов, которые могут возникнуть при заполнении таблицы.
  3. Проверяйте логику. Если процедура включает в себя несколько этапов (например, сначала поиск товара по штрихкоду, а затем поиск маркировки в другой таблице), убедитесь, что переменные, используемые в этих процессах, изолированы друг от друга или корректно сброшены.

Следуя этим простым шагам, вы избавитесь от проблем с «пропусками» сканирований и сделаете работу с кодами маркировки в вашей конфигурации стабильной и предсказуемой.

← На главную