Как реализовать поиск дублей в табличной части обработки при сканировании штрихкода?

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

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

Шаг 1: Проверка на наличие дублей перед добавлением строки

Для того чтобы избежать появления одинаковых записей, нам не нужно перебирать всю таблицу циклом. В 1С есть эффективный метод НайтиСтроки(), который позволяет быстро отобрать нужные записи с помощью структуры. Рассмотрим, как это реализовать:


// Создаем структуру отбора, где ключ — имя колонки, а значение — искомый ШК
Отбор = Новый Структура("ШК", ШК);
НайденныеСтроки = НоменклатураДляВСД.НайтиСтроки(Отбор);

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

// Если дублей нет, добавляем новую строку
НоваяСтрока = НоменклатураДляВСД.Добавить();
НоваяСтрока.ШК = ШК;

Этот подход является стандартным и наиболее производительным. Метод НайтиСтроки() возвращает массив объектов, что позволяет нам сразу понять, есть ли совпадения.

Шаг 2: Правильный разбор даты из штрихкода

Частая проблема при разборе данных — это неверная конвертация строкового представления даты в тип Дата. Если вы извлекаете части даты (год, месяц, день) как строки, их необходимо правильно объединить. Рассмотрим корректный способ:


// Предположим, мы получили части даты из штрихкода
ДатаВырГод = "21";
ДатаВырМесяц = "02";
ДатаВырДень = "19";

// Собираем строку и преобразуем в дату
ДатаВыработки = Дата("20" + ДатаВырГод + ДатаВырМесяц + ДатаВырДень);

Важно помнить, что конструктор Дата() ожидает формат строки ГГГГММДД. Добавление префикса "20" к двузначному году позволяет корректно привести данные к формату 21-го века.

Шаг 3: Поиск номенклатуры по коду

Чтобы в табличной части вместо простого кода товара появилась ссылка на справочник, используем метод НайтиПоКоду(). Это позволит системе автоматически подставить наименование и другие свойства товара.


НайденнаяНоменклатура = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатура);
Если Не НайденнаяНоменклатура.Пустая() Тогда
    НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
Иначе
    Сообщить("Номенклатура с кодом " + КодНоменклатура + " не найдена в справочнике.");
КонецЕсли;

Шаг 4: Отказ от эмуляции нажатий клавиш (Wscript.Shell)

В начале работы с оборудованием часто возникает соблазн использовать Wscript.Shell для отправки клавиш TAB или ENTER. Мы настоятельно рекомендуем отказаться от этого метода. Почему это плохо:

  1. Нестабильность: если пользователь переключит окно в момент сканирования, данные попадут не в 1С, а в стороннее приложение (например, в блокнот или браузер).
  2. Скорость: прямое присвоение значений реквизитам табличной части через Объект.ИмяТЧ.Добавить() работает в сотни раз быстрее, чем имитация нажатий клавиатуры.
  3. Чистота кода: прямое заполнение данных исключает ошибки, связанные с фокусом ввода в интерфейсе.

Теперь, при добавлении строки, вы просто обращаетесь к коллекции данных напрямую:


НоваяСтрока = Объект.НоменклатураДляВСД.Добавить();
НоваяСтрока.КодТовара = КодНоменклатура;
НоваяСтрока.Вес = Количество * 0.001;
НоваяСтрока.ДатаВыработки = ДатаВыработки;

Использование этого метода гарантирует, что ваша обработка будет работать стабильно, быстро и предсказуемо даже при интенсивном сканировании товаров.

← На главную