Необходим отбор на УФ при выборе значения. Связи параметров выбора не прокатывают. Связь более сложная. Как максимально просто и лаконично реализовать строгий выбор определенных значений? Чтобы работал также как при использовании Связи параметров выбора. Я разумеется делал такое уже. Но приходилось использовать 2 события "НачалоВыбора" и АвтоПодбор" и в обоих из них получать допустимые значения из необходимого справочника. Там вроде и так не много кода. Но, подумал, может все-таки есть возможность сделать какую-то проверку, а её результаты бы действовали на все события связанные с данным реквизитом формы. Или я много хочу?))
Изначальная задача:
Есть справочник Дисциплины. У него есть подчиненный справочник Темы. Есть справочник Формы контроля. У элемента справочника Дисциплины есть ТЧ с допустимым набором Форм контроля. У элемента справочника Темы есть поле с типом Форма контроля. Нужно при выборе формы контроля для спр. Темы предлагать только те, которые есть в ТЧ его (Темы) владельца (Дисциплины).
---
Ну смотрите. Если Вам действительно необходимо "сделать все красиво" и иметь возможность устанавливать отбор на поле ввода Формы контроля по полю Дисциплины, то можете поступить следующим образом.

1) Доработайте форму выбора справочника Форм контроля. Дополните теста запроса списка следующей инструкцией расширения языка запросов:

```1c
    ВЫБРАТЬ
    *
    ИЗ
    Справочник.ФормыКонтроля КАК ФормыКонтроля
    {ГДЕ
    ИСТИНА В
    (ВЫБРАТЬ ПЕРВЫЕ 1
    ИСТИНА
    ИЗ
    Справочник.Дисциплины.ДопустимыеФормыКонтроля КАК ДопустимыеФормы
    ГДЕ
    ДопустимыеФормыКонтроля.Ссылка = &Дисциплина
    И ДопустимыеФормыКонтроля.ФормаКонтроля = ФормыКонтроля.Ссылка}
```

В обработчике создания формы выбора проверьте наличие параметра и установите его значение динамическому списку:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если Параметры.Свойство("Дисциплина") И ЗначениеЗаполнено(Параметры.Дисциплина) Тогда
    Спиосок.Параметры.УстановитьЗначениеПараметра("Дисциплина", Параметры.Дисциплина);
    КонецЕсли;

    КонецПроцедуры
```

2) Доработайте обработчик получения данных выбора справочника Форм контроля (модуль менеджера). Там тоже необходимо проверить наличие параметра и сформировать собственный список выбора для пользователя:

```1c
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

    Если Параметры.Свойство("Дисциплина") И ЗначениеЗаполнено(Параметры.Дисциплина) Тогда

    СтандартнаяОбработка = Ложь;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ФормыКонтроля.Ссылка,
    | ФормыКонтроля.Представление
    |ИЗ
    | Справочник.Дисциплины.ДопустимыеФормыКонтроля КАК ДопустимыеФормы
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФормыКонтроля КАК ФормыКонтроля
    | ПО ДопустимыеФормы.ФормаКонтроля = ФормыКонтроля.Ссылка
    |ГДЕ
    | ДопустимыеФормы.Ссылка = &Дисциплина";

    Запрос.УстановитьПараметр("Дисциплина", Параметры.Дисциплина);

    Если Параметры.Отбор.Количество() Тогда
    Для каждого Элемент Из Параметры.Отбор Цикл
    Запрос.Текст = Запрос.Текст + "
    | И ФормыКонтроля." + Элемент.Ключ + " = &" + Элемент.Ключ;
    Запрос.УстановитьПараметр(Элемент.Ключ, Элемент.Значение);
    КонецЦикла;
    КонецЕсли;

    Если Не ПустаяСтрока(Параметры.СтрокаПоиска) Тогда
    Запрос.Текст = Запрос.Текст + "
    | И ФормыКонтроля.Наименование ПОДОБНО &СтрокаПоиска";
    Запрос.УстановитьПараметр("СтрокаПоиска", Параметры.СтрокаПоиска + "%");
    КонецЕсли;

    ДанныеВыбора = Новый СписокЗначений;

    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Представление);
    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры
