Введение
Единственное событие элемента формы, привязанного к динамическому списку, которое позволяет поймать момент обновления данных в списке - это "ПриПолученииДанныхНаСервере". Но он должен иметь директиву "&НаСервереБезКонтекста". Есть способы передать в это событие данные формы, а вот наоборот - нет. Например: при каждом обновлении динамического списка мы хотим делать нечто с данными формы.
Решение
Текущий способ решения данной проблемы заключается в использовании свойства глобального контекста УведомленияКлиента, который был представлен в 26 платформе.
При открытии формы мы подписываемся на определенное уведомление, а в событии ПриПолученииДанныхНаСервере посылаем это самое уведомление, тем самым оповещая клиент о том, что динамический список был обновлен.
В качестве примера поставим задачу: показывать пользователю количество строк в динамическом списке. Ниже приведен код модуля формы списка.
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Сохраняем УникальныйИдентификатор для использования в СписокПриПолученииДанныхНаСервере()
Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("УникальныйИдентификаторФормы", УникальныйИдентификатор);
ДелаемНечто();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОписаниеОповещения = Новый ОписаниеОповещения("СписокПослеПолученияДанных", ЭтотОбъект);
УведомленияКлиента.ПодключитьОбработчик(КлючУведомленияПослеПолученияДанных(УникальныйИдентификатор), ОписаниеОповещения);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Адресаты = Новый Массив;
Адресаты.Добавить(НомерСеансаИнформационнойБазы());
КлючУведомления = КлючУведомленияПослеПолученияДанных(Настройки.ДополнительныеСвойства.УникальныйИдентификаторФормы);
// Второй параметр обязательный и при передачи в него Неопределено уведомление не отправляется.
// Поэтому заполняем его любым значением.
УведомленияКлиента.ОтправитьУведомление(КлючУведомления, 1, Адресаты);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиентеНаСервереБезКонтекста
Функция КлючУведомленияПослеПолученияДанных(УникальныйИдентификатор)
// Сделаем ключ уведомления уникальным среди открытых форм пользвателя,
// что бы текущая форма не воздействовала на другую, в которой используется этот же метод.
Возврат "СписокПослеПолученияДанных" + УникальныйИдентификатор;
КонецФункции
&НаКлиенте
Процедура СписокПослеПолученияДанных(Данные, ДополнительныеПараметры) Экспорт
// Тут главное не делать ничего, что может спровоцировать обновление дин. списка.
// Иначе получим бесконечный цикл.
ДелаемНечто();
КонецПроцедуры
&НаСервере
Процедура ДелаемНечто()
// Мы поймали событие обновления дин. списка, и нам доступен контекст.
// Что делать с этим дальше - на ваше усмотрение.
// Код ниже исключительно для примера.
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// КоличествоСтрок - это реквизит формы
КоличествоСтрок = Результат.Количество();
КонецПроцедуры
#КонецОбласти
Итог
С помощью механизма уведомлений клиента мы добились, что клиентский код "узнает" о событии "ПриПолученииДанныхНаСервере".
Но важно понимать: это событие вызывается не только при изменении данных (смене отбора, добавлении элемента, сортировке), но и при обычном динамическом считывании. Иной единой точки входа, увы, нет.
Забавно: клиент сам инициирует обновление списка - через кнопку обновления, изменение параметров, запись объектов. Все это происходит на его стороне, сервер никогда не присылает на клиент команду "Надо обновить дин. список". Но при этом в платформе так и не появилось единого события, которое сообщало бы клиенту: "Список только что обновился".
На данный момент это единственное решение, которое мне удалось найти для обхода этой особенности платформы.
Вступайте в нашу телеграмм-группу Инфостарт

