Пытаюсь реализовать получение Таблицы Значений из веб сервиса, обрабатывается из события ПриАктивацииСтроки, но процедура зацикливается
На форме в расширении есть две табличных части, первая табличная часть заполняется из веб сервиса, вторая должна заполняться при наступлении события ПриАктивацииСтроки.
Нужно получить Таблицу Значений из Веб сервиса и записать ее во вторую табличную часть
Для того, что бы событие не всплывало где не нужно, добавил проверку на заполненность 1-ой табличной части
НаКлиенте проверка проходит, все хорошо, вызывается серверная процедура, и вот в ней как раз и происходит зацикливание на этом шаге
Видимо что то вызывает перерисовку формы и событие вызывается еще раз, так как сразу после этого вызывается клиентская процедура и снова начинает проверку
Подскажите пожалуйста, как избежать перерисовки формы или как ее правильно обработать ?
Нужно получить Таблицу Значений из Веб сервиса и записать ее во вторую табличную часть
&НаСервере
Процедура ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказа)
Соединение = WSСсылки.SelectNom.СоздатьWSПрокси("SelectNom","SelectNom","SelectNomSoap");
Операция = Соединение.ТочкаПодключения.Интерфейс.Операции.Получить("SelectOrder");
Структура = УникальныйИдентификаторЗаказа;
Ответ = Соединение.SelectNom(Структура);
ТЗ = Десериализовать(Ответ);
УникальныйИдентификаторВХ = Новый УникальныйИдентификатор;
Адрес = ПоместитьВоВременноеХранилище(ТЗ,УникальныйИдентификаторВХ);
ТЧСтруктураЗаказа = Объект.СодержаниеЗаказа;
ТЗ = ПолучитьИзВременногоХранилища(Адрес);
ТЧСтруктураЗаказа.Загрузить(ТЗ);
КонецПроцедуры
ПоказатьДля того, что бы событие не всплывало где не нужно, добавил проверку на заполненность 1-ой табличной части
&НаКлиенте
Процедура ЗаказыКлиентовПриАктивизацииСтроки(Элемент)
НомСтрока = Элементы.ЗаказыКлиентов.ТекущаяСтрока;
Если НомСтрока = Неопределено Тогда
Отказ = Истина;
Иначе
ТекСтрока = Элементы.ЗаказыКлиентов.ТекущиеДанные;
УникальныйИдентификаторЗаказаНаФорме = ТекСтрока.УникальныйИдентификаторЗаказа;
ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме);
КонецЕсли;
КонецПроцедуры
ПоказатьНаКлиенте проверка проходит, все хорошо, вызывается серверная процедура, и вот в ней как раз и происходит зацикливание на этом шаге
Ответ = Соединение.SelectNom(Структура);
Видимо что то вызывает перерисовку формы и событие вызывается еще раз, так как сразу после этого вызывается клиентская процедура и снова начинает проверку
НомСтрока = Элементы.ЗаказыКлиентов.ТекущаяСтрока;
Если НомСтрока = Неопределено Тогда
Отказ = Истина;
Иначе
ТекСтрока = Элементы.ЗаказыКлиентов.ТекущиеДанные;
Подскажите пожалуйста, как избежать перерисовки формы или как ее правильно обработать ?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В веб сервисе по какой то причине из цикла сразу перескакивает в форму расширения, на событие ПриАктивацииСтроки
Функция SelectNom(Nom)
ИД = Nom;
Док = Документы.ЗаказПокупателя.НайтиПоРеквизиту("УникальныйИдентификаторЗаказа",ИД);
ТабЗнач = Новый ТаблицаЗначений;
ТЧНом = Док.ТЧНоменклатура;
Для Каждого СтрТЧ из ТЧНом Цикл
ТабЗнач.Добавить(СтрТЧ);
КонецЦикла;
Возврат Сериализовать(ТабЗнач);
КонецФункции
Показать
(4) Вернуть значение из безконтекстного вызова на клиент.
И учитывая то, что вызов веб сервиса это дорогая операция, надо убрать вызов в однократный обработчик ожидания, развязывющий активизацию строки и вызов сервера. Иначе быстрым постукиванием по кнопке курсора можно поставить систему колом.
И учитывая то, что вызов веб сервиса это дорогая операция, надо убрать вызов в однократный обработчик ожидания, развязывющий активизацию строки и вызов сервера. Иначе быстрым постукиванием по кнопке курсора можно поставить систему колом.
(7) Вынес, ругается на обработчик ожидания
В обработчик ожидания нельзя включать безконтекстные процедуры и функции ?
&НаСервереБезКонтекста
Функция ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме)
Соединение = WSСсылки.SelectNom.СоздатьWSПрокси("SelectNom","SelectNom","SelectNomSoap");
Операция = Соединение.ТочкаПодключения.Интерфейс.Операции.Получить("SelectOrder");
Структура = УникальныйИдентификаторЗаказаНаФорме;
Ответ = Соединение.SelectNom(Структура);
Возврат Ответ;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ЗаказыКлиентовПриАктивацииСтрокиНаКлиентеНаСервере(УникальныйИдентификаторЗаказаНаФорме)
ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме);
КонецПроцедуры
&НаКлиенте
Функция ЗаказыКлиентовПриАктивацииПервыйРазНаКлиенте(УникальныйИдентификаторЗаказаНаФорме)
ПодключитьОбработчикОжидания("ЗаказыКлиентовПриАктивацииСтрокиНаКлиентеНаСервере",3,Истина);
Структура = УникальныйИдентификаторЗаказаНаФорме;
ДесериализоватьОтвет(УникальныйИдентификаторЗаказаНаФорме);
КонецФункции
&НаСервере
Функция ДесериализоватьОтвет(УникальныйИдентификаторЗаказаНаФорме)
Структура = УникальныйИдентификаторЗаказаНаФорме;
ТЗ = Десериализовать(Структура);
УникальныйИдентификаторВХ = Новый УникальныйИдентификатор;
Адрес = ПоместитьВоВременноеХранилище(ТЗ,УникальныйИдентификаторВХ);
ТЧСтруктураЗаказа = Объект.СодержаниеЗаказа;
ТЗ = ПолучитьИзВременногоХранилища(Адрес);
ТЧСтруктураЗаказа.Загрузить(ТЗ);
КонецФункции
&НаКлиенте
Процедура ЗаказыКлиентовПриАктивизацииСтроки(Элемент)
НомСтрока = Элементы.ЗаказыКлиентов.ТекущаяСтрока;
Если НомСтрока = Неопределено Тогда
Отказ = Истина;
Иначе
ТекСтрока = Элементы.ЗаказыКлиентов.ТекущиеДанные;
УникальныйИдентификаторЗаказаНаФорме = ТекСтрока.УникальныйИдентификаторЗаказа;
ЗаказыКлиентовПриАктивацииПервыйРазНаКлиенте(УникальныйИдентификаторЗаказаНаФорме);
КонецЕсли;
КонецПроцедуры
ПоказатьВ обработчик ожидания нельзя включать безконтекстные процедуры и функции ?
(9)
Вот такой пример отработал без проблем
&НаКлиентеНаСервереБезКонтекста
Процедура ЗаказыКлиентовПриАктивацииСтрокиНаКлиентеНаСервере(УникальныйИдентификаторЗаказаНаФорме)
ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме);
КонецПроцедуры
Процедура ЗаказыКлиентовПриАктивацииСтрокиНаКлиентеНаСервере(УникальныйИдентификаторЗаказаНаФорме)
ЗаказыКлиентовПриАктивизацииСтрокиНаСервере(УникальныйИдентификаторЗаказаНаФорме);
КонецПроцедуры
Вот такой пример отработал без проблем
&НаКлиенте
Процедура ДоплатыПриАктивизацииСтроки(Элемент)
ПодключитьОбработчикОжидания("МойОбработчик",1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура МойОбработчик()
ПоказатьУИД(" УИД = " +ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ПоказатьУИД(УникальныйИдентификатор)
сообщить(УникальныйИдентификатор);
КонецПроцедуры
Показать
Я согласен с высказанным мнением выше, что после активизации строки надо вызывать обработчик ожидания, чтобы из него вызывать процедуру запроса данных, поскольку пользователь может просто перейти на строку, а потом сразу же на другую строку, нем смысла на каждый клик вызывать запрос данных. Можно подождать пол-секунды, секунду, чтобы убедиться, что пользователь реально хочет видеть данные по выделенной строке. Ну и не мешает показать пользователю состояние процесса в форме, чтобы он понимал, что система не просто зависла, а делает обработку данных.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот