1С событие обновления динамического списка

Область применения: управляемое приложение, мобильное приложение.

1. Платформа 1С:Предприятие по умолчанию обновляет содержимое динамических списков при выполнении пользователем стандартных команд по изменению элементов этого списка ( Записать , Провести , Пометить на удаление и т.п.) и при добавлении новых элементов. Но в ряде ниже перечисленных случаев такое обновление следует предусмотреть явно в прикладном коде.

2. Команды, которые изменяют объекты и размещаются в форме списка, должны заботиться об обновлении списка объектов после своего выполнения. Например, после изменения одного объекта рекомендуется вызывать метод ОповеститьОбИзменении :

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

ОбъектСсылка = ПараметрКоманды;
// Меняем объект
// .
ОповеститьОбИзменении(ОбъектСсылка);

При изменении нескольких объектов целесообразно обновлять список однократно, в конце операции:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

Для Каждого ОбъектСсылка Из ПараметрКоманды Цикл
// Меняем объект
// .
КонецЦикла;

3. Также должно быть обеспечено обновление данных в динамическом списке, у которого не назначена основная таблица. Такие динамические списки могут отображать данные из нескольких таблиц.

3.1. Если данные добавляются или изменяются командой, расположенной в форме динамического списка, то необходимо обновить список явно после выполнения команды.

3.2. Если данные изменяются в какой-либо другой форме (например, в форме объекта), то необходимо организовать обновление списка через оповещение. Для этого в каждой форме объекта, данные которого выводятся в динамическом списке, следует реализовать обработчик события ПослеЗаписи с использованием метода Оповестить :

Оповестить ("Запись_ ", ПараметрыОповещения, ОбъектСсылка);

  • Запись_ – имя события, в котором – имя объекта, как оно задано в метаданных. Например, для документа "Расходная накладная" имя события будет "Запись_РасходнаяНакладная" .
  • ПараметрыОповещения – как правило, это параметр события ПослеЗаписи формы объекта. Состав свойств структуры может быть расширен исходя из потребностей прикладной логики.
  • ОбъектСсылка – ссылка на записываемый объект.

Затем в обработчике события Оповещение в форме динамического списка разместить код по обновлению динамического списка вида:

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

Если Врег(ИмяСобытия) = Врег("Запись_РасходнаяНакладная")
Или Врег(ИмяСобытия) = Врег("Запись_НакладнаяНаПеремещение") Тогда
Элементы.СписокНакладных.Обновить();
КонецЕсли;

Читайте также:  Что означает ошибка хеша

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

3.3. При изменении сразу нескольких объектов в параметре ОбъектСсылка метода Оповестить следует передавать значение Неопределено .

Оповестить("Запись_РасходнаяНакладная", ПараметрыЗаписи, Неопределено);

1. Платформа 1С:Предприятиепо умолчанию обновляет содержимое динамических списков при выполнении пользователем стандартных команд по изменению элементов этого списка (Записать, Провести, Пометить на удаление и т.п.) и при добавлении новых элементов. Но в ряде ниже перечисленных случаев такое обновление следует предусмотреть явно в прикладном коде.

2. Команды, которые изменяют объекты и размещаются в форме списка, должны заботиться об обновлении списка объектов после своего выполнения. Например, после изменения одного объекта рекомендуется вызывать метод ОповеститьОбИзменении:

При изменении нескольких объектов целесообразно обновлять список однократно, в конце операции:

3. Также должно быть обеспечено обновление данных в динамическом списке, у которого не назначена основная таблица. Такие динамические списки могут отображать данные из нескольких таблиц.

3.1 Если данные добавляются или изменяются командой, расположенной в форме динамического списка, то необходимо обновить список явно после выполнения команды.

3.2 Если данные изменяются в какой-либо другой форме (например, в форме объекта), то необходимо организовать обновление списка через оповещение. Для этого в каждой форме объекта, данные которого выводятся в динамическом списке, следует реализовать обработчик события ПослеЗаписи с использованием метода Оповестить:

  • Запись_ – имя события, в котором – имя объекта, как оно задано в метаданных. Например, для документа "Расходная накладная" имя события будет "Запись_РасходнаяНакладная".
  • ПараметрыОповещения – как правило, это параметр события ПослеЗаписи формы объекта. Состав свойств структуры может быть расширен исходя из потребностей прикладной логики.
  • ОбъектСсылка – ссылка на записываемый объект.

