Здравствуйте

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

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

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

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

Проблема в другом: при выборе Номенклатуры в отобранном списке происходит выбор вида номенклатуры в таблице видов номенклатуры. Естественно, срабатывает событие ПриАктивизацииСтроки таблицы ВидыНоменклатуры и отбор уже по виду номенклатуры, который выделился. Как я понял, Вам надо, чтобы этого не происходило. Тогда надо отключить обработчик ПриАктивизацииСтроки таблицы Номенклатуры, либо как-то по-другому обработать это событие
---
Сообщение было скрыто модератором.
---
Посмотри стек вызова при втором вызове активации строки. Может дело и не в отборе.
---
увы дело точно в виде сравнения но не могу понять почему такое происходит.
при втором вызове в стеке пусто(при активации самое первое)
---
1. Серверный вызов потому что в ПриАктивацииСтроки.
2. Нафига вообще вам ВИерархии, если вы всю иерархию получаете запросом и пихаете ее в отбор?
Вы либо отбор делайте "в иерархии" для реквизита формы, либо "в списке" для переданного в параметрах списка.
---
можно поподробней ?
и почему в виде сравнения равно он не вызывается дважды
---
У вас код из шапки при активизации строки выполняется или при создании формы?
---
при активации строки
это типовой механизм в который я добавил условие. и он вызывается через цепочку событий. но самое первое при активации строки
---
Зачем? Если у вас отбор на реквизит формы завязан. У вас что, при активизации строки меняется реквизит "ВидНоменклатуры"?
---
так реализовано в типовом мехинизме. При изменении вида номенклатуры меняются отборы в динамическом списке и поэтому добавил свое изменение в момент заполнения этих самых отборов в компановке.
---
или хотя бы где можно об этом прочитать самому
---
Синтакс - помощник. ПриАктивизацииСтроки.

Синтаксис:

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

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

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
---
ну она как бы не сразу на сервер идет.
---
я попробую изменить свое решение.
но все же типовой механизм же как то работает и изменение вида сравнения как то вызывает двойное срабатывание.
---
То что не сразу, а через пару процедур - вообще не важно.
---
для проверки изменил решение и добавил код НаКлиенте
результат тот же

[1] отбор на вид номенклатуры (было равно)
---
Условие на ЭтоГруппа и все что внутри этого условия - выполнение запроса и отбор в иерархии это же вы добавили?
---
да. само условие и то что выполняется при значении "истина" это мое а то что в "иначе" это уже типовой код
---
если вместо иерархии проставить "равно" и присвоить конкретное значение а не массив как в фото то добавленный код отрабатывает корректно
---
То есть вы оставляете свой запрос, но вместо сравнения ВИерархии ставите Равно и все ок?
Или вы запрос тоже закомментировали когда проверяли?
---
да. только что проверил еще раз для того что бы не ошибиться
---
небольшое дополнение.
Проверил с сравнением "ВСписке"
Когда в ПравоеЗначение передается один элемент то все работает правильно а как только массив то отрабатывает двойное
---
Как вариант:
изменить запрос в дин. списке СписокНоменклатуры - непосредственно в запросе установить отбор типо "ВИерархии (&ВидНоменклатуры)"
А при активизации строки и при создании на сервере устанавливать значение параметра дин. списка.
---
в самом дин списке изменил запрос

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

Никак не могу найти параметр для заполнения
Подскажите пожалуйста где искать параметр который находится в {}
---
Не надо тут фигурных скобок.
Просто условие в стандартной секции ГДЕ.
---
что то я никак не могу найти. туплю..

изменил на

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

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

ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(СписокНоменклатура,"ВидНоменклатуры",ТекущиеДанные.ссылка,Истина); - изменил под себя.
---
Хз, может у вас запрос списке программно позднее переопределяется. Без базы не подскажу.
---
нашел. запрос все же формировался еще и в коде.
иии. та же херотень. ладн. на сегодня все.
Спасибо за активное участие. С наступающим новым годом!
---
С Новым Годом!
---
Вы изначально в дебри полезли... Никаких программных отборов и тому подобного не нужно. Этот запрос верный. Осталось только это:

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

