Обработка выбора и выбор типа УФ

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

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

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

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

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

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

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

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

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

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


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

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

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

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


Вроде, вообще ничего не нужно детализировать. Событие на элемент пришить и все.
Метод сам распарсит типы.
18. antz 25.01.25 08:55 Сейчас в теме
(17) Почему нерешаемая? Во-первых, еще раз: связи можно устанавливать ПриИзменении - кто запрещает-то?
Во-вторых - в обработке выбора можно вызвать метод Оповестить и в обработке оповещения устанавливать связи с вызовом сервера.
Но нет, проще запилить отдельную форму.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VmvLer 22.01.25 15:11 Сейчас в теме
смутно понял, подозреваю, что при первом выборе

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

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

ИначеЕсли ВыбранноеЗначение = Неопределено Тогда
        Сообщить("ку-ку"); // думаем, о связи по умолчанию
    КонецЕсли;
3. miniogn 42 22.01.25 16:52 Сейчас в теме
Если я правильно понял, что есть два реквизита и надо после выбора первого настроить параметры выбора второго.
Тогда можно вместо Документ1СОбработкаВыбора попробовать использовать событие Документ1СПриИзменении.
7. user1218207 22.01.25 17:13 Сейчас в теме
(3)
Если я правильно понял, что есть два реквизита и надо после выбора первого настроить параметры выбора второго.

Эх, криво объяснила, сорян)

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

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

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


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

А проблема в том, что при первом клике не доходит до второго выбора.
5. user1218207 22.01.25 17:09 Сейчас в теме
Сначала пользователь выбирает тип и тогда выбранноеЗначение - это тип
Прикрепленные файлы:
6. user1218207 22.01.25 17:10 Сейчас в теме
потом пользователь выбирает конкретный документ и тогда ВыбранноеЗначение - это ДокументСсылка
Прикрепленные файлы:
8. user2107191 22.01.25 17:16 Сейчас в теме
Потому что обработка выбора - она немного для другого. В твоем случае вполне хватит ПриИзменении()
9. user1218207 22.01.25 17:20 Сейчас в теме
Я вижу выбор пользователя и по нему строю связь параметров выбора.

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

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

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

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

&НаСервереБезКонтекста
Процедура Документ1СОбработкаВыбораНаСервере(ВыбранноеЗначение, ПолеСвязей)
    
    НоваяСвязь = Неопределено;
    
    Если ВыбранноеЗначение = Тип("ДокументСсылка.ЗаявкаНаРасходованиеДенежныхСредств") Тогда
        НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Запись.Вендор");
    ИначеЕсли ВыбранноеЗначение = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
        НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Партнер", "Партнер");
    КонецЕсли;
    
    Если НоваяСвязь <> Неопределено Тогда
        НовыйМассив = Новый Массив;
        НовыйМассив.Добавить(НоваяСвязь);
        НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
        ПолеСвязей.СвязиПараметровВыбора = НовыеСвязи;
    КонецЕсли;
    
КонецПроцедуры
Показать
14. user2107191 22.01.25 17:42 Сейчас в теме
(13) Ну да, явно же написано только про запрет &НаСервере
16. user1218207 25.01.25 04:44 Сейчас в теме
(11)
В обработчике данного события (то есть ОбработкаВыбора) нельзя использовать серверные методы формы с директивой компиляции &НаСервере, а также изменять свойства, которые могут привести к серверному вызову.

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


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

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


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

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

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

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


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

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

Еще раз всем спасибо!
Я бы еще долго без вас ковырялась.
18. antz 25.01.25 08:55 Сейчас в теме
(17) Почему нерешаемая? Во-первых, еще раз: связи можно устанавливать ПриИзменении - кто запрещает-то?
Во-вторых - в обработке выбора можно вызвать метод Оповестить и в обработке оповещения устанавливать связи с вызовом сервера.
Но нет, проще запилить отдельную форму.
19. user1218207 28.01.25 09:27 Сейчас в теме
(18) ПриИзменении не подходит, так как мне надо узнать, какой тип документа выбрал пользователь и после этого установить связи параметров выбора.

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

Запилила отдельную форму, ибо надо было вотпрямщас, а опыта, как видимо, не много, до оповещения не додумалась)
20. antz 28.01.25 09:35 Сейчас в теме
(19) ПриИзменении (которая тоже отрабатывает 2 раза) таки можно определить тип значения реквизита.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот