Двойное срабатывание события при активации строки

1. user822247 31.12.19 08:26 Сейчас в теме
Здравствуйте

Отрабатывает дважды событие при активации строки при проставлении отбора в компоновщик настроек.

В типовом механизме проставляется отбор с "ВидСравненияКомпоновкиДанных.Равно" я добавляю условие на то что если в выбранной строке находится группа то выполняется сравнение "ВидСравненияКомпоновкиДанных.ВИерархии" и это вызывает двойное отрабатывание события.

Проблема двойного срабатывания в том что при повторном обходе берется элемент вложенный в группу что как бы возвращает к условию "равно"
Проблема точно находится именно в этом сравнении. Если изменить на "ровно" то все отрабатывает корректно

Подскажите пожалуйста что я делаю не так?
Прикрепленные файлы:
Вознаграждение за ответ
Показать полностью
Найденные решения
35. YuriyBak 03.01.20 14:35 Сейчас в теме
Если я правильно понял задачу, то Вам не надо делать запрос. И не надо делать условия. Просто надо заменить условие отбора: вместо "ВидСравненияКомпоновкиДанных.Равно" напишите "ВидСравненияКомпоновкиДанных.ВИерархии". Если выбрать элемент, отберется вся номенклатура этого вида; если выбрать группу, отберется вся номенклатура видов в иерархии этой группы.

Проблема в другом: при выборе Номенклатуры в отобранном списке происходит выбор вида номенклатуры в таблице видов номенклатуры. Естественно, срабатывает событие ПриАктивизацииСтроки таблицы ВидыНоменклатуры и отбор уже по виду номенклатуры, который выделился. Как я понял, Вам надо, чтобы этого не происходило. Тогда надо отключить обработчик ПриАктивизацииСтроки таблицы Номенклатуры, либо как-то по-другому обработать это событие
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. пользователь 31.12.19 10:12
Сообщение было скрыто модератором.
...
3. triviumfan 93 31.12.19 10:15 Сейчас в теме
Посмотри стек вызова при втором вызове активации строки. Может дело и не в отборе.
4. user822247 31.12.19 10:29 Сейчас в теме
(3) увы дело точно в виде сравнения но не могу понять почему такое происходит.
при втором вызове в стеке пусто(при активации самое первое)
5. Sashares 34 31.12.19 10:31 Сейчас в теме
1. Серверный вызов потому что в ПриАктивацииСтроки.
2. Нафига вообще вам ВИерархии, если вы всю иерархию получаете запросом и пихаете ее в отбор?
Вы либо отбор делайте "в иерархии" для реквизита формы, либо "в списке" для переданного в параметрах списка.
6. user822247 31.12.19 10:33 Сейчас в теме
(5) можно поподробней ?
и почему в виде сравнения равно он не вызывается дважды
7. Sashares 34 31.12.19 10:35 Сейчас в теме
(6)У вас код из шапки при активизации строки выполняется или при создании формы?
9. user822247 31.12.19 10:36 Сейчас в теме
(7) при активации строки
это типовой механизм в который я добавил условие. и он вызывается через цепочку событий. но самое первое при активации строки
10. Sashares 34 31.12.19 10:38 Сейчас в теме
(9)Зачем? Если у вас отбор на реквизит формы завязан. У вас что, при активизации строки меняется реквизит "ВидНоменклатуры"?
11. user822247 31.12.19 10:41 Сейчас в теме
(10) так реализовано в типовом мехинизме. При изменении вида номенклатуры меняются отборы в динамическом списке и поэтому добавил свое изменение в момент заполнения этих самых отборов в компановке.
8. user822247 31.12.19 10:35 Сейчас в теме
(5)или хотя бы где можно об этом прочитать самому
12. Sashares 34 31.12.19 10:43 Сейчас в теме
(8)Синтакс - помощник. ПриАктивизацииСтроки.

Синтаксис:

ПриАктивизацииСтроки()
Описание:

