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

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

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

Анализ проблемы и постановка задачи

Стандартное поведение поля ввода в 1С предполагает несколько способов получения данных: нажатие кнопки выбора (лупа или F4), ввод по строке (автоподбор) и выбор из списка последних значений. Если мы просто добавим кнопку "Подбор" на форму, пользователи все равно смогут использовать стандартные механизмы, обходя установленные фильтры. Наша задача — перехватить все способы выбора и направить пользователя в нужное нам русло.

Способ 1. Программное управление событием НачалоВыбора

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

Проанализируем пример кода, который необходимо разместить в модуле формы документа:


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

КонецПроцедуры

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

Способ 2. Настройка свойств элемента формы для блокировки ввода

Чтобы пользователь не мог "обмануть" систему, вводя наименование товара вручную, необходимо правильно настроить свойства поля ввода Номенклатура в табличной части. Рассмотрим, какие свойства следует изменить:

  1. Кнопка выбора: установите значение "Нет", если вы хотите, чтобы пользователь нажимал только общую кнопку "Подбор" над таблицей.
  2. Автоподбор: установите "Выключить". Это уберет выпадающий список при наборе текста, который позволяет выбрать товар в обход формы подбора.
  3. Режим выбора из списка: убедитесь, что это свойство отключено, иначе система может предлагать историю последних введенных значений.
  4. Редактирование текста: установите значение "Ложь". В этом случае поле станет доступным только для выбора, но не для прямого ввода букв с клавиатуры.

Способ 3. Использование механизма Связи параметров выбора

Если ваша задача — не просто запретить выбор, а жестко ограничить список номенклатуры определенной группой, указанной в шапке документа, то наиболее элегантным решением будет использование Связей параметров выбора. Это механизм платформы, который работает на уровне метаданных или свойств формы.

Выясним причину, почему это эффективно: даже если откроется стандартное окно (например, если вы решите не отключать СтандартнаяОбработка), система автоматически применит фильтр. В свойствах колонки Номенклатура найдите пункт Связи параметров выбора и настройте связь:

В результате, какое бы окно выбора ни открыл пользователь, он увидит только позиции из разрешенной группы.

Способ 4. Управление доступностью для разных ролей

Как отмечалось в обсуждении на форуме, ограничения часто нужны только для одной категории пользователей (например, "Заказчик"), в то время как "Исполнитель" должен иметь полный доступ. Для этого лучше всего использовать программную установку свойства ТолькоПросмотр или Доступность при открытии формы.

Рассмотрим пример реализации в событии ПриОткрытии на сервере:


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

КонецПроцедуры

Способ 5. Валидация в событии ОбработкаВыбора

Даже при самых строгих визуальных запретах, стоит предусмотреть "последнюю линию обороны" — проверку уже выбранного значения. Разберем, как это сделать в событии ОбработкаВыбора табличного поля.

Проанализируем ситуацию: пользователь каким-то образом смог вставить значение. Мы должны проверить его на соответствие правилам:


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

Дополнительные рекомендации

Для создания максимально удобного интерфейса при использовании только подбора, мы рекомендуем:

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

← На главную