```

Готово. Теперь везде, где нужен отбор Форм контроля по дисциплине достаточно будет установить соответствующую связь параметров выбора с ключом "Дисциплина".
---
Если Вам необходим данный отбор лишь в форме Темы, тогда мне кажется, что не стоит усложнять себе разработку, и просто заполнять список выбора Формы контроля в форме Темы при создании и при изменении владельца.
---
Список выбора можно формировать только ПриСозданииНаСервере.
---
Почему Вы так решили?
---
Если мы говорим об одном и том же, то есть когда у элемента задан выбор из списка и соответственно задан список выбора, то его можно переопределить только при создании на сервере, у уже созданной формы это сделать нельзя. Решил исключительно из опыта.
---
Вы заблуждаетесь. Такая возможность есть.
---
Как, научите. Буду благодарен.
---
Ровно также, как он заполняется при создании формы на сервере. Честно говоря, я в растерянности, и не понимаю, о каком именно ограничении Вы ведете речь. На всякий случай уточню, мы ведь обсуждаем управляемые формы?
---
Беру свои слова назад все работает.
На УФ платформа 8.3.8.2088 не мог это реализовать, аналогичный код не давал результата, а может просто сглупил.
---
Там у одной дисциплины по паре десятков тем, как правило, со сложной иерархией. Не наглядно будет.
---
Извините, не понял. Поправьте меня, если я некорректно разобрался в постановке задачи. Вам необходимо ограничить список выбора "Форм контроля" в форме элемента "Темы", у которой есть владелец "Дисциплина". Т.е. какие "Формы контроля" указаны в Дисциплине, одну из них и можно выбирать в Теме. Где именно теряется наглядность?
---
Да, все верно. Я все сам затупил. Форм контроля там не так уж и много. Но там также важна иерархия. Так как есть одинаковые по названию формы, но лежащие в разных уровнях иерархии. И в плоском списке выбора они будут смешиваться друг с другом. Хотя это все-таки больше наш косяк проектирования. Надо будет подумать, как от этого избавиться.
---
Ну смотрите. Если Вам действительно необходимо "сделать все красиво" и иметь возможность устанавливать отбор на поле ввода Формы контроля по полю Дисциплины, то можете поступить следующим образом.

1) Доработайте форму выбора справочника Форм контроля. Дополните теста запроса списка следующей инструкцией расширения языка запросов:

```1c
    ВЫБРАТЬ
    *
    ИЗ
    Справочник.ФормыКонтроля КАК ФормыКонтроля
    {ГДЕ
    ИСТИНА В
    (ВЫБРАТЬ ПЕРВЫЕ 1
    ИСТИНА
    ИЗ
    Справочник.Дисциплины.ДопустимыеФормыКонтроля КАК ДопустимыеФормы
    ГДЕ
    ДопустимыеФормыКонтроля.Ссылка = &Дисциплина
    И ДопустимыеФормыКонтроля.ФормаКонтроля = ФормыКонтроля.Ссылка}
```

В обработчике создания формы выбора проверьте наличие параметра и установите его значение динамическому списку:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если Параметры.Свойство("Дисциплина") И ЗначениеЗаполнено(Параметры.Дисциплина) Тогда
    Спиосок.Параметры.УстановитьЗначениеПараметра("Дисциплина", Параметры.Дисциплина);
    КонецЕсли;

    КонецПроцедуры
```

2) Доработайте обработчик получения данных выбора справочника Форм контроля (модуль менеджера). Там тоже необходимо проверить наличие параметра и сформировать собственный список выбора для пользователя:

