У внешней обработки есть табличная часть. Среди ее реквизитов есть "Категория" - спр.КатегорииЗапросов и "Тип" - Пер.ТипыЗапросов. Между собой они связаны следующим образом:

В спр. "КатегорииЗапросов" есть реквизит "Тип" - пер. "ТипыЗапросов". И вот необходимо, чтобы при выборе категорий, в списке можно было увидеть только те, у кого тип = тип из тч.

Как правильно поставить такой отбор? Это обработчик события "Началовыбора", верно? А что внутри? Можно пример?
---
Тогда Вам придется таки определять обработчики событий "НачалоВыбора" и еще кое какие. Но сделать это можно чуть проще. При этом связи параметров выбора оставляем настроенными. А обработчики следующие:

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

    // Этот обработчик сработает, когда пользователь нажмет кнопку "..."

    ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
    СтандартнаяОбработка = Ложь;
    ОткрытьФорму("Справочник.КатегорииЗапросов.ФормаВыбора", , Элемент);
    КонецЕсли;

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

    &НаКлиенте
    Процедура ТаблицаКатегорияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)

    // Этот обработчик сработает, когда пользователь введет текст и на секунду остановится

    Перем ЗначениеОтбора;

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

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

    &НаКлиенте
    Процедура ТаблицаКатегорияОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)

    // Этот обработчик сработает, когда пользователь введет текст и нажемет "Таб"

    Перем ЗначениеОтбора;

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

    КонецПроцедуры
```
---
мне кажется можно сделать просто связь по типу, но это не точно.
---
```1c
    &НаКлиенте
    Процедура МагазинНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    фиксНастройки = Новый НастройкиКомпоновкиДанных;
    Отбор = фиксНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    Отбор.ПравоеЗначение = ПолучитьСписоЗначенийНаСервере(Элементы.ИмяТЧ.ТекущиеДанные.КакойтоРеквизит);
    Отбор.Использование = Истина;
    Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ФиксированныеНастройки", фиксНастройки);
    ОткрытьФорму("Справочник.Магазины.ФормаВыбора", ПараметрыФормы, Элемент);
    КонецПроцедуры
```
---
А в функции "ПолучитьСписокЗначенийНаСервере" мне нужно написать запрос с отбором по типу и получить возможные категории?
---
да, верно, и вернуть списокзначений
---
Сделала так, но форма открывается пустая.

```1c
    &НаКлиенте
    Процедура СписокЗапросовКатегорияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

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

    Функция ПолучитьСписокЗначенийНаСервере(ТипЗапроса)

    Запрос = новый Запрос;

    Запрос.УстановитьПараметр("Тип", ТипЗапроса);
    Запрос.Текст = "ВЫБРАТЬ
    | КатегорииЗапросов.Ссылка
    |ИЗ
    | Справочник.КатегорииЗапросов КАК КатегорииЗапросов
    |ГДЕ
    | КатегорииЗапросов.Тип = &Тип";

    Выборка = Запрос.Выполнить().Выбрать();

    СписокКатегорий = Новый СписокЗначений;

    Пока Выборка.Следующий() Цикл

    СписокКатегорий.Добавить(Выборка.Ссылка);

    КонецЦикла;

    Возврат СписокКатегорий;

    КонецФункции