Вызывается при активизации строки таблицы.
Примечание:

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
Ctrl P; SergioBellagio; +2 Ответить
13. user822247 31.12.19 10:45 Сейчас в теме
(12) ну она как бы не сразу на сервер идет.
Прикрепленные файлы:
14. user822247 31.12.19 10:46 Сейчас в теме
(12) я попробую изменить свое решение.
но все же типовой механизм же как то работает и изменение вида сравнения как то вызывает двойное срабатывание.
15. Sashares 34 31.12.19 10:52 Сейчас в теме
(14)То что не сразу, а через пару процедур - вообще не важно.
21. user822247 31.12.19 14:21 Сейчас в теме
(15)для проверки изменил решение и добавил код НаКлиенте
результат тот же

[1] отбор на вид номенклатуры (было равно)
Прикрепленные файлы:
16. Sashares 34 31.12.19 10:53 Сейчас в теме
(14)Условие на ЭтоГруппа и все что внутри этого условия - выполнение запроса и отбор в иерархии это же вы добавили?
17. user822247 31.12.19 11:42 Сейчас в теме
(16)да. само условие и то что выполняется при значении "истина" это мое а то что в "иначе" это уже типовой код
18. user822247 31.12.19 11:44 Сейчас в теме
(17) если вместо иерархии проставить "равно" и присвоить конкретное значение а не массив как в фото то добавленный код отрабатывает корректно
22. Sashares 34 31.12.19 14:26 Сейчас в теме
(18)То есть вы оставляете свой запрос, но вместо сравнения ВИерархии ставите Равно и все ок?
Или вы запрос тоже закомментировали когда проверяли?
23. user822247 31.12.19 14:31 Сейчас в теме
(22)да. только что проверил еще раз для того что бы не ошибиться
Прикрепленные файлы:
24. user822247 31.12.19 14:36 Сейчас в теме
(22)небольшое дополнение.
Проверил с сравнением "ВСписке"
Когда в ПравоеЗначение передается один элемент то все работает правильно а как только массив то отрабатывает двойное
25. Sashares 34 31.12.19 15:13 Сейчас в теме
(24)Как вариант:
изменить запрос в дин. списке СписокНоменклатуры - непосредственно в запросе установить отбор типо "ВИерархии (&ВидНоменклатуры)"
А при активизации строки и при создании на сервере устанавливать значение параметра дин. списка.
26. user822247 31.12.19 16:19 Сейчас в теме
(25) в самом дин списке изменил запрос

ВЫБРАТЬ
	0 КАК ИндексКартинки,
	СправочникНоменклатура.ПометкаУдаления КАК ПометкаУдаления,
	СправочникНоменклатура.Ссылка КАК Ссылка,
	СправочникНоменклатура.Ссылка КАК Номенклатура,
	СправочникНоменклатура.Артикул КАК Артикул,
	СправочникНоменклатура.Код КАК Код,
	СправочникНоменклатура.Наименование КАК Наименование,
	СправочникНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
	СправочникНоменклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	СправочникНоменклатура.ИспользованиеХарактеристик КАК ИспользованиеХарактеристик,
	СправочникНоменклатура.ЭтоГруппа КАК ЭтоГруппа,
	СправочникНоменклатура.Родитель КАК Родитель,
	ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка) КАК Валюта,
	0 КАК Цена,
	0 КАК МаксимальнаяЦенаХарактеристики,
	ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) КАК Упаковка,
	СправочникНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	0 КАК ВНаличииОстаток,
	0 КАК Доступно,
	ЛОЖЬ КАК ХарактеристикиИспользуются,
	ЛОЖЬ КАК ЭтоТовар,
	ЛОЖЬ КАК ЭтоУслуга,
	НЕОПРЕДЕЛЕНО КАК ВладелецХарактеристик,
	СправочникНоменклатура.Качество КАК Качество
ИЗ
	Справочник.Номенклатура КАК СправочникНоменклатура
{ГДЕ
	(СправочникНоменклатура.ВидНоменклатуры В ИЕРАРХИИ (&Родитель)) КАК Родитель}
Показать


Никак не могу найти параметр для заполнения
Подскажите пожалуйста где искать параметр который находится в {}
27. Sashares 34 31.12.19 16:22 Сейчас в теме
(26)Не надо тут фигурных скобок.
Просто условие в стандартной секции ГДЕ.
28. user822247 31.12.19 16:37 Сейчас в теме
(27) что то я никак не могу найти. туплю..

изменил на

