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

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

В процессе разработки конфигураций на платформе 1С:Предприятие часто возникает задача разделения выбора элементов справочника в зависимости от контекста. Рассмотрим, как реализовать ограничение выбора номенклатуры таким образом, чтобы в одной табличной части были доступны только услуги, а в другой — только товары.

Метод 1: Использование параметров выбора в конфигураторе

Это самый простой и стандартный способ, не требующий написания программного кода. Платформа 1С позволяет задавать условия отбора прямо в свойствах элемента формы.

  1. Откройте форму вашего документа в конфигураторе.
  2. Перейдите к табличной части (например, «Услуги») и выберите колонку «Номенклатура».
  3. В палитре свойств найдите свойство Параметры выбора.
  4. Добавьте новый элемент списка:
    • В колонке «Имя» укажите Отбор.Родитель (если вы используете иерархию папок) или Отбор.ЭтоУслуга (если вы создали соответствующий реквизит в справочнике).
    • В колонке «Значение» укажите ссылку на группу «Услуги» или значение Истина/Ложь.

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

Метод 2: Программная настройка отбора в событии НачалоВыбора

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

Разберем пример реализации для формы документа. В коде формы мы можем перехватить открытие окна выбора:


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

При использовании этого метода важно учитывать, что пользователь может попытаться снять отбор в самой форме выбора. Чтобы сделать ограничение «жестким», мы рекомендуем дополнить код логикой обработки события ПриСозданииНаСервере в самой форме выбора справочника, принудительно устанавливая параметры отбора, которые нельзя будет отключить интерактивно.

Почему использование реквизитов лучше, чем отбор по группе?

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

Рассмотрим преимущества этого решения:

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

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

← На главную