При разработке внешних обработок для работы со сканером штрихкодов часто возникает задача контроля уникальности данных. Если пользователь случайно сканирует один и тот же товар дважды, важно предотвратить дублирование строк в табличной части. Давайте разберем, как реализовать проверку на дубли и правильно заполнить данные в 1С.
Для того чтобы избежать появления одинаковых записей, нам не нужно перебирать всю таблицу циклом. В 1С есть эффективный метод НайтиСтроки(), который позволяет быстро отобрать нужные записи с помощью структуры. Рассмотрим, как это реализовать:
// Создаем структуру отбора, где ключ — имя колонки, а значение — искомый ШК
Отбор = Новый Структура("ШК", ШК);
НайденныеСтроки = НоменклатураДляВСД.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
Сообщить("Данный штрихкод уже был отсканирован!");
Возврат; // Прерываем выполнение, чтобы не добавлять дубль
КонецЕсли;
// Если дублей нет, добавляем новую строку
НоваяСтрока = НоменклатураДляВСД.Добавить();
НоваяСтрока.ШК = ШК;
Этот подход является стандартным и наиболее производительным. Метод НайтиСтроки() возвращает массив объектов, что позволяет нам сразу понять, есть ли совпадения.
Частая проблема при разборе данных — это неверная конвертация строкового представления даты в тип Дата. Если вы извлекаете части даты (год, месяц, день) как строки, их необходимо правильно объединить. Рассмотрим корректный способ:
// Предположим, мы получили части даты из штрихкода
ДатаВырГод = "21";
ДатаВырМесяц = "02";
ДатаВырДень = "19";
// Собираем строку и преобразуем в дату
ДатаВыработки = Дата("20" + ДатаВырГод + ДатаВырМесяц + ДатаВырДень);
Важно помнить, что конструктор Дата() ожидает формат строки ГГГГММДД. Добавление префикса "20" к двузначному году позволяет корректно привести данные к формату 21-го века.
Чтобы в табличной части вместо простого кода товара появилась ссылка на справочник, используем метод НайтиПоКоду(). Это позволит системе автоматически подставить наименование и другие свойства товара.
НайденнаяНоменклатура = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатура);
Если Не НайденнаяНоменклатура.Пустая() Тогда
НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
Иначе
Сообщить("Номенклатура с кодом " + КодНоменклатура + " не найдена в справочнике.");
КонецЕсли;
В начале работы с оборудованием часто возникает соблазн использовать Wscript.Shell для отправки клавиш TAB или ENTER. Мы настоятельно рекомендуем отказаться от этого метода. Почему это плохо:
Объект.ИмяТЧ.Добавить() работает в сотни раз быстрее, чем имитация нажатий клавиатуры.Теперь, при добавлении строки, вы просто обращаетесь к коллекции данных напрямую:
НоваяСтрока = Объект.НоменклатураДляВСД.Добавить();
НоваяСтрока.КодТовара = КодНоменклатура;
НоваяСтрока.Вес = Количество * 0.001;
НоваяСтрока.ДатаВыработки = ДатаВыработки;
Использование этого метода гарантирует, что ваша обработка будет работать стабильно, быстро и предсказуемо даже при интенсивном сканировании товаров.