ЛОЖЬ КАК ЭтоУслуга,
	НЕОПРЕДЕЛЕНО КАК ВладелецХарактеристик,
	СправочникНоменклатура.Качество КАК Качество
ИЗ
	Справочник.Номенклатура КАК СправочникНоменклатура
ГДЕ
	СправочникНоменклатура.ВидНоменклатуры В ИЕРАРХИИ (&ВидНоменклатуры)
29. Sashares 34 31.12.19 16:48 Сейчас в теме
(28)все верно.
Теперь этот параметр надо у ДС установить.
При создании на сервере установите параметр как пустая ссылка или Неопределено.
При активизации строки видов номенклатуры - устанавливайте нужное значение.

ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(СписокНоменклатуры,"ВидНоменклатуры",ЗначениеПараметра,Истина);
30. user822247 31.12.19 16:57 Сейчас в теме
(29)ЗначениеПараметраКомпоновкиДанных = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра)); - не находит . наименование точное .


ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(СписокНоменклатура,"ВидНоменклатуры",ТекущиеДанные.ссылка,Истина); - изменил под себя.
31. Sashares 34 31.12.19 17:05 Сейчас в теме
(30)Хз, может у вас запрос списке программно позднее переопределяется. Без базы не подскажу.
32. user822247 31.12.19 19:34 Сейчас в теме
(31) нашел. запрос все же формировался еще и в коде.
иии. та же херотень. ладн. на сегодня все.
Спасибо за активное участие. С наступающим новым годом!
33. Sashares 34 31.12.19 21:23 Сейчас в теме
36. GetNight 46 04.01.20 05:51 Сейчас в теме
(28)
Вы изначально в дебри полезли... Никаких программных отборов и тому подобного не нужно. Этот запрос верный. Осталось только это:

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


Если вид номенклатуры выбираете из другого динамического списка, то у того может быть такой запрос:
ВЫБРАТЬ
	Значение(Справочник.ВидыНоменклатуры.ПустаяСсылка) КАК ВидНоменклатуры
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	Ссылка ИЗ Справочник.ВидыНоменклатуры

Обратите внимание, что я использую не безликое "Ссылка" а сразу даю внятное название полю "ВидНоменклатуры" ;)

Вверху рядом с закладкой "Запрос" есть закладка "Настройки" и там в подзакладке "Порядок" указываете "ВидНоменклатуры.Наименование" = "По возрастанию"

Тогда при открытии формы курсор автоматом станет на первую строку, где вид номенклатуры не задан и вторая таблица будет пустой.
При выборе какого-нибудь элемента в первой - будет меняться вторая.

Если же нужно, чтобы по умолчанию (при выборе первой (пустой) строки) показывался ВЕСЬ список, то меняем условие ГДЕ на такое:
ГДЕ
	&ВидНоменклатуры=Значение(Справочник.ВидыНоменклатуры.ПустаяСсылка)
	ИЛИ СправочникНоменклатура.ВидНоменклатуры В ИЕРАРХИИ (&ВидНоменклатуры)


Если пустой вариант вообще не нужен, тогда можно сделать так (чтобы исключить ошибку):
&НаКлиенте
Процедура ВидыНоменклатурыПриАктивизацииСтроки(Элемент)
	ВидНоменклатуры=?(Элементы.ВидыНоменклатуры.ТекущиеДанные=Неопределено,
					Справочники.ВидыНоменклатуры.ПустаяСсылка(),
					Элементы.ВидыНоменклатуры.ТекущиеДанные.ВидНоменклатуры);
	СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("ВидНоменклатуры", ВидНоменклатуры);
КонецПроцедуры
37. user822247 04.01.20 13:14 Сейчас в теме
(36) спасибо за ответ
но все же вы не ознакомились со всей веткой.
Вы в коде проставляете значение вида номенклатуры в параметр а в типомов механизме создается отбор и предложенный код :
 СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("ВидНоменклатуры", Элементы.ВидыНоменклатуры.ТекущиеДанные.ВидНоменклатуры);

нужно заменить на тот что указан в фото на ответе "21".

Процедура при активации строки имеет типовой функционал который я не хотел бы заменять целиком и поэтому добовлял свои корректировки уже после ее выполнения.

