Как в 1С:Управление торговлей 11 запретить ручной выбор номенклатуры и оставить ввод только по штрихкоду

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе автоматизации складского учета и розничной торговли часто возникает задача минимизировать человеческий фактор. Один из эффективных способов — запретить кладовщикам или менеджерам выбирать товар из справочника вручную, заставив их использовать сканер штрихкодов. В этой статье мы подробно рассмотрим, как реализовать такой запрет в конфигурации 1С:Управление торговлей, редакция 11, проанализируем различные подходы и выберем наиболее надежный метод.

Постановка задачи и анализ ситуации

Представим ситуацию: в документах «Приобретение товаров и услуг» или «Перемещение товаров» пользователи часто ошибаются, выбирая похожие позиции из справочника «Номенклатура». Наша цель — сделать так, чтобы поле Номенклатура в табличной части Товары было недоступно для интерактивного выбора, но при этом данные успешно заполнялись при считывании штрихкода сканером. Разберем по шагам, как это реализовать.

Способ 1. Программное управление доступностью в событии ПриОткрытии

Самый простой и быстрый способ — это изменение свойства Доступность или ТолькоПросмотр для конкретного элемента формы. Рассмотрим пример кода, который можно разместить в модуле формы документа. Мы проанализируем ситуацию, когда ограничение должно действовать только для определенных пользователей.

Важно помнить, что проверка по имени пользователя ИмяПользователя() = "Вася" является «плохим тоном» в программировании, так как при изменении состава персонала придется постоянно править код. Правильнее использовать роли или профили групп доступа. Однако для понимания логики рассмотрим базовый пример:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем наличие специальной роли у пользователя
    Если РольДоступна("ЗапретРучногоВводаНоменклатуры") Тогда
        Элементы.ТоварыНоменклатура.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецПроцедуры

Почему этот метод может не подойти? Если мы устанавливаем Доступность = Ложь, поле становится серым и зачастую полностью исключается из цепочки событий формы. Некоторые модели сканеров, работающие в режиме эмуляции клавиатуры, могут требовать, чтобы фокус находился в активном поле. Поэтому перейдем к более гибкому методу.

Способ 2. Обработка события НачалоВыбора

Этот метод считается более профессиональным, так как он не блокирует само поле, а лишь отменяет действие по открытию формы справочника. Разберем, как это работает. Когда пользователь нажимает на кнопку выбора (три точки) или нажимает F4, срабатывает событие НачалоВыбора. Мы можем перехватить его и прервать выполнение стандартного алгоритма.

Рассмотрим пример кода для клиентской части формы:


&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Если у пользователя есть ограничение, отменяем стандартное окно выбора
    Если РольДоступна("ЗапретРучногоВводаНоменклатуры") Тогда
        СтандартнаяОбработка = Ложь;
        ПоказатьПредупреждение(, "Выбор номенклатуры разрешен только с помощью сканера штрихкодов!");
    КонецЕсли;
КонецПроцедуры

В данном случае параметр СтандартнаяОбработка = Ложь говорит системе, что открывать окно справочника не нужно. При этом поле остается доступным для программного заполнения.

Способ 3. Использование расширений конфигурации

В современных версиях 1С:УТ 11 крайне не рекомендуется вносить изменения напрямую в типовую конфигурацию. Это усложнит дальнейшие обновления. Вместо этого мы воспользуемся механизмом Расширений. Создадим расширение и добавим в него форму нужного документа (например, ПриобретениеТоваровУслуг).

Разберем алгоритм действий в расширении:

  1. Создаем новую роль в расширении, назовем ее ОграничениеРучногоВвода.
  2. В форме документа находим элемент ТоварыНоменклатура.
  3. Добавляем обработчик события НачалоВыбора с аннотацией &Перед.

Пример кода в расширении будет выглядеть так:


&Перед("ТоварыНоменклатураНачалоВыбора")
Процедура Расш1_ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    Если РольДоступна("ОграничениеРучногоВвода") Тогда
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

Как обеспечить работу сканера штрихкодов?

Многие задаются вопросом: если мы запретим выбор в поле, не перестанет ли работать сканер? Выясним причину, почему сканер продолжит работать. В типовых решениях на базе БПО (Библиотеки подключаемого оборудования) сканер не «вбивает» текст в поле, как человек. Он генерирует внешнее событие.

Проанализируем цепочку событий при сканировании:

  1. Сканер считывает код и передает его в систему 1С.
  2. В форме документа срабатывает процедура ВнешнееСобытие (или аналогичная в БПО).
  3. Код ищет номенклатуру в регистре сведений ШтрихкодыНоменклатуры.
  4. Если товар найден, он добавляется в таблицу Товары программным методом (создается новая строка, заполняются реквизиты).

Поскольку этот процесс происходит программно через объектную модель (напрямую в данные формы или объект документа), установленные нами запреты на интерактивный выбор в элементах формы не мешают работе оборудования.

Закрытие «лазеек» для обхода запрета

Опытные пользователи могут попытаться обойти ограничение. Проанализируем типичные пути обхода и способы их блокировки:

  1. Кнопка «Подобрать товары»: Эта кнопка открывает мощный инструмент подбора, где можно выбрать всё что угодно. Чтобы этого избежать, в процедуре ПриСозданииНаСервере нужно скрыть эту кнопку: Элементы.ГруппаКомандыЗаполнить.Видимость = Ложь; (или точечно скрыть команду подбора).
  2. Загрузка из внешнего файла: В УТ 11 есть стандартная обработка загрузки данных из Excel. Если необходимо полное ограничение, следует ограничить права на использование этой обработки или скрыть соответствующую команду в форме документа.
  3. Копирование строк: Пользователь может нажать Ctrl + Shift + C и Ctrl + Shift + V. Для борьбы с этим можно использовать событие табличной части ПередНачаломДобавления, где также проверять права и устанавливать Отказ = Истина, если добавление происходит не через механизм сканирования.

Рекомендация по архитектуре решения

Наиболее надежный, хоть и более трудозатратный способ контроля — регистрация источника ввода. Можно добавить в табличную часть Товары скрытый реквизит ВведеноПоШтрихкоду (тип Булево). При обработке внешнего события от сканера устанавливать этот флаг в Истина. В процедуре ПередЗаписью документа можно проверить: если в строке есть номенклатура, но флаг стоит в значении Ложь, значит, товар был выбран вручную или скопирован. В таком случае система должна выдавать ошибку и блокировать проведение документа.

Таким образом, мы рассмотрели комплексный подход к решению задачи. Выбор конкретного метода зависит от требований к жесткости контроля в вашей организации.

← На главную