```
---
Вам ни к чему такие сложности с событием "НачалоВыбора". Настройте свойство "СвязиПараметровВыбора" у реквизита "Категория" - делается это в 2 клика. Остальное на себя возьмет платформа.
---
Действительно, сработало! Спасибо большое! А если наоборот? То есть теперь в зависимости от категории нужно выбирать нужный тип, но тип это перечисление. Тогда все таки понадобится НачалоВыбора?
---
Извините, не понял задачу. Каким образом должен сработать отбор "наоборот"?
---
Так же нужно при выборе реквизита "Тип" смотреть, какая категория выбрана и в зависимости от нее ограничить список возможных типов. (Тип - перечисление "Типы запросов")

Кстати, при установленных связях параметров выбора, если поле "Тип" не заполнено, то форма открывается пустая(
---
ограничить список возможных типов
Меня и интересует это ограничение. В запросе у Вас уже указан тип. Так какое ожидается ограничение типов? Он ведь один будет.

то форма открывается пустая
Так это же здорово. Пока не укажешь тип, не выберешь и запрос, т.о. они всегда соответствуют друг другу. Или Вы ожидаете другое поведение?
---
Суть задачи такова: Вот обе эти значения пустые. Пользователь, например, выбирает категорию и так как тип не заполнен, ему доступны все категории. Далее он выбирает тип. Но здесь уже должен сработать отбор, та как категория заполнена.

И наоборот:

Пользователь выбирает тип (доступны все типы, т.к. категория не заполнена), далее он выбирает категорию и тут уже формируется список категорий, у которых тип такой же, как указан в табличной части обработки.
---
Пожалуй, такую задачу мышкой не решить. В качестве решения первой задачи предлагаю Вам следующее: не ограничивать Тип, а заполнять его из категории при выборе. Для этого потребуется определить обработчик события "ПриИзменении" для колонки категории:

```1c
    &НаКлиенте
    Процедура ТаблицаКатегорияПриИзменении(Элемент)

    ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
    Если ЗначениеЗаполнено(ТекущаяСтрока.Категория) И Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
    ТекущаяСтрока.Тип = ПолучитьТипЗапросаНаСервере(ТекущаяСтрока.Категория);
    КонецЕсли;

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

    &НаСервереБезКонтекста
    Функция ПолучитьТипЗапросаНаСервере(Категория)

    Запрос = Новый Запрос("ВЫБРАТЬ Тип ИЗ Справочник.КатегорииЗапросов ГДЕ Ссылка = &Категория");
    Запрос.УстановитьПараметр("Категория", Категория);

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    Возврат Выборка.Тип;
    Иначе
    Возврат Перечисления.ТипыЗапросов.ПустаяСсылка();
    КонецЕсли;

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

А вот по поводу второй уже есть вопрос. Как я понимаю, вносить в конфигурацию изменения нельзя?
---
Нет, нельзя, нужно ограничиться только разработкой в обработке..

Сейчас разберу Ваш пример.
---
Тогда Вам придется таки определять обработчики событий "НачалоВыбора" и еще кое какие. Но сделать это можно чуть проще. При этом связи параметров выбора оставляем настроенными. А обработчики следующие:

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

    // Этот обработчик сработает, когда пользователь нажмет кнопку "..."

    ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
    СтандартнаяОбработка = Ложь;
    ОткрытьФорму("Справочник.КатегорииЗапросов.ФормаВыбора", , Элемент);
    КонецЕсли;

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

    &НаКлиенте
    Процедура ТаблицаКатегорияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)

    // Этот обработчик сработает, когда пользователь введет текст и на секунду остановится

    Перем ЗначениеОтбора;

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

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

    &НаКлиенте
    Процедура ТаблицаКатегорияОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)

    // Этот обработчик сработает, когда пользователь введет текст и нажемет "Таб"

    Перем ЗначениеОтбора;

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

    КонецПроцедуры
```
---
Спасибо Вам огромное! С Категориями все верно работает!

Что касается типов, то нужно поразмыслить, это же перечисление, и формы у него нет.
---
Пожалуйста. :)

Но я до сих пор не понимаю, как Вы хотите отбирать типы. Положим пользователь выбрал категорию "К1", в которой указан тип "Т1". Какой список выбора должен увидеть пользователь в обработке?
---
В такой ситуации должен быть для выбора доступен только тип "Т1" )
---
Прокомментируйте тогда третий абзац сообщения (25).
---
Форма у Перечисления есть, Но проще воспользоваться Списком выбора элемента

МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18");
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
Элементы.ТабличнаяЧастьСтавкаНДС.СписокВыбора.ЗагрузитьЗначения(МассивЭлементов);;
---
(16) Можно просто Программно добавляя или очищая Связи параметров выбора или Параметров выбора, в зависимости от заполненности элемента в Начало выбора и При Изменении. Без вызова Открытия формы Например

```1c
    &НаКлиенте
    Процедура ТабличнаяЧастьВидЦеныНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
    МассивЭлементов = Новый Массив;
    Если Не ДанныеСтроки.Партнер.Пустая() Тогда
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Владелец", ДанныеСтроки.Партнер);
    МассивЭлементов.Добавить(НовыйПараметр);
    КонецЕсли;
    Элемент.ПараметрыВыбора=Новый ФиксированныйМассив(МассивЭлементов);

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

    &НаКлиенте
    Процедура ТабличнаяЧастьВидЦеныПриИзменении(Элемент)
    ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
    МассивЭлементов = Новый Массив;
    Если Не ДанныеСтроки.ВидЦены.Пустая() Тогда
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Ссылка"
    ,ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДанныеСтроки.ВидЦены,"Владелец"));
    МассивЭлементов.Добавить(НовыйПараметр);
    КонецЕсли;
    Элементы.ТабличнаяЧастьПартнер.ПараметрыВыбора = Новый ФиксированныйМассив(МассивЭлементов);
    КонецПроцедуры
