В процессе автоматизации складского учета и розничной торговли часто возникает задача минимизировать человеческий фактор. Один из эффективных способов — запретить кладовщикам или менеджерам выбирать товар из справочника вручную, заставив их использовать сканер штрихкодов. В этой статье мы подробно рассмотрим, как реализовать такой запрет в конфигурации 1С:Управление торговлей, редакция 11, проанализируем различные подходы и выберем наиболее надежный метод.
Представим ситуацию: в документах «Приобретение товаров и услуг» или «Перемещение товаров» пользователи часто ошибаются, выбирая похожие позиции из справочника «Номенклатура». Наша цель — сделать так, чтобы поле Номенклатура в табличной части Товары было недоступно для интерактивного выбора, но при этом данные успешно заполнялись при считывании штрихкода сканером. Разберем по шагам, как это реализовать.
Самый простой и быстрый способ — это изменение свойства Доступность или ТолькоПросмотр для конкретного элемента формы. Рассмотрим пример кода, который можно разместить в модуле формы документа. Мы проанализируем ситуацию, когда ограничение должно действовать только для определенных пользователей.
Важно помнить, что проверка по имени пользователя ИмяПользователя() = "Вася" является «плохим тоном» в программировании, так как при изменении состава персонала придется постоянно править код. Правильнее использовать роли или профили групп доступа. Однако для понимания логики рассмотрим базовый пример:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие специальной роли у пользователя
Если РольДоступна("ЗапретРучногоВводаНоменклатуры") Тогда
Элементы.ТоварыНоменклатура.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Почему этот метод может не подойти? Если мы устанавливаем Доступность = Ложь, поле становится серым и зачастую полностью исключается из цепочки событий формы. Некоторые модели сканеров, работающие в режиме эмуляции клавиатуры, могут требовать, чтобы фокус находился в активном поле. Поэтому перейдем к более гибкому методу.
Этот метод считается более профессиональным, так как он не блокирует само поле, а лишь отменяет действие по открытию формы справочника. Разберем, как это работает. Когда пользователь нажимает на кнопку выбора (три точки) или нажимает F4, срабатывает событие НачалоВыбора. Мы можем перехватить его и прервать выполнение стандартного алгоритма.
Рассмотрим пример кода для клиентской части формы:
&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Если у пользователя есть ограничение, отменяем стандартное окно выбора
Если РольДоступна("ЗапретРучногоВводаНоменклатуры") Тогда
СтандартнаяОбработка = Ложь;
ПоказатьПредупреждение(, "Выбор номенклатуры разрешен только с помощью сканера штрихкодов!");
КонецЕсли;
КонецПроцедуры
В данном случае параметр СтандартнаяОбработка = Ложь говорит системе, что открывать окно справочника не нужно. При этом поле остается доступным для программного заполнения.
В современных версиях 1С:УТ 11 крайне не рекомендуется вносить изменения напрямую в типовую конфигурацию. Это усложнит дальнейшие обновления. Вместо этого мы воспользуемся механизмом Расширений. Создадим расширение и добавим в него форму нужного документа (например, ПриобретениеТоваровУслуг).
Разберем алгоритм действий в расширении:
ОграничениеРучногоВвода.ТоварыНоменклатура.НачалоВыбора с аннотацией &Перед.Пример кода в расширении будет выглядеть так:
&Перед("ТоварыНоменклатураНачалоВыбора")
Процедура Расш1_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если РольДоступна("ОграничениеРучногоВвода") Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Многие задаются вопросом: если мы запретим выбор в поле, не перестанет ли работать сканер? Выясним причину, почему сканер продолжит работать. В типовых решениях на базе БПО (Библиотеки подключаемого оборудования) сканер не «вбивает» текст в поле, как человек. Он генерирует внешнее событие.
Проанализируем цепочку событий при сканировании:
ВнешнееСобытие (или аналогичная в БПО).ШтрихкодыНоменклатуры.Товары программным методом (создается новая строка, заполняются реквизиты).Поскольку этот процесс происходит программно через объектную модель (напрямую в данные формы или объект документа), установленные нами запреты на интерактивный выбор в элементах формы не мешают работе оборудования.
Опытные пользователи могут попытаться обойти ограничение. Проанализируем типичные пути обхода и способы их блокировки:
ПриСозданииНаСервере нужно скрыть эту кнопку:
Элементы.ГруппаКомандыЗаполнить.Видимость = Ложь; (или точечно скрыть команду подбора).Ctrl + Shift + C и Ctrl + Shift + V. Для борьбы с этим можно использовать событие табличной части ПередНачаломДобавления, где также проверять права и устанавливать Отказ = Истина, если добавление происходит не через механизм сканирования.Наиболее надежный, хоть и более трудозатратный способ контроля — регистрация источника ввода. Можно добавить в табличную часть Товары скрытый реквизит ВведеноПоШтрихкоду (тип Булево). При обработке внешнего события от сканера устанавливать этот флаг в Истина. В процедуре ПередЗаписью документа можно проверить: если в строке есть номенклатура, но флаг стоит в значении Ложь, значит, товар был выбран вручную или скопирован. В таком случае система должна выдавать ошибку и блокировать проведение документа.
Таким образом, мы рассмотрели комплексный подход к решению задачи. Выбор конкретного метода зависит от требований к жесткости контроля в вашей организации.