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

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

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

Способ №1: Использование параметров выбора в Конфигураторе

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

Разберем этот процесс по шагам:

  1. Откроем Конфигуратор и найдем документ ПриходнаяНакладная.
  2. Перейдем на закладку «Данные» и выберем нужный реквизит (например, в табличной части Товары реквизит Номенклатура).
  3. В окне свойств реквизита найдем пункт Параметры выбора.
  4. Нажмем на кнопку выбора (три точки) и добавим новую строку в таблицу параметров.
  5. В колонке «Поле» выберем Отбор.Родитель. Если нам нужно ограничение по всей иерархии (включая вложенные папки), выбираем вид сравнения В группе.
  6. В колонке «Значение» укажем нашу предопределенную группу Материалы. Для этого выберем тип данных СправочникСсылка.Номенклатура и найдем в списке нужную папку.

Важный нюанс: при таком подходе система жестко ограничивает список доступных элементов. Пользователь при открытии формы выбора увидит только содержимое указанной папки без возможности выйти «наверх» в корень справочника.

Способ №2: Программная установка отбора через событие НачалоВыбора

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

Рассмотрим пример кода, который устанавливает отбор программно:


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

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

В данном примере мы используем метод ПредопределенноеЗначение, чтобы сослаться на конкретную группу справочника. Это гарантирует стабильную работу кода, даже если пользователь изменит наименование группы в режиме «1С:Предприятие».

Способ №3: Ограничение выбора групп (Элементы vs Папки)

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

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

Способ №4: Использование «Связей параметров выбора»

Разберем еще один автоматизированный механизм платформы 8.3 — Связи параметров выбора. Это особенно полезно, когда в документе есть поле «Категория номенклатуры», и список товаров должен фильтроваться в зависимости от выбранной категории.

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

Способ №5: Очистка истории выбора

Проанализируем распространенную проблему: разработчик настроил все фильтры, но пользователь все равно видит «Услуги» в выпадающем списке при наборе текста в поле. Это происходит из-за механизма Истории выбора, который запоминает ранее введенные значения.

Чтобы исключить попадание неподходящих элементов из истории, следует выполнить следующие действия:

  1. В свойствах поля ввода на форме установите свойство ОбновлениеТекстаРедактирования в значение ПослеВводаСтроки.
  2. Программно можно управлять списком выбора, очищая историю через свойство элемента формы СписокВыбора или используя свойство реквизита БыстрыйВыбор (установить в Ложь).

Итоги и рекомендации

Мы рассмотрели различные подходы к ограничению выбора в справочниках. Выбор конкретного метода зависит от архитектуры вашей конфигурации:

1. Если вы работаете в современных типовых конфигурациях (ERP, УТ 11, КА), правильнее использовать отбор не по папкам, а по реквизиту ТипНоменклатуры. Это связано с тем, что иерархия справочника может меняться пользователем, а тип номенклатуры (Товар, Услуга, Работа) остается неизменным.

2. Для самописных решений использование параметров выбора в Конфигураторе является самым быстрым и надежным способом реализации жестких ограничений.

3. Для динамических интерфейсов всегда выбирайте программный метод в событии НачалоВыбора, так как он позволяет учитывать контекст текущего сеанса пользователя и состояние документа.

← На главную