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