При интенсивной работе на складе или в торговом зале стандартное поведение 1С, когда окно поиска по штрихкоду (вызываемое клавишей F7) закрывается сразу после первого ввода, может существенно замедлять процесс. Оператору приходится каждый раз заново нажимать клавишу, чтобы добавить следующую позицию. Разберем, как изменить программный код так, чтобы окно оставалось открытым до тех пор, пока пользователь сам не нажмет кнопку «Отмена» или «Закрыть».
В типовых конфигурациях на обычных формах (например, «Управление торговлей 10.3» или «Розница 1.0») механизм поиска по штрихкоду обычно реализован через вызов функции ВвестиСтроку. Процесс выглядит следующим образом: программа открывает модальное диалоговое окно, ожидает ввода значения, передает его на сервер для поиска номенклатуры и закрывает окно. Наша задача — поместить этот вызов в цикл.
Рассмотрим исходный фрагмент кода, который требует доработки:
Результат = РаботаСТорговымОборудованием.ВвестиШтрихкод();
Если Не ПустаяСтрока(Результат) Тогда
ПолучитьСерверТО().ОбработатьВведенныйШтрихкод(Результат, ЭтаФорма);
КонецЕсли;
Здесь функция ВвестиШтрихкод() срабатывает один раз, возвращает строку, и выполнение кода идет дальше. Чтобы окно открывалось повторно, нам необходимо использовать конструкцию Пока ... Цикл.
Проанализируем ситуацию: метод ВвестиСтроку возвращает Истина, если пользователь нажал кнопку «ОК» (или нажал Enter на клавиатуре/сканере), и Ложь, если была нажата кнопка «Отмена». Это идеальное условие для цикла.
Шаг 1. Изменение функции ввода
Для начала убедимся, что сама функция ВвестиШтрихкод в общем модуле возвращает пустую строку или управление, но не закрывает процесс. Однако, как показал опыт обсуждения на форуме, лучше всего вынести логику цикла непосредственно в обработчик нажатия кнопки на форме, чтобы не нарушить работу других документов, где циклический ввод не требуется.
Шаг 2. Настройка обработчика кнопки «Поиск по штрихкоду»
Найдем в форме документа (например, в подборе номенклатуры) процедуру КоманднаяПанельТоварыПоискПоШтрихКоду. Перепишем ее следующим образом:
Процедура КоманднаяПанельТоварыПоискПоШтрихКоду(Кнопка)
Результат = ""; // Инициализируем переменную для хранения штрихкода
// Запускаем цикл. Окно будет открываться снова и снова,
// пока функция ВвестиСтроку возвращает Истина (нажат ОК)
Пока ВвестиСтроку(Результат, "Введите штрихкод", 20) Цикл
Если Не ПустаяСтрока(Результат) Тогда
// Передаем полученный код в стандартный обработчик системы
ПолучитьСерверТО().ОбработатьВведенныйШтрихкод(Результат, ЭтаФорма);
// Важно: после обработки штрихкода очищаем переменную,
// чтобы в следующем окне поле ввода было пустым
Результат = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Разберем подробнее, что происходит в этом коде. При каждом успешном вводе (сканировании) выполняется метод ОбработатьВведенныйШтрихкод, который ищет товар и добавляет его в список. После этого управление возвращается к началу цикла, и ВвестиСтроку снова рисует окно на экране. Как только вы закончите сканирование и нажмете «Отмена», цикл завершится, и процедура закончит работу.
Рассмотрим ситуацию, с которой столкнулись участники обсуждения — «двойной ввод». Это происходит, если вы вызываете ввод штрихкода и перед циклом, и внутри условия цикла. Проанализируем ошибочный пример:
Результат = РаботаСТорговымОборудованием.ВвестиШтрихкод(); // Ошибка: лишний вызов
Пока ВвестиСтроку(Результат, "Введите штрихкод") Цикл
// ... обработка ...
КонецЦикла;
В данном случае первое окно откроется, получит код, но ничего с ним не сделает, так как обработчик находится внутри цикла. А второе окно откроется уже внутри цикла. Всегда следите за тем, чтобы ВвестиСтроку или любая функция, ее вызывающая, встречалась в коде ровно один раз — непосредственно в условии Пока.
Если вы работаете в современном интерфейсе «Такси» на управляемых формах, использование модальных окон (таких как ВвестиСтроку) крайне не рекомендуется или вовсе запрещено настройками конфигурации. В этом случае необходимо использовать асинхронные вызовы.
Вместо цикла Пока используется описание оповещения и процедура обратного вызова. Проанализируем схему:
ПоказатьВводСтроки.Это позволяет добиться того же эффекта «незакрывающегося окна», не блокируя при этом основной поток работы программы.
Стоит отметить, что сама необходимость использования клавиши F7 часто вызвана тем, что сканер штрихкодов работает в режиме «разрыва клавиатуры». Выясним причину: в этом режиме сканер просто эмулирует быстрый ввод символов с клавиатуры, и 1С не понимает, что это данные со сканера, пока вы не «подставите» ей поле ввода.
Для более профессиональной работы рекомендуем:
CR или LF).В таком случае штрихкод будет обрабатываться через событие ВнешнееСобытие формы. Это позволит сканировать товар в любое время, даже если никакое окно ввода не открыто — товар будет просто добавляться в табличную часть «на лету».
Если вы модифицируете типовую конфигурацию, старайтесь не изменять общие модули и формы напрямую. Выясним, почему это важно: при обновлении программы ваши изменения могут быть затерты. В версии 8.3 используйте Механизм расширений. Вы можете создать расширение, добавить туда нужную форму и переопределить обработку команды через аннотацию &Вместо, сохранив чистоту основной конфигурации.
Подводя итог, можно сказать, что внедрение простого цикла вокруг функции ввода строки значительно повышает эргономику рабочего места оператора, избавляя его от лишних движений и нажатий клавиш.