Зацыкливание процедуры "ПриАктивизацииСтроки"

1. Tym1980 22.04.19 13:33 Сейчас в теме
Есть Управляемая форма. На ней при открытии заполняется ТаблицаЗначений. В обработчике этой таблице "ПриАктивизацииСтроки" заполняется другая таблица значений по отбору строки первой таблицы значений.

&НаКлиенте
Процедура БАПриАктивизацииСтроки(Элемент)
	ТекДанные = Элемент.ТекущиеДанные.БА;
	ЗаполнитьНадои(ТекДанные);
КонецПроцедуры


Сейчас происходит зацыкливание, при открытии формы, срабатывает процедура "БАПриАктивизацииСтроки", которая запускает "ЗапонитьНадои", по завершении я попадаю снова в процедуру "БАПриАктивизацииСтроки" на первую строчку этой процедуры, и потом опять в "ЗапонитьНадои".

Как выйти из этой ситуации???
Найденные решения
5. dhurricane 22.04.19 14:39 Сейчас в теме
(3) Могу предложить 2 варианта:

1) Получить в процедуре с директивой "&НаСервереБезКонтекста" необходимую таблицу значений и вернуть ее на клиент в виде массив структур:
Результат = ОбщегоНазначения.ТаблицаЗначенийВМассив(Таблица);
А на основе уже полученных с сервера данных заполнить на клиенте нужную таблицу.

2) Заполнять таблицу формы с использованием контекстного вызова сервера, но не непосредственно при активизации строки, а с помощью обработчика ожидания (будет небольшая задержка):
&НаКлиенте
Процедура БАПриАктивизацииСтроки(Элемент)
    ПодключитьОбработчикОжидания("ЗаполнитьНадоиНаКлиенте", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьНадоиНаКлиенте()
    ТекДанные = Элементы.Список.ТекущиеДанные.БА;
    ЗаполнитьНадоиНаСервере(ТекДанные);
КонецПроцедуры
Показать
dammit666; akmich; VladC#; kpdozer; volconok27; triviumfan; +6 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dhurricane 22.04.19 13:45 Сейчас в теме
(1) Отказаться от контекстного обращения к серверу. Во выдержка из синтакс-помощника:
Описание:
Вызывается при активизации строки таблицы.
Примечание:
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
3. Tym1980 22.04.19 14:10 Сейчас в теме
(2)
А если я вторую таблицу значений заполняю с регистра, как мне в таком случае обойтись только клиентом, не используя сервер???
4. Boneman 298 22.04.19 14:24 Сейчас в теме
(3) &НаСервере отличается от &НаСервереБезКонтекста тем,
что тащит на сервер весь контекст формы, поэтому все эти события заново срабатывают.
А без контекста - в чистом виде, пошла на сервер - взяла там данные и вернула на клиента, никакого обновления контекста формы при этом не произойдет. Вот ей и надо пользоваться.
5. dhurricane 22.04.19 14:39 Сейчас в теме
(3) Могу предложить 2 варианта:

1) Получить в процедуре с директивой "&НаСервереБезКонтекста" необходимую таблицу значений и вернуть ее на клиент в виде массив структур:
Результат = ОбщегоНазначения.ТаблицаЗначенийВМассив(Таблица);
А на основе уже полученных с сервера данных заполнить на клиенте нужную таблицу.

2) Заполнять таблицу формы с использованием контекстного вызова сервера, но не непосредственно при активизации строки, а с помощью обработчика ожидания (будет небольшая задержка):
&НаКлиенте
Процедура БАПриАктивизацииСтроки(Элемент)
    ПодключитьОбработчикОжидания("ЗаполнитьНадоиНаКлиенте", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьНадоиНаКлиенте()
    ТекДанные = Элементы.Список.ТекущиеДанные.БА;
    ЗаполнитьНадоиНаСервере(ТекДанные);
КонецПроцедуры
Показать
dammit666; akmich; VladC#; kpdozer; volconok27; triviumfan; +6 Ответить
6. KindLion 08.07.20 16:20 Сейчас в теме
(5)Спасибо огромное!
Очень долго мучился с двойным срабатыванием обработчика ПриАктивизацииСтроки.
Подключил обработчик ожидания - и все - как рукой сняло!
8. SlavaKron 09.12.21 20:37 Сейчас в теме
(7) Обычно для таких целей используют клиентскую переменную модуля формы вместо реквизита формы, что-то вроде "ПредыдущееЗначениеЧегоТоТам".
(5) Есть еще 3-й вариант: кешировать данные на клиенте.
9. dhurricane 10.12.21 12:25 Сейчас в теме
(8)
Есть еще 3-й вариант
И 4-ый: использовать для таблицы колонку типа "ТаблицаЗначений" и выводить таблицу текущей строки. :-)
10. Alexandr73Rus 27.01.23 14:21 Сейчас в теме
(1)
Есть еще вариант. В начале процедуры ПриАктивизацииСтроки установить проверку на текущий элемент формы. Если в момент срабатывания ПриАктивизацииСтроки текущий элемент формы не тот, который нужен, то выходим из процедуры

