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