Пытаюсь реализовать получение Таблицы Значений из веб сервиса, обрабатывается из события ПриАктивацииСтроки, но процедура зацикливается

1. antonal123 19.05.18 10:18 Сейчас в теме
На форме в расширении есть две табличных части, первая табличная часть заполняется из веб сервиса, вторая должна заполняться при наступлении события ПриАктивацииСтроки.
Нужно получить Таблицу Значений из Веб сервиса и записать ее во вторую табличную часть
 &НаСервере
Процедура ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказа)
	Соединение = WSСсылки.SelectNom.СоздатьWSПрокси("SelectNom","SelectNom","SelectNomSoap");
	Операция = Соединение.ТочкаПодключения.Интерфейс.Операции.Получить("SelectOrder");
	Структура = УникальныйИдентификаторЗаказа;
	Ответ = Соединение.SelectNom(Структура);
	ТЗ = Десериализовать(Ответ);
	УникальныйИдентификаторВХ = Новый УникальныйИдентификатор;
	Адрес = ПоместитьВоВременноеХранилище(ТЗ,УникальныйИдентификаторВХ);
	ТЧСтруктураЗаказа = Объект.СодержаниеЗаказа;
	ТЗ = ПолучитьИзВременногоХранилища(Адрес);
	ТЧСтруктураЗаказа.Загрузить(ТЗ);
КонецПроцедуры
Показать


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


НаКлиенте проверка проходит, все хорошо, вызывается серверная процедура, и вот в ней как раз и происходит зацикливание на этом шаге
Ответ = Соединение.SelectNom(Структура);


Видимо что то вызывает перерисовку формы и событие вызывается еще раз, так как сразу после этого вызывается клиентская процедура и снова начинает проверку
НомСтрока = Элементы.ЗаказыКлиентов.ТекущаяСтрока;
	Если НомСтрока = Неопределено Тогда
		Отказ = Истина;
	Иначе
		ТекСтрока = Элементы.ЗаказыКлиентов.ТекущиеДанные;


Подскажите пожалуйста, как избежать перерисовки формы или как ее правильно обработать ?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. antonal123 19.05.18 11:02 Сейчас в теме
В веб сервисе по какой то причине из цикла сразу перескакивает в форму расширения, на событие ПриАктивацииСтроки
Функция SelectNom(Nom)
	ИД = Nom;
	Док = Документы.ЗаказПокупателя.НайтиПоРеквизиту("УникальныйИдентификаторЗаказа",ИД);
	ТабЗнач = Новый ТаблицаЗначений;
	ТЧНом = Док.ТЧНоменклатура;
	Для Каждого СтрТЧ из ТЧНом Цикл
		ТабЗнач.Добавить(СтрТЧ);
	КонецЦикла;
	Возврат Сериализовать(ТабЗнач);

КонецФункции
Показать
3. user928779 19.05.18 11:14 Сейчас в теме
В обработчике активизации строки нельзя делать контекстные серверные вызовы.
4. antonal123 19.05.18 11:49 Сейчас в теме
(3) А каким образом мне нужно обработать действия этой серверной процедуры ?
5. user928779 19.05.18 12:15 Сейчас в теме
(4) Вернуть значение из безконтекстного вызова на клиент.
И учитывая то, что вызов веб сервиса это дорогая операция, надо убрать вызов в однократный обработчик ожидания, развязывющий активизацию строки и вызов сервера. Иначе быстрым постукиванием по кнопке курсора можно поставить систему колом.
antonal123; +1 Ответить
6. antonal123 19.05.18 15:13 Сейчас в теме
(5) Обработчик ожидания подключается на клиенте, а из НаСервереБезКонтекста мы ведь можем вызвать так же, только НаСервереБезКонтекста, или я что то не правильно понимаю ?
7. FIGOR 20.05.18 09:18 Сейчас в теме
попробуйте вынести вызов серверной процедуры

ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме);