```
---
Можно просто И в чем же простота?

Во-первых, событие "ПриИзменении" не подходит. Параметры выбора ведь распространяются на всю колонку цеником. Что, если тип будет изменен в одной строке, а после этого категория выбирается в другой? Или еще проще: только что открыт ранее сохраненный документ, тип не перевыбирается, изменяется только категория?

Во-вторых, событие "НачалоВыбора" срабатывает перед открытием формы выбора. А как же ввод по строке?

И когда Вы учтете все нюансы, неужели код в итоге будет проще?
---
(1) Я с утра переосмыслил Ваше предложение, и пришел к выводу, что погорячился вчера. :) Ваша реализация неверная, но вот предложение менять параметры выбора "на лету" - вполне работоспособно. Так даже будет нагляднее, чем предложенный мной ранее способ. Можно попробовать.

Итак, нужно удалить связь параметров выбора между типом и категорией и реализовать всего 2 обработчика события: "ПриИзменении" для типа и "ПриАктивизацииСтроки" для таблицы:

```1c
    &НаКлиенте
    Процедура ТаблицаТипПриИзменении(Элемент)

    Элементы.Таблица.ТекущиеДанные.Категория = Неопределено;

    НастроитьВыборКатегории();

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

    &НаКлиенте
    Процедура ТаблицаПриАктивизацииСтроки(Элемент)

    НастроитьВыборКатегории();

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

    &НаКлиенте
    Процедура НастроитьВыборКатегории()

    ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;

    ПараметрыВыбора = Новый Массив;
    Если ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Тип", ТекущаяСтрока.Тип);
    ПараметрыВыбора.Добавить(НовыйПараметр);
    КонецЕсли;

    Элементы.ТаблицаКатегория.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбора);

    КонецПроцедуры
```
---
(1)То был просто пример и идея
Ну раз пошла такая пьянка
При Активации строки плохо, Лишние вызовы и при редактировании потеряется..
Для справочника достаточно воспользоваться событием Автоподбор. И Выбор будет работать, и ввод по строке

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

А вот с перечислениемп Параметры выбора не катят. Потому воспользуемся событиями: НачалоВыбора ,ОкончаниеВводаТекста, ИзменениеТекстаРедактирования,. Определим ДанныеВыбора и отрегулируем ввод по строке

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

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

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

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

Взгляните на свое решение. Если пользователь сначала выберет категорию, у него будет ограничен выбор типа одним значением. Зачем его тогда ограничивать, если можно просто этим значением заполнить колонку? Ну допустим, нужно ограничивать. Пользователь выбирает этот единственный элемент, все хорошо. Но затем он осознал, что неправильно выбрал категорию. Получается патовая ситуация: другую категорию (с другим типом) выбрать не можем, потому что выбор ограничен типом, но и другой тип выбрать не можем, потому что выбор ограничен категорией. В этом случае нужно сначала очистить категорию, потом тип, а потом уже выбрать нужную категорию. В общем совершенно ненужный пользователю квест. :)
---
При настройках элемента по умолчанию , событие Автоподбор вызывается первым и через него передается параметр выбора в элемент, который автоматом перейдет в Выбор. (нажатие "..." или F4) . Все. делается в одном событии. Других танцев с бубном не нужно

Про перечисление. Пусть (1) ArBot скакжет
---
Идею понял, спасибо.
---
Читай тут: https://its.1c.ru/db/metod8dev#content:2876:hdoc