При автоматизации складских или аптечных процессов мы часто сталкиваемся с тем, что после сканирования штрихкода (ШК) с помощью китайских терминалов сбора данных (ТСД) активной становится не та ячейка в табличной части документа. Например, курсор перескакивает в колонку с количеством. Если в этот момент с ТСД передаются некорректные данные или пользователь случайно нажимает клавиши, может появиться окно ввода серий или другие нежелательные диалоги. Проанализируем эту ситуацию и разберем по шагам несколько эффективных способов решения данной проблемы, от настроек интерфейса до написания программного кода.
Рассмотрим самый простой метод, который не требует изменения программного кода 1С. Если главная проблема заключается в том, что курсор попадает в колонку Количество и случайное нажатие вызывает окно ввода серий, мы можем обойти это на уровне настроек элементов формы.
После применения этой настройки, когда ТСД эмулирует нажатие клавиши Enter при сканировании, курсор будет автоматически перескакивать ячейку количества и вставать на следующую доступную колонку. Это снизит риск случайного вызова окна серий.
Выясним причину, почему не всегда удобно использовать первый метод. Иногда пользователю все же нужно вручную редактировать количество, поэтому лучше программно возвращать фокус обратно на колонку штрихкода или номенклатуры после обработки сканирования.
Для этого в 1С используется свойство ТекущийЭлемент. Посмотрим на пример классического возврата фокуса. Вызов этой команды нужно размещать в самом конце процедуры ОбработкаОповещения или ВнешнееСобытие, то есть там, где платформа перехватывает и обрабатывает отсканированный штрихкод:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// ... здесь находится ваш код обработки штрихкода ...
// Возвращаем курсор на поле ввода штрихкода
ЭтаФорма.ТекущийЭлемент = Элементы.Штрихкод;
КонецПроцедуры
В некоторых случаях (особенно при работе на управляемых формах 1С) простое присвоение текущего элемента не срабатывает. Это происходит из-за того, что платформе нужно время для завершения всех фоновых процессов обновления интерфейса после добавления новой строки в табличную часть. Если вы столкнулись с такой ситуацией, разберем обходной путь с использованием метода ПодключитьОбработчикОжидания.
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Обработка данных сканирования
ОбработатьШтрихкод(Данные);
// Вызываем процедуру активации ячейки с небольшой задержкой (0.1 сек)
ПодключитьОбработчикОжидания("АктивироватьЯчейкуШтрихкода", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура АктивироватьЯчейкуШтрихкода()
ЭтаФорма.ТекущийЭлемент = Элементы.Штрихкод;
КонецПроцедуры
Благодаря задержке, 1С сначала полностью отрисовывает добавленный товар в табличной части, а затем корректно переводит курсор в нужное поле ввода.
Важное примечание: многие начинающие специалисты пытаются программно активировать колонку Номер строки. Делать этого не следует, так как колонка с номером строки по умолчанию является системной и недоступна для редактирования. Платформа 1С блокирует установку фокуса на нередактируемые элементы. Логичнее возвращать фокус обратно на поле ввода ШК или на колонку Номенклатура.
Если само устройство "не умеет" отправлять нужные управляющие символы (например, стрелки влево или вправо), мы можем прописать эмуляцию нажатия клавиш прямо в коде 1С. Для этого используется COM-объект WScript.Shell.
Рассмотрим подробнее код, который имитирует нажатие кнопок. Он добавляется в конец алгоритма обработки отсканированных данных:
// Эмуляция нажатия стрелки ВЛЕВО
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.SendKeys("{LEFT}");
// Аналогично можно отправлять и другие клавиши:
// WshShell.SendKeys("{RIGHT}");
// WshShell.SendKeys("{ENTER}");
// WshShell.SendKeys("{TAB}");
Учитывайте, что данный метод работает исключительно для Windows-клиентов. Если вы используете мобильный клиент 1С непосредственно на ТСД под управлением ОС Android, метод создания COM-объекта WScript.Shell не сработает и выдаст ошибку.
Если проблема возникает именно на ТСД, лучшим решением часто является изменение настроек самого оборудования. Почти любой китайский ТСД работает в режиме эмуляции клавиатуры и имеет системные утилиты для настройки сканера (обычно это системные приложения с названием Scanner, Barcode Utility или Keyboard Wedge).
По умолчанию после успешного чтения ШК устройство отправляет символ возврата каретки CR (эквивалент клавиши Enter). Именно из-за этого 1С обрабатывает ввод и сдвигает курсор вправо (на колонку с количеством). Проанализируем, как это исправить:
Tab, в зависимости от желаемого поведения в 1С.При отключении суффикса 1С перестанет автоматически смещать фокус ячейки табличной части, что кардинально изменит поведение системы и избавит от случайных открытий диалоговых окон.
В качестве нестандартного обходного пути мы можем сделать саму ячейку количества временно недоступной. Это применимо, если по вашей бизнес-логике штучный товар всегда добавляется по принципу "+1" за каждое считывание ТСД.
Для этого в процедуре обработки ШК перед добавлением строки установите для соответствующего элемента формы свойство ТолькоПросмотр = Истина. После завершения сканирования (или по нажатию отдельной кнопки) вы можете возвращать свойство ТолькоПросмотр = Ложь. В этом случае случайное нажатие аппаратных кнопок на ТСД вообще не спровоцирует открытие диалогового окна серий, так как ячейка будет заблокирована платформой.
Используя один из перечисленных методов, вы сможете надежно контролировать логику перемещения активной ячейки и избавить пользователей от неудобств при потоковом сканировании товаров.