Допустим, необходимо ограничить выбор реквизитов в зависимости от других реквизитов.
Например, в зависимости от контрагента ограничить выбор номенклатуры, которая ему может быть продана.
Или ограничить перечень допустимых счетов учета в зависимости от номенклатуры.
Как проще всего это сделать?
Если ограничение простое, например, каждый контрагент может закупать номенклатуру из своей группы, то достаточно добавить в справочник контрагентов реквизит "Номенклатура" и хранить в нем группу, которая контрагенту доступна. К сожалению, обычно условия отбора более сложные и одного реквизита недостаточно. Приходится хранить несколько полей, типы сравнения, потом городить сложные условия.
На самом деле все проще.
В 1С есть специальный тип данных, который предназначен для хранения отборов и так и называется "Отбор".
Прелесть этого типа в том, что он сам подбирает возможные ограничения. Т.е. если Вам нужен отбор по номенклатуре, то пользователь увидит доступные реквизиты справочника номенклатура и в зависимости от выбранного реквизита сможет указать допустимое условие отбора (Равно, Не равно, В группе, В списке, Содержит и др). В зависимости от условия отбора пользователь сможет ввести и значения фильтра (фиксированное значение, интервал, список) нужного типа (цифровое, строка, булево, элемент справочника).
Пользователь может накладывать несколько ограничений на разные реквизиты. Эти ограничения будут действовать совместно.
Итак, как им пользоваться.
Для примера возьмем простейшую приведенную выше задачу "В зависимости от контрагента ограничить выбор номенклатуры, которая ему может быть продана"
1. В справочник "Контрагенты" добавляем реквизит "УсловияОтбора" типа "ХранилищеЗначений". В нем будем хранить условия отбора на справочник "Номенклатура". (Вернее, хранить будем построитель отчета, так как тип "Отбор", по данным синтакс-помошника, не входит в сериализуемые)
2. Добавляем на форму справочника контрагентов реквизит данные отбора с типом "Отбор" и связываем его с табличным полем на форме.
3. В форму элемента справочника "Контрагенты" добавляем процедуры:
3.1 "ПриОткрытии" - в нем по сохраненному построителю отчетов заполняем отборы.
3.2. "ПередЗаписью" - в нем по отбору формируем построитель и сохраняем его в элементе справочника.
4. В форму документа для элемента "Номенклатура" табличной части добавляем обработчик события "НачалоВыбора", в котором по выбранному контрагенту накладываем условие на справочник "Номенклатура"
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, СтандартнаяОбработка)
//Если заполнен контрагент,
//то дополнительно на отбираемую номенклатуру накладываем фильтр из настроек контрагента
Если ЗначениеЗаполнено(Контрагент.УсловияОтбора) Тогда
ПостроительСтруктура = Контрагент.УсловияОтбора.Получить();
Если ПостроительСтруктура <> Неопределено Тогда
СтандартнаяОбработка = Ложь;
ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора(,Элемент);
//Получаем сохраненный построитель отчета и из него условия отбора
Построитель = Новый ПостроительОтчета(ПостроительСтруктура.Текст);
Построитель.ЗаполнитьНастройки();
Построитель.УстановитьНастройки(ПостроительСтруктура.Настройки);
Для каждого Настройка Из Построитель.Отбор Цикл
НовоеУсловиеОтбора = ФормаВыбора.СправочникСписок.Отбор[Настройка.ПутьКДанным];
НовоеУсловиеОтбора.ВидСравнения = Настройка.ВидСравнения;
ЗаполнитьЗначенияСвойств(НовоеУсловиеОтбора,Настройка);
КонецЦикла;
ФормаВыбора.Открыть();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В результате при выборе номенклатуры в документ реализация у нас отображается лишь та номенклатура, которая доступна указанному в документе контрагенту.
Выгрузка базы с примером в приложении к статье.
В базе 2 справочника ("Контрагенты" и "Номенклатура") и один документ "Реализация товаров". Для контрагента можно указать фильтр на номенклатуру, которая будет доступна в документе реализации.
Работает в обычном интерфейсе. Но при необходимости эту же идею можно аналогично реализовать и на управляемых формах.