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