Контакт между формой и ПриПолученииДанныхНаСервере()
Как передавать данные между формой списка и ПриПолученииДанныхНаСервере()
Наткнулся на заметку Как “приджойнить” к динамическому списку таблицу из формы
И решил рассказать про такую костыльную возможность, которую использую уже давно в специальной подсистеме для внутреннего (пока что) пользования.
💿 Вы можете помнить, что в “обычных” формах было событие ПриВыводеСтроки()
, которое позволяло оформить строки таблицы и как-то наполнить данными
В “управляемых” формах долго не было аналога, но в какой-то момент вендор всё же дал нам событие “ПриПолученииДанныхНаСервере()
”. И вроде бы всё хорошо, но событие-то НаСервереБезКонтекста. А значит внутри нельзя обработать другие данные формы или же просто что-то кэшировать между вызовами события.
💡Нельзя ли? Конечно, можно!
И в этом нам поможет структура, которая доступна по адресу:
1
ДинамическийСписок.КомпоновщикНастроек.Настройки.ДополнительныеСвойства
Например, если мы в ПриСозданииНаСервере()
вставим в доп. свойства какое-то соответствие, то сможем использовать его внутри события ПриПолученииДанныхНаСервере()
из коллекции Настройки.ДополнительныеСвойства
. ⬇️
1
2
3
4
5
6
7
8
9
10
11
12
13
14
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДинамическийСписок.КомпоновщикНастроек.Настройки
.ДополнительныеСвойства.Вставить("Кэш", Новый Соответствие);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Кэш = Настройки.ДополнительныеСвойства.Кэш;
КонецПроцедуры
✔️ Такая коллекция будет едина между вызовами события, а значит её можно использовать в качестве кэша и ускорять получения доп. данных списка. Но ещё эта коллеция будет доступна в других методах формы. Таким образом, к примеру, у нас реализован функционал по сбору истории отборов ДС. Позволяет в любой момент включить сбор статистики и потом проанализировать какие отборы\сортировки\группировки устанавливают пользователи и как им можно облегчить жизнь.
❌ К сожалению, нельзя передать напрямую сложные данные. Они либо упадут в ошибку, либо их изменения не будут доступны на клиенте. Например, можно передать напрямую ДанныеФормыКоллекция, но после открытия она отвяжется от формы и будет независимой коллекцией, а значит изменения на форме отображаться не будут.
✔️ Но зато можно передать адрес временного хранилища. И с заданной периодичностью его извлекать и как-то обрабатывать.
😁 Ну и по классике напомню, что описанное выше не совсем очевидное поведение и имеет множество нюансов, поэтому использовать нужно с особой осторожностью и только при отсутствии других “нормальных” методов реализовать вашу потребность