двойная активации происходит при абсолютно любом раскладе. Проставлял условия в отборах, параметрах, менял запрос , делал через расширения и прочие костыли но проблема возникала в любом случае если передавать несколько значений в сравнение.

Возможно я не могу корректно донести суть проблемы поэтому если у вас есть шаблон утшки на уф то вы могли бы сами увидеть суть проблемы.
В конфигураторе - Обработки - "ПодборТоваровВДокументЗакупки" - "Форма" - Модуль формы - "Процедура ВидыНоменклатурыПриАктивизацииСтроки(Элемент)".

Суть доработки в том что бы при выборе группы выводился весь список номенклатуры который относится к видам которые находятся в этой группе.
Прикрепленные файлы:
19. DanDy 52 31.12.19 12:26 Сейчас в теме
я б давно уже костыль вписал, если не хочется соблюдать рекомендации СП ))))
ввел бы реквизит формы "ИдентифиаторПредСтроки" и в ПриАктивизации вписал бы проверку что если строка не сменилась то и ничего делать не будем)) иначе запомним новый Идентификатор и выполним код))
20. user822247 31.12.19 13:05 Сейчас в теме
(19) такая проверка уже есть в типовом механизме. и суть в том что при повторной активации уже берется следующий(вложенный) элемент.
34. user822247 02.01.20 10:59 Сейчас в теме
проблема еще актуальна. добавил небольшое вознаграждение.
35. YuriyBak 03.01.20 14:35 Сейчас в теме
Если я правильно понял задачу, то Вам не надо делать запрос. И не надо делать условия. Просто надо заменить условие отбора: вместо "ВидСравненияКомпоновкиДанных.Равно" напишите "ВидСравненияКомпоновкиДанных.ВИерархии". Если выбрать элемент, отберется вся номенклатура этого вида; если выбрать группу, отберется вся номенклатура видов в иерархии этой группы.

Проблема в другом: при выборе Номенклатуры в отобранном списке происходит выбор вида номенклатуры в таблице видов номенклатуры. Естественно, срабатывает событие ПриАктивизацииСтроки таблицы ВидыНоменклатуры и отбор уже по виду номенклатуры, который выделился. Как я понял, Вам надо, чтобы этого не происходило. Тогда надо отключить обработчик ПриАктивизацииСтроки таблицы Номенклатуры, либо как-то по-другому обработать это событие
38. user822247 05.01.20 10:49 Сейчас в теме
(35) блин. не сразу заметил ваш ответ.
да, все верно. нашел событие при активации строки у ДС номенклатуры и внутри события был код который менять вид номенклатуры на тот что указан в Текущей строке ДС номенклатуры.

Спасибо
39. YuriyBak 06.01.20 10:21 Сейчас в теме +2 $m
(38) значит, вопрос решен?
Кстати, получилось без запроса и условия сделать? Если заменить условие отбора на ВидСравненияКомпоновкиДанных.ВИерархии, корректно работает?
Процедура УстановитьОтборПоВидуНоменклатуры(Форма) должна выглядеть так:

Процедура УстановитьОтборПоВидуНоменклатуры(Форма)
	
	ВидНоменклатуры = Форма.ВидНоменклатуры;
	ЭлементыОтбора = ОбщегоНазначенияУТКлиентСервер.ПолучитьОтборДинамическогоСписка(Форма.СписокНоменклатура);
	
	// Установить отбор по виду номенклатуры.
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
		ЭлементыОтбора,
		"ВидНоменклатуры",
		ВидНоменклатуры,
		ВидСравненияКомпоновкиДанных.ВИерархии, //было ВидСравненияКомпоновкиДанных.Равно
		"ОтборПоВидуНоменклатуры",
		Истина);
КонецПроцедуры
Показать
GeterX; Matveev_VS; +2 Ответить
40. user822247 06.01.20 11:26 Сейчас в теме
(39) да, сделал с минемальными корректировками.
Ваш вариант лучше чем мой . я добавил код изменения отбора уже после выполнения.
Кстати этот вариант я тоже чуть выше описывал но он был с ненужным условием на "этогруппа".
но в целом сейчас будет работать вообще любой вариант так как кусок кода который вызывал активацию изменен.
Оставьте свое сообщение

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