```1c
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

    Если Параметры.Свойство("Дисциплина") И ЗначениеЗаполнено(Параметры.Дисциплина) Тогда

    СтандартнаяОбработка = Ложь;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ФормыКонтроля.Ссылка,
    | ФормыКонтроля.Представление
    |ИЗ
    | Справочник.Дисциплины.ДопустимыеФормыКонтроля КАК ДопустимыеФормы
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФормыКонтроля КАК ФормыКонтроля
    | ПО ДопустимыеФормы.ФормаКонтроля = ФормыКонтроля.Ссылка
    |ГДЕ
    | ДопустимыеФормы.Ссылка = &Дисциплина";

    Запрос.УстановитьПараметр("Дисциплина", Параметры.Дисциплина);

    Если Параметры.Отбор.Количество() Тогда
    Для каждого Элемент Из Параметры.Отбор Цикл
    Запрос.Текст = Запрос.Текст + "
    | И ФормыКонтроля." + Элемент.Ключ + " = &" + Элемент.Ключ;
    Запрос.УстановитьПараметр(Элемент.Ключ, Элемент.Значение);
    КонецЦикла;
    КонецЕсли;

    Если Не ПустаяСтрока(Параметры.СтрокаПоиска) Тогда
    Запрос.Текст = Запрос.Текст + "
    | И ФормыКонтроля.Наименование ПОДОБНО &СтрокаПоиска";
    Запрос.УстановитьПараметр("СтрокаПоиска", Параметры.СтрокаПоиска + "%");
    КонецЕсли;

    ДанныеВыбора = Новый СписокЗначений;

    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Представление);
    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры
```

Готово. Теперь везде, где нужен отбор Форм контроля по дисциплине достаточно будет установить соответствующую связь параметров выбора с ключом "Дисциплина".
---
Любите Вы связи параметров выбора, но их изменять можно только на сервере, то есть хороши, когда задал и забыл. Просто Параметры Выбора прекрасно чувствую на клиенте, значит более гибкие
---
Не совсем так. Я привел пример реализации для сценария работы, когда как раз таки связи параметров выбора и не должны меняться.
---
Вроде бы для текущей задачи Параметры выбора больше подходят
А так можно прописать в конце модуля

```1c
    &НаСервере
    Процедура ОпределитьДействияФормы()
    Элементы.ОбъектСсылкиТоварыНоменклатура.УстановитьДействие("АвтоПодбор","МоеСобытиеАвтоПодбор");
    Элементы.ОбъектСсылкиТоварыНоменклатура.УстановитьДействие("ОбработкаВыбора","ОМоеСобытиеОбработкаВыбора");
    Элементы.ОбъектСсылкиТоварыНоменклатура.УстановитьДействие("НачалоВыбора","МоеСобытиеНачалоВыбора");
    КонецПроцедуры
    ОпределитьДействияФормы();
```

Там прописать

```1c
    ПараметрыПолученияДанных.Вставить("МояОбработка");
    ПараметрыПолученияДанных.Вставить("Мой параметр",Моя ссылка);
    ДанныеВыбора = ПолучитьДанныеВыбора(Тип(<Мой тип справочника>),ПараметрыПолученияДанных);
```

А в подписке, проверить свойство и выполнить по своему
---
А в подписке, проверить свойство и выполнить по свИменно реализацию подписки я и привел выше.

И мне кажется, мы немного о разном говорим. В чем по-Вашему выигрыш от использования параметров выбора? Ведь при использовании связи параметров выбора приведенный Вами код вовсе писать не нужно, равно как и определять обработчики подбора и выбора.
---
Параметры выбора можно переопределять на клиенте. Связи параметров выбора, только на сервере. Лишний трафик. Потому и говорю. Программно, Связи параметров выбора не нужно переопределять - геморой. Это нужно жестко, чтоб не парится, а если гибко, то следует использовать Параметры выбора Как и где. Я уже рассказывал в предыдущей нашей беседе.
ЗЫ: Всегда приятно поговорить с умным человеком
---
Спасибо за комплимент. Взаимно. :)

Я так полагаю, Вы в общем рассуждаете про параметры выбора, а не в контексте данной задачи? Т.е. если по условию задачи приходится менять связи параметров, то лучше вовсе от них отказаться в пользу параметров выбора? Если так, то я конечно же согласен: дополнительные серверные вызовы, а особенно смена связей параметров "на лету" в табличной части могут доставить много дискомфорта.

