ПриАктивацииСтроки() в Динамическом списке. Проблемы.
Часто на форме приходится интерактивно связывать 2 табличных поля. При изменении данных в 1-ом поле, автоматически обновлять данные во втором. С аналогичной задачей я столкнулся когда реализовывал подбор на РМК. При выборе строки в таблице остатков товаров, нужно было отобразить остатки в остальных магазинах сети в отдельной таблице. Вроде как делов на раз два, да не тут то было.
Наблюдается очень неприятная особенность платформы — событие ПриАктивизацииСтроки() не вызывается, при поиске в Динамическом списке. То есть при осуществлении поиска, текущая строка меняется программно самой платформой, а события ПриАктивизацииСтроки() не возникает. Соответственно данные во второй таблице не обновляются.
Решение было найдена не без помощи добрых людей. Помогли на инфостарте.
Итак первым делом нужно на форме, завести реквизит ТекСтрока с типом строка.
Далее при открытии подбора, в момент первичной реализации события ПриАктивизацииСтроки(), мы сохраняем текущую активированную строку в наш созданный реквизит ТекСтрока. Делается это для того, чтоб потом мы могли сравнить изменилась ли фактическая текущая строка с течением времени.
Определяем процедуру которую будем вызывать через обработчик ожидания. У меня процедура будет следующая.
Ну и дальше в событии формы ПриОткрытии() и инициализируем обработчик ожидания ПодключитьОбработчикОжидания. Отметим, что интервал ожидания события, нужно выставить более 1 секунды, чтоб мы могли ожидать событие многократно. Если интервал будет меньше 1, то событие выполнится однократно.
На этом собственно все. При обновлении текущей строки динамического списка и соответственно при смене текущей строки, будет вызываться наша процедура обновления 2-ой таблицы.
Источник
Не срабатывает процедура при активизации строки
В процедуре задан обработчик. Запускаю предприятие. Ставлю точку
останова. Первый раз запускается. Потом ставлю курсор на разные
строки, ПриАктивизацииСтроки уже не запускается.
она же всегда должна запускаться при смене, выборе других строк?
&НаКлиенте
Процедура ПользователиСписокПриАктивизацииСтроки(Элемент)
(4) Ну то есть по идее этой процедуры должно хватать?
&НаКлиенте
Процедура ПользователиСписокПриАктивизацииСтроки(Элемент)
(5)
Должно хватать.
&НаКлиенте
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
(6) Да с этим вроде разобрался.
Сейчас такой вопрос. На форме 2 списка.
Я заполняю поля на форме по данным из выбранной строки
из второго списка.
А данные во втором списке меняются в зависимости от выбранной строки в первом списке. И что то я это вот не
могу отловить.
В какой процедуре первого списка, мне отлавливать первую строку во втором динамическом списке? То есть Я не могу увидеть данные во втором динамическом списке. Где их получать на сервер передавать эту таблицу?
(8) я увидел что в процедуре
Можно отлавливать появляющиеся в ней данные.
то есть если в первом списке меняется строка, перевыбирается то есть.
То во втором списке появляются или не появляются данные
в зависимости от их наличия.
Подскажите что не так? Я хочу получить процедурой Тз
этого динамического списка. Но пишет что эта процедура не определена.
Источник
Ошибка в процедуре ТоварыПриАктивизацииСтроки в управляемых формах
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
Строка = Элементы.Товары.ТекущиеДанные.Номенклатура;
Если Строка <> Неопределено Тогда
//задаем функцию для чтения нужных остатков
Остатки = ОпределениеОстаткаТовара(Строка,Объект.Склад,Объект.Дата,Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
//создаем фильтр по номенклатуре на текущей строке и выбранного склада по документу
Фильтр = Новый Структура;
Фильтр.Вставить(«Склад»,Склад);
Фильтр.Вставить(«Номенклатура»,ТекТовар);
//у проведенного документа берем дату, иначе дата Неопределено
Если ЗначениеЗаполнено(Ссылка) Тогда
Момент = Новый МоментВремени(Дата,Ссылка);
Иначе
Момент = Неопределено;
КонецЕсли;
//задаем таблицу, где читаем по подготовленным параметрам
ТаблицаОстатков = Остаток.Остатки(Момент,Фильтр,»Номенклатура»,»Количество»);
//возвращаем итог таблицы по ресурсу Количество
Возврат ТаблицаОстатков.Итог(«Количество»);
КонецФункции
А теперь проблемы:
1. При открытии/создании документа ЕСЛИ нет строки в табличной части, то срабатывает ТоварыПриАктивизацииСтроки (вообще не пойму в связи с чем, пару дней назад такого не было — проверял):
2. При добавлении новой строки в ТОВАРЫ остатки считаются только если создать новую строку и вернуться к редактированию предыдущей, получается что активизация тупо не срабатывает (фото прикладываю).
Подскажите в чем косяк?
Платформа 8.3.13, конфа Каркасная для экзамена.
Источник
Двойное срабатывание события при активации строки
Отрабатывает дважды событие при активации строки при проставлении отбора в компоновщик настроек.
В типовом механизме проставляется отбор с «ВидСравненияКомпоновкиДанных.Равно» я добавляю условие на то что если в выбранной строке находится группа то выполняется сравнение «ВидСравненияКомпоновкиДанных.ВИерархии» и это вызывает двойное отрабатывание события.
Проблема двойного срабатывания в том что при повторном обходе берется элемент вложенный в группу что как бы возвращает к условию «равно»
Проблема точно находится именно в этом сравнении. Если изменить на «ровно» то все отрабатывает корректно
Подскажите пожалуйста что я делаю не так?
Если я правильно понял задачу, то Вам не надо делать запрос. И не надо делать условия. Просто надо заменить условие отбора: вместо «ВидСравненияКомпоновкиДанных.Равно» напишите «ВидСравненияКомпоновкиДанных.ВИерархии». Если выбрать элемент, отберется вся номенклатура этого вида; если выбрать группу, отберется вся номенклатура видов в иерархии этой группы.
Проблема в другом: при выборе Номенклатуры в отобранном списке происходит выбор вида номенклатуры в таблице видов номенклатуры. Естественно, срабатывает событие ПриАктивизацииСтроки таблицы ВидыНоменклатуры и отбор уже по виду номенклатуры, который выделился. Как я понял, Вам надо, чтобы этого не происходило. Тогда надо отключить обработчик ПриАктивизацииСтроки таблицы Номенклатуры, либо как-то по-другому обработать это событие
(8)Синтакс — помощник. ПриАктивизацииСтроки.
Вызывается при активизации строки таблицы.
Примечание:
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
(15)для проверки изменил решение и добавил код НаКлиенте
результат тот же
[1] отбор на вид номенклатуры (было равно)
(25) в самом дин списке изменил запрос
Никак не могу найти параметр для заполнения
Подскажите пожалуйста где искать параметр который находится в <>
(27) что то я никак не могу найти. туплю..
(28)все верно.
Теперь этот параметр надо у ДС установить.
При создании на сервере установите параметр как пустая ссылка или Неопределено.
При активизации строки видов номенклатуры — устанавливайте нужное значение.
(29)ЗначениеПараметраКомпоновкиДанных = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра)); — не находит . наименование точное .
ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(СписокНоменклатура,»ВидНоменклатуры»,ТекущиеДанные.ссылка,Истина); — изменил под себя.
(28)
Вы изначально в дебри полезли. Никаких программных отборов и тому подобного не нужно. Этот запрос верный. Осталось только это:
Если вид номенклатуры выбираете из другого динамического списка, то у того может быть такой запрос:
Обратите внимание, что я использую не безликое «Ссылка» а сразу даю внятное название полю «ВидНоменклатуры» 😉
Вверху рядом с закладкой «Запрос» есть закладка «Настройки» и там в подзакладке «Порядок» указываете «ВидНоменклатуры.Наименование» = «По возрастанию»
Тогда при открытии формы курсор автоматом станет на первую строку, где вид номенклатуры не задан и вторая таблица будет пустой.
При выборе какого-нибудь элемента в первой — будет меняться вторая.
Если же нужно, чтобы по умолчанию (при выборе первой (пустой) строки) показывался ВЕСЬ список, то меняем условие ГДЕ на такое:
Если пустой вариант вообще не нужен, тогда можно сделать так (чтобы исключить ошибку):
нужно заменить на тот что указан в фото на ответе «21».
Процедура при активации строки имеет типовой функционал который я не хотел бы заменять целиком и поэтому добовлял свои корректировки уже после ее выполнения.
двойная активации происходит при абсолютно любом раскладе. Проставлял условия в отборах, параметрах, менял запрос , делал через расширения и прочие костыли но проблема возникала в любом случае если передавать несколько значений в сравнение.
Возможно я не могу корректно донести суть проблемы поэтому если у вас есть шаблон утшки на уф то вы могли бы сами увидеть суть проблемы.
В конфигураторе — Обработки — «ПодборТоваровВДокументЗакупки» — «Форма» — Модуль формы — «Процедура ВидыНоменклатурыПриАктивизацииСтроки(Элемент)».
Суть доработки в том что бы при выборе группы выводился весь список номенклатуры который относится к видам которые находятся в этой группе.
Источник
Активизация строки динамического списка
У таблиц УФ есть одна гадкая особенность. Событие ПриАктивизацииСтроки отрабатывает только при изменении индекса строки на таблице формы. Поэтому в некоторых случаях событие не вызывается вообще. И не важно, что к ней подключено ДС или таблица значений.
Я делаю достаточно большие аналитические формы, где из исходного ДС должны просчитаться некоторые данные и установиться отборы еще в нескольких ДС на форме.
На форме есть исходный список, от которого все пляшет. Для этого ДС нужно использовать и отборы и поиск. И вот тут сидит засада. Текущая строка списка меняется только если ее сдвинуть принудительно, или если после обновления ДС количество строк стало меньше. Тогда текущая строка автоматом переходит на позицию 1. Событие при этом возникает. А вот если строка не сдвинулась, то события не будет.
Особенная трагедия, если у вас изначально активна первая строка. При заполнении списка событие отработало и установились дополнительные данные на форме.
Дальше делаете любое изменение состава списка (отбор, поиск и пр.). Данные в строке 1 исходного списка изменятся, а вот дополнительные реквизиты на форме, которые берут данные из этого списка или отборы других ДС не поменяются, т.к. события ПриАктивизацииСтроки не будет.
Получается, что нужно отлавливать событие изменения списка. Но и тут засада.
У таблицы ДС есть событие ОбработкаЗапросаОбновления. Но оно для мобильного приложения.
Есть событие ПриПолученииДанныхНаСервере. Но опять есть нюанс. Эта процедура отрабатывает под директивой НаСерверБезКонтекста. Т.е. на форму из нее ничего передать нельзя.
Судя по форуму, народ с этой бедой борется с самого начала УФ. И в лучшем случае придуманы костыли с обработчиком ожидания, которые отрабатывают лишь в некоторых случаях.
Может у кого есть какие идеи?
и не отработало «ПриАктивизацииСтроки»? Ок, верю на слово, хотя ссылки на соответствующие темы на форуме не помешали бы.
Ну так делая «изменение состава», можно же дернуть необходимые методы вместо того, чтобы дергать их обработчиком события «ПриАктивизацииСписка».
Думаю, стоит набросать какую-то гипотетическую форму, где эту проблему можно наблюдать. И с помощью этой формы, консультируясь с коллегами, например, на этом форуме, найти какое-то универсальное решение.
Идеи будут, когда будут ссылки и готовая форма.
Источник