&НаКлиенте
Процедура ИмяРеквизитаПриАктивизацииСтроки(Элемент) 
	
	Если ЭтаФорма.ТекущийЭлемент.Имя <> "ИмяРеквизита" Тогда 
		Возврат;
	КонецЕсли;	

КонецПроцедуры 
11. user1863362 27.01.23 14:43 Сейчас в теме
(10) Два года. Два долгих года ждали мы Спасителя. И вот пришел Он и принес нам... туфту какую-то.

Почему текущий элемент должен сменится между двумя активизациями?
7. dadel 19 09.12.21 20:22 Сейчас в теме
Немного задумался, тоже попал в такой автозапуск бесконечный.
В динамическом списке по выделенной строке собираю таблицу на форме и вывожу. Таблицы совершенно разные, в зависимости от выделенной строки могут выводиться совершенно разные таблицы и рисовать только программно. В итоге и обработчик ожидания не помог тоже.
В итоге скостылил новый реквизит формы с типом Дкумент.РегламентированныйОтчет и ещё там варианты есть, составной. При создании формы он не заполнен. При первом событии АктивизацииСтроки проверяю этот реквизит на равенство соответствующего реквизита в строке, если не равны, то выполняю заполнение\рисование таблицы на форме и заполняю этот реквизит текущим документом.
По окончании рисования снова отрабатывает событие ПриАктивизацииСтроки и снова проверяю реквизит на равенство с соответствующим реквизитом строки и если равны, то прерываю цепочку на этом месте.
Cyberhawk; freeek; +2 Ответить
12. user1527961 10.11.23 06:36 Сейчас в теме
(5)
Я столкнулся с этой проблемой, вызывая серверную функцию, которая делает НайтиСтроки() по другой ТЧ того же Объекта. Есть предположение, что зацикливание ПриАктивизации - не является зацикливанием: в процессе вызова сервера, текущая ТЧ - теряет фокус, а после вызова - получает его обратно, вот тут и случается следующий вызов ПриАктивизации - по факту получения фокуса.

Асинхронный вызов - не помогает, хотя, по логике - должен бы.

Помогла - ОбработкаОповещения. По сути, то же самое, что и через ОписаниеОповещения. Только, ОписаниеОповещения - предполагает что-то интерактивное - открыть форму, задать вопрос, показать диалог. А через ОбработкаОповещения - управление в другую процедуру передаётся сразу. Минус только один - выдаём лишние оповещения "в эфир", а ведь их обрабатывают все формы, у которых есть ОбработкаОповещения(). И наша форма - ловит все оповещения.

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

	// "Слушаем эфир"

	Если НЕ Источник = ЭтаФорма Тогда // сюда падают все оповещения - кто бы их ни сказал (в пределах видимости), а нам нужно только своё
		Возврат;
	КонецЕсли;
	
	ЕстьОшибки = НекийСерверныйВызов(Параметр.ИдентификаторСтроки);
	
	// ... что-то там дальше

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

&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
	// ...
	ПараметрОповещения = Новый Структура("ИдентификаторСтроки, ТанцуютВсе", ИдентификаторСтроки, Истина);
	Оповестить("НаименованиеСобытия", ПараметрОповещения, ЭтаФорма); // Вышли "в эфир"
КонецПроцедуры
Показать
13. user1527961 10.11.23 07:41 Сейчас в теме
(12)
Не... ошибка, второе предложение, которое "проще" - не работает.
14. Sashares 34 10.11.23 09:32 Сейчас в теме
(13)
которое "проще" - не работает.

Вероятно, вы что-то делаете не так. У всех работает.
Оставьте свое сообщение

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