Затем в обработчике событияОповещение в форме динамического списка разместить код по обновлению динамического списка вида:

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

Задача состояла в следующем. В форме динамического списка необходимо было показать итоговую информацию. К примеру, в журнале накладных вывести количество накладных и общую сумму. Получить необходимые данные не составляло труда – формировался запрос с условием, соответствующим текущему отбору списка и запускался на выполнение. Но неожиданно проблемой оказалось обеспечение "синхронности" между данными списка и итоговой информацией.

Читайте также:  Солтек инструкция по применению цена отзывы

То есть, данные динамического списка могут изменяться по различным причинам:
1. Изменился отбор списка
2. Пользователь в текущем сеансе изменил или удалил объект из списка
3. Пользователь нажал в форме кнопку "Обновить" (либо настроено автоматическое обновление списка)
Соответственно, хотелось бы после каждого такого события сразу пересчитывать служебную информацию.

Варианты решения были следующие:

1. Использовать событие формы "ОбновлениеОтображения".
Это событие действительно реагирует на любое изменение динамического списка. Но оно также вызывается и во многих других случаях. В частности, при смене страницы формы, при активизации строки в списке (если назначена обработка этих событий) и т.д. Короче, использование этого варианта вызывало приличные тормоза из-за перерасчета итогов после каждого чиха пользователя.

2. Использовать событие табличного поля "ПриПолученииДанных".
Вариант имеет такие же недостатки, как и предыдущий, хотя и в меньшей степени. Т.е. событие (а значит, и перерасчет итогов) выполнялось не только когда данные списка действительно менялись, но и при прокрутке списка, и даже при изменении размеров формы.

3. Добавить в форму кнопочку "Рассчитать", чтобы пользователь жал на неё всякий раз, когда ему потребуются актуальные итоги по списку. Коряво, неудобно, но приходилось поступать именно так, пока не появился ВАРИАНТ 4.

Хотя решение немного через .опу

Суть: на форму добавляется скрытое табличное поле, источником данных которого служит нужный нам динамический список, и далее используется событие "ПриПолученииДанных" этого табличного поля. Так как данное табличное поле не прокручивается и не меняет размеров, то событие возникает только тогда, когда список реально требует обновления.
Правда, в процессе реализации этого варианта вылезло ещё несколько "особенностей" платформы, но почти все удалось обойти.
В результате, сервисный код упрятан в две процедуры общего модуля: ПодключитьОбработчикОбновленияСписка(. ) и ОтключитьОбработчикОбновленияСписка(. ). Первая назначает для обработки обновления списка процедуру модуля формы, вторая, соответственно, отключает обработчик. Выглядит всё это так:

Читайте также:  Чем редактировать fb2 файлы

Теперь ложка дёгтя.
Алгоритм не отрабатывает ситуацию, когда список полностью очищается. То есть, в списке были какие-то строки, а потом пользователь все строки удалил, либо задал такой отбор, при котором в список не попадает ни один объект. Как оказалось, 1С просто не вызывает событие "ПриПолученииДанных" для пустого списка.

Чтобы обойти эту проблему, пришлось погрузиться в .опу уже по локоть.
Используя событие "ПриАктивизацииСтроки" нашего вспомогательного табличного поля, можно отловить ситуацию, когда свойство ТекущаяСтрока табличного поля меняет значение на Неопределено, сигнализируя, что в списке больше нет ни одной строки. Но очередной сюрприз от платформы – приняв значение Неопределено, ТекущаяСтрока "фиксируется" на нем, и не меняется, даже когда в списке вновь появляются объекты. То есть, если не поменять значение текущей строки, второй раз событие "ПриАктивизацииСтроки" уже не сработает.
Трагедия в том, что узнать, что список вновь заполнен, можно только в "ПриПолученииДанных", а изменить текущую строку во время обработки данного события невозможно – 1С вылетает с критической ошибкой (желающие могут попробовать). Помогли только пляски с шаманским бубном вокруг компьютера.

В итоге, получилось следующее:

Замечание от Гений1С:
Можно попробовать подключить функцию изменения данных ПодключитьОбработчикИзмененияДанных на данные списка.

Замечание от clappa:
Мне удалось использовать ПодключитьОбработчикИзмененияДанных только для контроля за изменением отбора динамического списка. В других перечисленных случаях этот метод бесполезен. В частности, изменение порядка он "не ловит".

Оцените статью
Добавить комментарий

Adblock detector