Если же речь про задачу в настоящем посте, то я предполагал, что никаких изменений связей параметров не требуется. На форме есть поле "Владелец", и есть поле "Форма контроля", подбор значений в котором зависит от выбранной дисциплины. Поэтому достаточно в конфигураторе для реквизита "Формы контроля" указать связь параметра выбора с полем Владельца, и дело в шляпе. Все остальное сделает доработанная форма выбора и обработчик получения данных выбора.
---
Т.е. если по условию задачи приходится менять связи параметров,
Я могу наступить на горло своей песни и менять свое решение под решение задачи. А когда много и все, то гибкость рулит
---
Спасибо, использование Параметров выбора на клиенте помогло решить проблему
Нужно было в зависимости от значения реквизита на форме устанавливать ограничения в поле выбора табличной части.
 Сначала делал через Связи параметров выбора, с заполнением этого массива на сервере.
По какой-то адской причине все работало только при повторном нажатии кнопки выбора. При первом нажатии, несмотря на то что значение реквизита формы было заполнено, отбор не заполнялся.
Платформа (8.3.15.1565)
---
Вот как можно. Не знал. Спасибо, просветили.
---
Сделай кастомную форму выбора "формы контроля", передавай в неё параметры и там уже предлагай что можно.
---
Кастомную делать необязательно. У меня конфа допиливается под заказчика. В стандартную передам правильный отбор через параметры. Но вопрос не в этом был.
---
Вынисите ТЧ в отдельный справочник и обойдётесь без костылей.
---
тогда уж не список выбора, а параметры выбора
---
Вообще можно и через связи, но тогда все равно придется на форме сделать реквизит типа список значений и заполнять его при чтении данных и изменении владельца.
А в связях будет типа "Отбор.Ссылка(ИмяРеквизитаСписокЗначений)".
---
При реализации данной идеи столкнулся с рядом проблем.

```1c
    &НаКлиенте
    Процедура РасшХерши_ПриОткрытииПосле(Отказ)

    ПодключитьОбработчикОжидания("РасшХерши_ОбновитьЗависимостиКонтактноеЛицоРозничныйПокупат­ель", 2);

    КонецПроцедуры

    &НаКлиенте
    Процедура РасшХерши_ОбновитьЗависимостиКонтактноеЛицоРозничныйПокупате­ль()

    Результат = РасшХерши_ОбновитьЗависимостиКонтактноеЛицоРозничныйПокупате­льНаСервере();

    Если Результат Тогда

    ОтключитьОбработчикОжидания("РасшХерши_ОбновитьЗависимостиКонтактноеЛицоРозничныйПокупат­ель");

    КонецЕсли;

    КонецПроцедуры

    &НаСервере
    Функция РасшХерши_ОбновитьЗависимостиКонтактноеЛицоРозничныйПокупате­льНаСервере()

    Результат = Ложь;

    СвойствоКонтактноеЛицо = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "КонтактноеЛицоСписокЗаказовКлиентов");

    Если СвойствоКонтактноеЛицо <> Неопределено Тогда

    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Свойство", СвойствоКонтактноеЛицо);

    НайденныеСтроки = ЭтотОбъект.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(ПараметрыОтбора);

    Если НайденныеСтроки.Количество() > 0 Тогда

    ИмяРеквизита = НайденныеСтроки[0].ИмяРеквизитаЗначение;

    КонтактноеЛицоРозничныйПокупатель = Элементы.Найти(ИмяРеквизита);

    Если КонтактноеЛицоРозничныйПокупатель = Неопределено Тогда

    //ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось найти реквизит контактное лицо розничного покупателя!");

    Иначе

    НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "РозничныйПокупательПартнер", РежимИзмененияСвязанногоЗначения.Очищать);

    НовыйМассив = Новый Массив();
    НовыйМассив.Добавить(НоваяСвязь);

    НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);

    КонтактноеЛицоРозничныйПокупатель.СвязиПараметровВыбора = НовыеСвязи;

    Результат = Истина;

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    Возврат Результат;

    КонецФункции
```

1. Дополнительные реквизиты на форме появляются с задержкой. Пришлось обработчик ожидания подключать и затем когда код отработал отключать, чтобы много кратно не вызывать код.
2. Данные реквизита отбора должны быть на форме, т.е. указать через 2 точки путь к данным не получится. Пришлось рисовать реквизит.
3. Алгоритм получения имени реквизита можно заменить на иной, но показалось наиболее простым.