Страницы: 1
RSS
Обработка выбора в ТаблицеФормы - открыть элемент справочника
 
Как правильно открыть карточку контрагента в таблице формы при обработке выбора?
 

Достаточно «показать» выбранное значение. В обработчике «Обработка выбор» одним из параметров является ВыбранноеЗначение – ссылка на выбранный элемент справочника, его непосредственно можно показать:

&НаКлиенте

              ПоказатьЗначение(,ВыбранноеЗначение);

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

Откроется Форма элемента по умолчанию.

Если нужна какая-то другая форма, то нужно открыть эту специальную форму с непосредственным указанием ее имени и передачей ссылки на открываемый элемент через параметр «Ключ»:

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

              ПараметрыФормы = Новый Структура;

              ПараметрыФормы.Вставить("Ключ", ВыбранноеЗначение);

              ИмяФормы = "Справочник.Контрагенты.Форма.ФормаЭлемента";

              ОткрытьФорму(ИмяФормы, ПараметрыФормы, ЭтотОбъект, Новый УникальныйИдентификатор());              

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

 
А если «ВыбранноеЗначение» это не сам контрагент (не ссылка на него), а строка с ИНН, то, получается, сначала нужно сопоставиться с ссылкой, а потом уже ее открывать?
 

Ну, да. Только в этому случае «клиентом» уже не отделаться, сопоставление придется делать на сервере.

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

В целом, да. Но в данном конкретном случае, с точки зрения оптимизация клиент-серверных отношений, лучше использовать «&НаСервереБезКонтекста». Для получения ссылки вам не нужен контекст всей формы, а достаточно передавать конкретный параметр «ИНН». Не понятно, какая у вас форма, но если она сложная, имеет табличные части с тысячами строк, то гонять с клиента на сервер всю ее целиком будет нецелесообразно.

 
Да, понимаю. Просто реальная задача немного сложнее. Искать нужно не только по ИНН, но еще и по КПП и, похоже, что будут еще дополнительные условия.
 

Исходя из новой информации, сложность ваших клиент-серверные вызовов не меняется. Можно передавать «без контекста» и два параметра:

&НаСервереБезКонтекста

Функция ВернутьКонтрагентаПоИНН(ИНН, КПП)

              …

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

А если количество параметров будет со временем изменяться, то лучше перейти на «Структуру», в параметрах вызова серверной функции указывать Структуру, а не конкретный набор переменных:

&НаСервереБезКонтекста

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

              …

              ПараметрыВызова = Новый Структура;

              ПараметрыВызова.Вставить(«ИНН», …);

              ПараметрыВызова.Вставить(«КПП», …);

              …

              ПараметрыВызова.Вставить(другие параметры, …);

              КонтрагентСсылка = ВернутьКонтрагентаПоИНН(ПараметрыВызова);

              …

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

&НаСервереБезКонтекста

Функция ВернутьКонтрагентаПоИНН(ПараметрыВызова)

              …

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

При добавлении новых параметров такой код будет проще модифицировать.

Ну, и вместо метода НайтиПоРеквизиту() вам уже запрос писать потребуется на стороне сервера.

С точки зрения оптимизации производительности написание запросов предпочтительнее даже при поиске по одному реквизиту. Т.е. запрос

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

              Запрос.УстановитьПараметр("ИНН", ИНН);

              Запрос.Текст =

              "ВЫБРАТЬ

              |             Контрагенты.Ссылка КАК Ссылка

              |ИЗ

              |             Справочник.Контрагенты КАК Контрагенты

              |ГДЕ

              |             Контрагенты.ИНН = &ИНН";

В общем случае будет работать быстрее, чем «ВернутьКонтрагентаПоИНН(ИНН)», т.к. при использовании «Запроса» СУБД выдаст серверу 1С только ссылку контрагента, а при отработке метода «ВернутьКонтрагентаПоИНН» - ссылку и значение всех реквизитов контрагента.

Страницы: 1