в отдельную процедуру с дерективой &НаКлиентеНаСервереБезКонтекста
antonal123; +1 Ответить
9. antonal123 21.05.18 06:49 Сейчас в теме
(7) Вынес, ругается на обработчик ожидания
&НаСервереБезКонтекста
Функция ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме)
	Соединение = WSСсылки.SelectNom.СоздатьWSПрокси("SelectNom","SelectNom","SelectNomSoap");
	Операция = Соединение.ТочкаПодключения.Интерфейс.Операции.Получить("SelectOrder");
	Структура = УникальныйИдентификаторЗаказаНаФорме;
	Ответ = Соединение.SelectNom(Структура);
	Возврат Ответ;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаказыКлиентовПриАктивацииСтрокиНаКлиентеНаСервере(УникальныйИдентификаторЗаказаНаФорме)
	ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме);
КонецПроцедуры

&НаКлиенте 
Функция ЗаказыКлиентовПриАктивацииПервыйРазНаКлиенте(УникальныйИдентификаторЗаказаНаФорме)
	ПодключитьОбработчикОжидания("ЗаказыКлиентовПриАктивацииСтрокиНаКлиентеНаСервере",3,Истина);
	Структура = УникальныйИдентификаторЗаказаНаФорме;
	ДесериализоватьОтвет(УникальныйИдентификаторЗаказаНаФорме);
КонецФункции

&НаСервере
Функция ДесериализоватьОтвет(УникальныйИдентификаторЗаказаНаФорме)
	Структура = УникальныйИдентификаторЗаказаНаФорме;
	ТЗ = Десериализовать(Структура);
	УникальныйИдентификаторВХ = Новый УникальныйИдентификатор;
	Адрес = ПоместитьВоВременноеХранилище(ТЗ,УникальныйИдентификаторВХ);
	ТЧСтруктураЗаказа = Объект.СодержаниеЗаказа;
	ТЗ = ПолучитьИзВременногоХранилища(Адрес);
	ТЧСтруктураЗаказа.Загрузить(ТЗ);
КонецФункции

&НаКлиенте
Процедура ЗаказыКлиентовПриАктивизацииСтроки(Элемент)
	НомСтрока = Элементы.ЗаказыКлиентов.ТекущаяСтрока;
	Если НомСтрока = Неопределено Тогда
		Отказ = Истина;
	Иначе
		ТекСтрока = Элементы.ЗаказыКлиентов.ТекущиеДанные;
	УникальныйИдентификаторЗаказаНаФорме = ТекСтрока.УникальныйИдентификаторЗаказа;
	ЗаказыКлиентовПриАктивацииПервыйРазНаКлиенте(УникальныйИдентификаторЗаказаНаФорме);
	КонецЕсли;
КонецПроцедуры
Показать


В обработчик ожидания нельзя включать безконтекстные процедуры и функции ?
10. FIGOR 21.05.18 09:48 Сейчас в теме
(9)
&НаКлиентеНаСервереБезКонтекста
Процедура ЗаказыКлиентовПриАктивацииСтрокиНаКлиентеНаСервере(УникальныйИдентификаторЗаказаНаФорме)
ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме);
КонецПроцедуры


Вот такой пример отработал без проблем

&НаКлиенте
Процедура ДоплатыПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("МойОбработчик",1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура МойОбработчик()
	
	ПоказатьУИД(" УИД = " +ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры	

&НаКлиентеНаСервереБезКонтекста
Процедура ПоказатьУИД(УникальныйИдентификатор)
    сообщить(УникальныйИдентификатор);
КонецПроцедуры
Показать
antonal123; +1 Ответить
8. FIGOR 20.05.18 09:23 Сейчас в теме
Я согласен с высказанным мнением выше, что после активизации строки надо вызывать обработчик ожидания, чтобы из него вызывать процедуру запроса данных, поскольку пользователь может просто перейти на строку, а потом сразу же на другую строку, нем смысла на каждый клик вызывать запрос данных. Можно подождать пол-секунды, секунду, чтобы убедиться, что пользователь реально хочет видеть данные по выделенной строке. Ну и не мешает показать пользователю состояние процесса в форме, чтобы он понимал, что система не просто зависла, а делает обработку данных.
antonal123; +1 Ответить
Оставьте свое сообщение

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