В процессе автоматизации складского учета одной из приоритетных задач является ускорение ввода данных. Использование штрихкодов позволяет минимизировать ошибки «человеческого фактора» и значительно ускорить процесс подбора товаров в такие документы, как Реализация товаров и услуг или Перемещение товаров. В этой статье мы подробно разберем, как реализовать механизм поиска по штрихкоду, если информация о них хранится в самописном регистре сведений.
Для начала рассмотрим наиболее профессиональный подход — работу со сканером штрихкодов в режиме эмуляции COM-порта. В отличие от режима «разрыва клавиатуры», этот метод позволяет системе 1С точно идентифицировать, что данные пришли именно со сканера, а не были введены пользователем вручную. Разберем, как настроить форму документа для приема таких данных.
Воспользуемся стандартным механизмом платформы. В форме документа существует предопределенная процедура ВнешнееСобытие. Проанализируем пример кода для обработки считанного кода:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверяем, что событие пришло от сканера штрихкода
Если Событие = "BarCodeValue" Или Источник = "BarCodeScanner" Тогда
ШтрихкодСчитанный = СокрЛП(Данные);
ДобавитьТоварПоШтрихкоду(ШтрихкодСчитанный);
КонецЕсли;
КонецПроцедуры
Внутри процедуры ДобавитьТоварПоШтрихкоду нам необходимо вызвать серверную функцию, которая выполнит запрос к нашему регистру сведений ШтрихКод. Рассмотрим структуру этого запроса подробнее. Важно помнить, что поиск должен быть быстрым, поэтому поле Штрихкод в регистре должно быть индексировано.
&НаСервере
Процедура ДобавитьТоварПоШтрихкоду(Штрихкод)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихКод.Номенклатура КАК Товар
|ИЗ
| РегистрСведений.ШтрихКод КАК ШтрихКод
|ГДЕ
| ШтрихКод.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Добавляем новую строку в табличную часть "Товары"
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Выборка.Товар;
НоваяСтрока.Количество = 1;
// Здесь можно добавить логику заполнения цен и единиц измерения
Иначе
Сообщить("Товар со штрихкодом " + Штрихкод + " не найден!");
КонецЕсли;
КонецПроцедуры
Иногда пользователю удобнее не использовать сканер, а просто скопировать штрихкод из другого окна или ввести его вручную в поле выбора номенклатуры. Чтобы система «узнала» штрихкод в поле Номенклатура, нам нужно переопределить логику получения данных выбора. Для этого перейдем в Модуль менеджера справочника Номенклатура.
Разберем использование обработчика ОбработкаПолученияДанныхВыбора. Этот метод срабатывает, когда пользователь начинает вводить текст в поле. Мы можем программно проверить, не является ли введенный текст штрихкодом.
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
ТекстПоиска = Параметры.СтрокаПоиска;
// Если длина строки похожа на EAN-13 или другой формат штрихкода
Если СтрДлина(ТекстПоиска) >= 8 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихКод.Номенклатура КАК Ссылка
|ИЗ
| РегистрСведений.ШтрихКод КАК ШтрихКод
|ГДЕ
| ШтрихКод.Штрихкод ПОДОБНО &ТекстПоиска";
Запрос.УстановитьПараметр("ТекстПоиска", ТекстПоиска + "%");
СписокТоваров = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
Если СписокТоваров.Количество() > 0 Тогда
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.ЗагрузитьЗначения(СписокТоваров);
СтандартнаяОбработка = Ложь; // Отключаем штатный поиск по наименованию
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Благодаря этому решению, как только оператор вставит штрихкод в колонку «Товар», система мгновенно предложит соответствующую номенклатуру.
Часто данные приходят в виде файлов из Терминалов Сбора Данных (ТСД) или просто в таблицах Excel. Выясним, как эффективно загрузить такие данные в документ Перемещение товаров. Основная ошибка новичков — поиск каждого товара в цикле. Мы проанализируем, как сделать это правильно с помощью одного запроса.
Для чтения Excel рекомендуем использовать объект ТабличныйДокумент. Это избавляет от необходимости устанавливать MS Office на сервере и работает значительно быстрее через метод Прочитать().
Посмотрим на алгоритм загрузки:
ШтрихКод.
&НаСервере
Процедура ЗагрузитьИзТаблицыНаСервере(ТаблицаДанных)
// ТаблицаДанных содержит колонки: Штрихкод, Количество, Цена
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
// Помещаем загруженные штрихкоды во временную таблицу
Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_Данные ИЗ &ТЗ КАК ТЗ";
Запрос.УстановитьПараметр("ТЗ", ТаблицаДанных);
Запрос.Выполнить();
// Связываем временную таблицу с регистром штрихкодов
Запрос.Текст =
"ВЫБРАТЬ
| ВТ_Данные.Количество,
| ВТ_Данные.Цена,
| ШтрихКод.Номенклатура
|ИЗ
| ВТ_Данные КАК ВТ_Данные
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихКод КАК ШтрихКод
| ПО ВТ_Данные.Штрихкод = ШтрихКод.Штрихкод";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.Количество = Выборка.Количество;
НоваяСтрока.Цена = Выборка.Цена;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию с производительностью и точностью поиска. При работе со штрихкодами следует придерживаться нескольких правил:
1. Индексация. В вашем самописном регистре сведений ШтрихКод обязательно должно быть установлено свойство «Индексировать» для измерения или ресурса, где хранится строка кода. Без этого при накоплении 10-20 тысяч записей поиск начнет ощутимо «тормозить».
2. Очистка данных. Сканеры штрихкодов иногда могут добавлять невидимые префиксы или суффиксы (символы возврата каретки). Всегда используйте функцию СокрЛП() при получении данных от сканера или из Excel.
3. Использование БСП. Если ваша конфигурация не полностью самописная, а основана на современных типовых решениях, мы рекомендуем использовать подсистему «Подключаемое оборудование» из Библиотеки стандартных подсистем (БСП). Это позволит избежать написания низкоуровневого кода для работы с драйверами сканеров и обеспечит поддержку большинства моделей оборудования «из коробки».
Рассмотренные методы позволяют гибко настроить систему под нужды склада: от простого ручного ввода до массовой загрузки данных из ТСД. Совместное использование ВнешнегоСобытия для оперативной работы и пакетной загрузки из файлов обеспечит максимальную эффективность работы сотрудников.