Имя: Пароль:
1C
1С v8
Как различить события ПриАктивизацииСтроки в списке?
0 DJ Anthon
 
07.07.21
03:41
Оно вызывается и при тыканьи мышкой, и при установке ТекущаяСтрока. Мне надо, чтобы при установке ТекущаяСтрока оно не вызывалось.
Дело в том, что на форме много списков и они вызывают друг у друга установку текущих строк, поэтому простыми заглушками не отделаешься.
Есть какой-нибудь способ отличить интерактивную смену строки от программной?
1 Chameleon1980
 
07.07.21
06:18
перед программной активацией устанавливай свой флаг (реквизит формы)
в процедуре активации проверяй и снимай
2 Ненавижу 1С
 
гуру
07.07.21
07:30
+(1) совсем уже думать не хотят
3 Ёпрст
 
07.07.21
10:24
(0) самый православный способ ухода от зацикливания такой:


&НаКлиенте
Процедура ХреньПриАктивизацииСтроки(Элемент)
    Если ТекущийЭлемент = Элемент Тогда  //идея  ясна ? обрабатываем, только если мышой тыркнули в активный элемент, всякие программные активизации идут лесом
        ПодключитьОбработчикОжидания("Подключаемый_ХреньПриАктивизацииСтроки", 0.1, Истина);
    Конецесли;
КонецПроцедуры
4 acht
 
07.07.21
10:49
(0) Нефиг использовать контекстные серверные вызовы там, где их прямо запрешено использовать.
5 DJ Anthon
 
07.07.21
11:08
(3) я так и делал
(4) да, я в курсе, но у меня все серверные вызовы были вынесены, как в (3)
Но вот что удалось выяснить.
    Элементы.ИнформационнаяПанельНаименованиеТовара.Заголовок = Элементы.СписокСтандартныйПоискНоменклатура.ТекущаяСтрока;
Как оказалось, этот код - тоже серверный вызов.
То есть я меняю заголовок кнопки/поля на форме, не обращаясь к реквизитам ссылки, а даже просто ссылка, как она есть - тоже серверный вызов.
Именно он мне пудрил мозги, а найти было его сложно.
Я его перенес в серверную часть и всё заработало.
Правда, флаги всё равно пришлось сделать через структуру.
Основная методика получилась такой:

реквизит формы Стопы типа Произвольный
при открытии присваиваем ему тип Структура.

на форме

&НаКлиенте
Процедура А_СписокСтандартныйПоискНоменклатураПриАктивизацииСтрокиПосле(Элемент)
    Если Стопы.Свойство("СписокСтандартныйПоискНоменклатура") Тогда
        Стопы.Удалить("СписокСтандартныйПоискНоменклатура");
        Возврат;
    КонецЕсли;
....
КонецПроцедуры


Как использовать:
...
            Стопы.Вставить("СписокСтандартныйПоискНоменклатура", Истина);
            Элементы.СписокСтандартныйПоискНоменклатура.ТекущаяСтрока = ТекущиеДанные.Номенклатура;
            Стопы.Удалить("СписокСтандартныйПоискНоменклатура");//иногда надо, иногда нет
...


Это в упрощенном виде.

Проблема была в том, что я не мог найти, от чего запускались все события активации, хотя серверных вызовов не видно. Опытным путем перебрать тысячу строк кода тоже не хотелось, но все равно пришлось это сделать и вроде всё решилось. Просто я копировал стандартный функционал из трех типовых в одну, а там у них черт ногу сломит.
6 acht
 
07.07.21
11:24
(5) > Опытным путем перебрать тысячу строк кода
https://ibb.co/ZmdPZhn

Ваш К.О.
7 DJ Anthon
 
07.07.21
12:38
(6) я думал, что серверные вызовы - это вызовы процедур с пометкой &НаСервере. Знать бы что искать...
8 Вафель
 
07.07.21
13:04
(5) конечно серверный.
текущая строка - ссылка.
заголовок - строка.
У тебя неявное представление ссылки получается
Основная теорема систематики: Новые системы плодят новые проблемы.