Если вид номенклатуры выбираете из другого динамического списка, то у того может быть такой запрос:

```1c
    ВЫБРАТЬ
    Значение(Справочник.ВидыНоменклатуры.ПустаяСсылка) КАК ВидНоменклатуры
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ
    Ссылка ИЗ Справочник.ВидыНоменклатуры
```

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

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

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

Если же нужно, чтобы по умолчанию (при выборе первой (пустой) строки) показывался ВЕСЬ список, то меняем условие ГДЕ на такое:

```1c
    ГДЕ
    &ВидНоменклатуры=Значение(Справочник.ВидыНоменклатуры.ПустаяСсылка)
    ИЛИ СправочникНоменклатура.ВидНоменклатуры В ИЕРАРХИИ (&ВидНоменклатуры)
```

Если пустой вариант вообще не нужен, тогда можно сделать так (чтобы исключить ошибку):

```1c
    &НаКлиенте
    Процедура ВидыНоменклатурыПриАктивизацииСтроки(Элемент)
    ВидНоменклатуры=?(Элементы.ВидыНоменклатуры.ТекущиеДанные=Неопределено,
    Справочники.ВидыНоменклатуры.ПустаяСсылка(),
    Элементы.ВидыНоменклатуры.ТекущиеДанные.ВидНоменклатуры);
    СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("ВидНоменклатуры", ВидНоменклатуры);
    КонецПроцедуры
```
---
спасибо за ответ
но все же вы не ознакомились со всей веткой.
Вы в коде проставляете значение вида номенклатуры в параметр а в типомов механизме создается отбор и предложенный код :

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

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

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

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

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

Суть доработки в том что бы при выборе группы выводился весь список номенклатуры который относится к видам которые находятся в этой группе.
---
я б давно уже костыль вписал, если не хочется соблюдать рекомендации СП ))))
ввел бы реквизит формы "ИдентифиаторПредСтроки" и в ПриАктивизации вписал бы проверку что если строка не сменилась то и ничего делать не будем)) иначе запомним новый Идентификатор и выполним код))
---
такая проверка уже есть в типовом механизме. и суть в том что при повторной активации уже берется следующий(вложенный) элемент.
---
проблема еще актуальна. добавил небольшое вознаграждение.
---
Если я правильно понял задачу, то Вам не надо делать запрос. И не надо делать условия. Просто надо заменить условие отбора: вместо "ВидСравненияКомпоновкиДанных.Равно" напишите "ВидСравненияКомпоновкиДанных.ВИерархии". Если выбрать элемент, отберется вся номенклатура этого вида; если выбрать группу, отберется вся номенклатура видов в иерархии этой группы.

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

Спасибо
---
значит, вопрос решен?
Кстати, получилось без запроса и условия сделать? Если заменить условие отбора на ВидСравненияКомпоновкиДанных.ВИерархии, корректно работает?
Процедура УстановитьОтборПоВидуНоменклатуры(Форма) должна выглядеть так:

```1c
    Процедура УстановитьОтборПоВидуНоменклатуры(Форма)

    ВидНоменклатуры = Форма.ВидНоменклатуры;
    ЭлементыОтбора = ОбщегоНазначенияУТКлиентСервер.ПолучитьОтборДинамическогоСписка(Форма.СписокНоменклатура);

    // Установить отбор по виду номенклатуры.
    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
    ЭлементыОтбора,
    "ВидНоменклатуры",
    ВидНоменклатуры,
    ВидСравненияКомпоновкиДанных.ВИерархии, //было ВидСравненияКомпоновкиДанных.Равно
    "ОтборПоВидуНоменклатуры",
    Истина);
    КонецПроцедуры
```
---
да, сделал с минемальными корректировками.
Ваш вариант лучше чем мой . я добавил код изменения отбора уже после выполнения.
Кстати этот вариант я тоже чуть выше описывал но он был с ненужным условием на "этогруппа".
но в целом сейчас будет работать вообще любой вариант так как кусок кода который вызывал активацию изменен.