Зацыкливание процедуры "ПриАктивизацииСтроки"
Есть Управляемая форма. На ней при открытии заполняется ТаблицаЗначений. В обработчике этой таблице "ПриАктивизацииСтроки" заполняется другая таблица значений по отбору строки первой таблицы значений.
Сейчас происходит зацыкливание, при открытии формы, срабатывает процедура "БАПриАктивизацииСтроки", которая запускает "ЗапонитьНадои", по завершении я попадаю снова в процедуру "БАПриАктивизацииСтроки" на первую строчку этой процедуры, и потом опять в "ЗапонитьНадои".
Как выйти из этой ситуации???
&НаКлиенте
Процедура БАПриАктивизацииСтроки(Элемент)
ТекДанные = Элемент.ТекущиеДанные.БА;
ЗаполнитьНадои(ТекДанные);
КонецПроцедуры
Сейчас происходит зацыкливание, при открытии формы, срабатывает процедура "БАПриАктивизацииСтроки", которая запускает "ЗапонитьНадои", по завершении я попадаю снова в процедуру "БАПриАктивизацииСтроки" на первую строчку этой процедуры, и потом опять в "ЗапонитьНадои".
Как выйти из этой ситуации???
Найденные решения
(3) Могу предложить 2 варианта:
1) Получить в процедуре с директивой "&НаСервереБезКонтекста" необходимую таблицу значений и вернуть ее на клиент в виде массив структур:
А на основе уже полученных с сервера данных заполнить на клиенте нужную таблицу.
2) Заполнять таблицу формы с использованием контекстного вызова сервера, но не непосредственно при активизации строки, а с помощью обработчика ожидания (будет небольшая задержка):
1) Получить в процедуре с директивой "&НаСервереБезКонтекста" необходимую таблицу значений и вернуть ее на клиент в виде массив структур:
Результат = ОбщегоНазначения.ТаблицаЗначенийВМассив(Таблица);
2) Заполнять таблицу формы с использованием контекстного вызова сервера, но не непосредственно при активизации строки, а с помощью обработчика ожидания (будет небольшая задержка):
&НаКлиенте
Процедура БАПриАктивизацииСтроки(Элемент)
ПодключитьОбработчикОжидания("ЗаполнитьНадоиНаКлиенте", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьНадоиНаКлиенте()
ТекДанные = Элементы.Список.ТекущиеДанные.БА;
ЗаполнитьНадоиНаСервере(ТекДанные);
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) &НаСервере отличается от &НаСервереБезКонтекста тем,
что тащит на сервер весь контекст формы, поэтому все эти события заново срабатывают.
А без контекста - в чистом виде, пошла на сервер - взяла там данные и вернула на клиента, никакого обновления контекста формы при этом не произойдет. Вот ей и надо пользоваться.
что тащит на сервер весь контекст формы, поэтому все эти события заново срабатывают.
А без контекста - в чистом виде, пошла на сервер - взяла там данные и вернула на клиента, никакого обновления контекста формы при этом не произойдет. Вот ей и надо пользоваться.
(3) Могу предложить 2 варианта:
1) Получить в процедуре с директивой "&НаСервереБезКонтекста" необходимую таблицу значений и вернуть ее на клиент в виде массив структур:
А на основе уже полученных с сервера данных заполнить на клиенте нужную таблицу.
2) Заполнять таблицу формы с использованием контекстного вызова сервера, но не непосредственно при активизации строки, а с помощью обработчика ожидания (будет небольшая задержка):
1) Получить в процедуре с директивой "&НаСервереБезКонтекста" необходимую таблицу значений и вернуть ее на клиент в виде массив структур:
Результат = ОбщегоНазначения.ТаблицаЗначенийВМассив(Таблица);
2) Заполнять таблицу формы с использованием контекстного вызова сервера, но не непосредственно при активизации строки, а с помощью обработчика ожидания (будет небольшая задержка):
&НаКлиенте
Процедура БАПриАктивизацииСтроки(Элемент)
ПодключитьОбработчикОжидания("ЗаполнитьНадоиНаКлиенте", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьНадоиНаКлиенте()
ТекДанные = Элементы.Список.ТекущиеДанные.БА;
ЗаполнитьНадоиНаСервере(ТекДанные);
КонецПроцедуры
Показать
(1)
Есть еще вариант. В начале процедуры ПриАктивизацииСтроки установить проверку на текущий элемент формы. Если в момент срабатывания ПриАктивизацииСтроки текущий элемент формы не тот, который нужен, то выходим из процедуры
Есть еще вариант. В начале процедуры ПриАктивизацииСтроки установить проверку на текущий элемент формы. Если в момент срабатывания ПриАктивизацииСтроки текущий элемент формы не тот, который нужен, то выходим из процедуры
&НаКлиенте
Процедура ИмяРеквизитаПриАктивизацииСтроки(Элемент)
Если ЭтаФорма.ТекущийЭлемент.Имя <> "ИмяРеквизита" Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
Немного задумался, тоже попал в такой автозапуск бесконечный.
В динамическом списке по выделенной строке собираю таблицу на форме и вывожу. Таблицы совершенно разные, в зависимости от выделенной строки могут выводиться совершенно разные таблицы и рисовать только программно. В итоге и обработчик ожидания не помог тоже.
В итоге скостылил новый реквизит формы с типом Дкумент.РегламентированныйОтчет и ещё там варианты есть, составной. При создании формы он не заполнен. При первом событии АктивизацииСтроки проверяю этот реквизит на равенство соответствующего реквизита в строке, если не равны, то выполняю заполнение\рисование таблицы на форме и заполняю этот реквизит текущим документом.
По окончании рисования снова отрабатывает событие ПриАктивизацииСтроки и снова проверяю реквизит на равенство с соответствующим реквизитом строки и если равны, то прерываю цепочку на этом месте.
В динамическом списке по выделенной строке собираю таблицу на форме и вывожу. Таблицы совершенно разные, в зависимости от выделенной строки могут выводиться совершенно разные таблицы и рисовать только программно. В итоге и обработчик ожидания не помог тоже.
В итоге скостылил новый реквизит формы с типом Дкумент.РегламентированныйОтчет и ещё там варианты есть, составной. При создании формы он не заполнен. При первом событии АктивизацииСтроки проверяю этот реквизит на равенство соответствующего реквизита в строке, если не равны, то выполняю заполнение\рисование таблицы на форме и заполняю этот реквизит текущим документом.
По окончании рисования снова отрабатывает событие ПриАктивизацииСтроки и снова проверяю реквизит на равенство с соответствующим реквизитом строки и если равны, то прерываю цепочку на этом месте.
(5)
Я столкнулся с этой проблемой, вызывая серверную функцию, которая делает НайтиСтроки() по другой ТЧ того же Объекта. Есть предположение, что зацикливание ПриАктивизации - не является зацикливанием: в процессе вызова сервера, текущая ТЧ - теряет фокус, а после вызова - получает его обратно, вот тут и случается следующий вызов ПриАктивизации - по факту получения фокуса.
Асинхронный вызов - не помогает, хотя, по логике - должен бы.
Помогла - ОбработкаОповещения. По сути, то же самое, что и через ОписаниеОповещения. Только, ОписаниеОповещения - предполагает что-то интерактивное - открыть форму, задать вопрос, показать диалог. А через ОбработкаОповещения - управление в другую процедуру передаётся сразу. Минус только один - выдаём лишние оповещения "в эфир", а ведь их обрабатывают все формы, у которых есть ОбработкаОповещения(). И наша форма - ловит все оповещения.
Я столкнулся с этой проблемой, вызывая серверную функцию, которая делает НайтиСтроки() по другой ТЧ того же Объекта. Есть предположение, что зацикливание ПриАктивизации - не является зацикливанием: в процессе вызова сервера, текущая ТЧ - теряет фокус, а после вызова - получает его обратно, вот тут и случается следующий вызов ПриАктивизации - по факту получения фокуса.
Асинхронный вызов - не помогает, хотя, по логике - должен бы.
Помогла - ОбработкаОповещения. По сути, то же самое, что и через ОписаниеОповещения. Только, ОписаниеОповещения - предполагает что-то интерактивное - открыть форму, задать вопрос, показать диалог. А через ОбработкаОповещения - управление в другую процедуру передаётся сразу. Минус только один - выдаём лишние оповещения "в эфир", а ведь их обрабатывают все формы, у которых есть ОбработкаОповещения(). И наша форма - ловит все оповещения.
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// "Слушаем эфир"
Если НЕ Источник = ЭтаФорма Тогда // сюда падают все оповещения - кто бы их ни сказал (в пределах видимости), а нам нужно только своё
Возврат;
КонецЕсли;
ЕстьОшибки = НекийСерверныйВызов(Параметр.ИдентификаторСтроки);
// ... что-то там дальше
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
// ...
ПараметрОповещения = Новый Структура("ИдентификаторСтроки, ТанцуютВсе", ИдентификаторСтроки, Истина);
Оповестить("НаименованиеСобытия", ПараметрОповещения, ЭтаФорма); // Вышли "в эфир"
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот