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