Всем привет,
есть поле ввода на УФ;
оно составного типа (или пробовала через ограничение типов программно, поведение аналогичное);
поэтому сначала пользователь выбирает тип документа из двух, а потом выбирает конкретный документ.

Есть обработчик события ОбработкаВыбора.
Конечная цель - показывать пользователю документы с отбором по поставщику, а у разных документов в ERP отбор идет либо по контрагенту, либо по партнеру, поэтому пришлось городить такой огород.

Когда пользователь добавляет первый документ, то отладкой видно, что один раз проходим процедуру на клиенте и один раз на сервере - при выборе типа; а при выборе конкретного документа уже не попадаем в обработку выбора. И получаем пустую ссылку, хотя документ выбрали.

А когда добавляем второй документ, то попадаем в этот обработчик оба раза - и при выборе типа, и при выборе документа, и всё хорошо, выбранный документ виден в этом поле.
При каждом следующем тоже все хорошо, 2 раза вызывается обработчик и виден документ.
То есть проблемы только с первым разом.

Как будто какое-то свойство меняется у поля ввода или где-то еще.
Но я выгрузила в список и сравнила свойства поля ввода после первого и второго раза - не вижу отличий.

Почему же в первый раз обработчик выбора не вызывается при выборе конкретного документа?
Помогите, пожалуйста, буду благодарна за любые мысли.

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

    &НаСервере
    Процедура Документ1СОбработкаВыбораНаСервере(ВыбранноеЗначение)

    НоваяСвязь = Неопределено;

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

    Если НоваяСвязь <> Неопределено Тогда
    НовыйМассив = Новый Массив;
    НовыйМассив.Добавить(НоваяСвязь);
    НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
    Элементы.Документы1СДокумент1С.СвязиПараметровВыбора = НовыеСвязи;
    КонецЕсли;

    КонецПроцедуры
```
---
Обработка выбора срабатывает два раза - первый раз - при выборе типа, второй раз - при выборе значения. Соответственно, в первый раз вы ей не даете нормально отработать, бегаете на сервер и т.д. - тут уже не до второго выбора. Но во второй раз тип уже выбран и открывается сразу форма выбора нужного документа, так? Поэтому и нужно ловить событие при изменении. Это раз.
Два (синтакс-помощник): В обработчике данного события (то есть ОбработкаВыбора) нельзя использовать серверные методы формы с директивой компиляции &НаСервере, а также изменять свойства, которые могут привести к серверному вызову.
---
в УТ(ЕРП, КА) есть метод

```1c
    СобытияФормИСКлиент.ПолеСоставногоТипаОбработкаВыбора(Форма, Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
```

он вызывается в обработчиках начало выбора
Например Справочник.КлассификаторОрганизацийСАТУРН.ФормаЭлемента

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

    ПолеСоставногоТипаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка);

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

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

    СобытияФормИСКлиент.ПолеСоставногоТипаОбработкаВыбора(ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка);

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

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

ВыбранноеЗначение = Неопределено

добавьте ветку

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

Реквизит один - это поле ввода документа, только там надо сначала тип выбрать, а потом сам документ.

Ладно бы каждый раз криво выбирался.
Смущает, что при первой попытке выбора можно выбрать тип, а выбор документа не начинается;
а при второй и следующих попытках нормально выбираем тип и потом собственно документ.
---
во-первых, спасибо, что отвечаете на мой вопрос, да еще и не совсем понятный, оказывается))))

ВыбранноеЗначение = Неопределено

Не выбранное значение очень даже определено;
при выборе типа - это тип,
а при выборе конкретной ссылки - это ДокументСсылка.

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

Если пользователь выбрал тип "поступление товаров", то связь параметров выбора одна,
если заявка - то связь другая.

Мне надо видеть выбранное значение, поэтому обработка выбора.

Не?
(8)
---
Обработка выбора срабатывает два раза - первый раз - при выборе типа, второй раз - при выборе значения. Соответственно, в первый раз вы ей не даете нормально отработать, бегаете на сервер и т.д. - тут уже не до второго выбора. Но во второй раз тип уже выбран и открывается сразу форма выбора нужного документа, так? Поэтому и нужно ловить событие при изменении. Это раз.
Два (синтакс-помощник): В обработчике данного события (то есть ОбработкаВыбора) нельзя использовать серверные методы формы с директивой компиляции &НаСервере, а также изменять свойства, которые могут привести к серверному вызову.
---
вроде внеконтекстные вызовы допустимы, если на параметры не заругает

```1c
    ПолеСвязей = Элементы.Документы1СДокумент1С;

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

    НоваяСвязь = Неопределено;

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

    Если НоваяСвязь <> Неопределено Тогда
    НовыйМассив = Новый Массив;
    НовыйМассив.Добавить(НоваяСвязь);
    НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
    ПолеСвязей.СвязиПараметровВыбора = НовыеСвязи;
    КонецЕсли;

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

может так или обновляем только поле с типом, если работает общее обновление
ОбновитьОтображениеДанных(Элементы.Документы1СДокумент1С);
---
в УТ(ЕРП, КА) есть метод

```1c
    СобытияФормИСКлиент.ПолеСоставногоТипаОбработкаВыбора(Форма, Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
```

он вызывается в обработчиках начало выбора
Например Справочник.КлассификаторОрганизацийСАТУРН.ФормаЭлемента

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

    ПолеСоставногоТипаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка);

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

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

    СобытияФормИСКлиент.ПолеСоставногоТипаОбработкаВыбора(ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка);

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

Вроде, вообще ничего не нужно детализировать. Событие на элемент пришить и все.
Метод сам распарсит типы.
---
Резюме такое:
Эта задача нерешаемая.
С одной стороны, параметры связи можно установить тольк на сервере (тут как раз ругается и не дает иначе сделать), а с другой стороны, ОбработкаВыбора возможна только на клиенте.

Поэтому пришлось пилить отдельную форму (некий аналог формы выбора), т.к. типов документов может быть много, по некоторым хитрые связи, по некоторым нормальные, а по некоторым их нет вообще.
Зато клиент доволен, уже потестировали)

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

А вот метод Оповестить - а ведь это мысль! Спасибо большое!

Запилила отдельную форму, ибо надо было вотпрямщас, а опыта, как видимо, не много, до оповещения не додумалась)
---
ПриИзменении (которая тоже отрабатывает 2 раза) таки можно определить тип значения реквизита.