Динамический список. Дополнительная обработка данных
Событие ПриПолученииДанныхНаСервере
В редакции 8.3.10 реализована возможность дополнительно обработать данные, которые получил динамический список для отображения. Реализовано событие ПриПолученииДанныхНаСервере. Подробнее об этом написано на диске ИТС здесь
Требования к динамическим спискам могут включать отображение вспомогательной информации, которую затруднительно, неэффективно или невозможно получить в рамках запроса динамического списка. В этом случае можно воспользоваться обработчиком ПриПолученииДанныхНаСервере таблицы управляемой формы, отображающей данные динамического списка. Это внеконтекстный обработчик формы, который позволяет выполнить дополнительную обработку данных, которые получает динамический список для отображения.
Данное событие вызывается после получения данных динамическим списком. Событие вызывается в том случае, если динамическим списком получена хотя-бы одна строка.
Настройки динамического списка (отбор (в том числе поиск), сортировка, группировка, условное оформление и т. д.) будут применяться к фактическим данным, которые получены запросом динамического списка, до их обработки в рамках обработчика события ПриПолученииДанныхНаСервере.
Обработчик ПриПолученииДанныхНаСервере получает три параметра:
- ИмяЭлемента– содержит имя таблицы, для которой выполняется данный обработчик.
- Настройки– содержит копию полных настроек динамического списка. Особое внимание следует уделить свойству ДополнительныеСвойства для этого параметра. С помощью этого свойства предоставляется возможность передавать необходимые данные из формы во внеконтекстный обработчик.
- Строки– параметр содержит коллекцию строк, которые будет отображать динамический список. В коллекции содержатся собственно данные и оформления этих данных, но не содержит строк группировок.
В качестве примера будет рассмотрен список товаров, куда выводится цена товара для категории цен, указанной в реквизите формы.
Динамический список расположен в реквизите Список, отображается таблицей Список (элемент формы). Вид цены настраивается с помощью реквизита ВидЦен типа СправочникСсылка.ВидыЦен.
ПРИМЕЧАНИЕ. Примеры, приведенные ниже, не являются законченным. Они предназначены для демонстрации различных механизмов работы с динамическим списком.
Собственно запрос динамического списка очень простой:
Этот запрос отображает сам справочник товаров и «готовит место» для размещения цены товаров (колонка Цена). Остальные действия выполняются в обработчике события ПриПолученииДанныхНаСервере:
При рассмотрении текста обработчика следует обратить внимание на следующие моменты:
- В силу того, что рассматриваемый обработчик является внеконтекстным, получение категории цен выполняется особым образом: с помощью дополнительных свойств объекта Настройки, передаваемого параметром обработчика. Следствием этого является тот факт, что при изменении значения элемента формы, отображающего реквизит ВидЦен, необходимо установить новое значение реквизита в настройки динамического списка, а затем обновить список:
Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить(“ВидЦен”, ВидЦен);
Элементы.Список.Обновить();
- Способ получения значений ключей для всех записей, которые будут отображаться динамическим списком. Для этого используется специальный методПолучитьКлючи().
- Данные, расположенные в Строки.Данные, представляют из себя в точности тот набор данных, который будет передан клиентскому приложению для отображения таблицей управляемой формы, которая связана с динамическим списком. Эта передача будет выполнена после завершения обработчика.
- Работа с оформлением ячеек динамического списка (Строки.Оформление) не отличается от работы с оформлением ячеек системы компоновки данных.
Если в обработчике события ПриПолученииДанныхНаСервере изменяются данные строк, то рекомендуется исключать поля, в которых изменяются данные, из списков полей, используемых для группировки, упорядочивания и отбора. Если этого не сделать, группировка, упорядочивание и отбор (включая все виды поиска) будет работать неожиданно для пользователя. Причиной такого поведение является то, что все указанные операции выполняются по тем данным, которые непосредственно вернет запрос формирования динамического списка. Результат работы обработчика ПриПолученииДанныхНаСервере не используется для этих операций.
Для установки ограничения на использование поля в той или иной операции предназначены методы динамического списка УстановитьОграниченияИспользованияВГруппировке(), УстановитьОграниченияИспользованияВПорядке() и УстановитьОграниченияИспользованияВОтборе(). МетодыПолучитьОграниченияИспользования…() (для реквизита типа ДинамическийСписок) возвращают текущий список полей, недоступных для выполнения той или иной операции, при условии, что список ограничений задан методами УстановитьОграниченияИспользования…().
Данные, передаваемые в обработчик события ПриПолученииДанныхНаСервере, уже обработаны условным оформлением динамического списка. При этом для вычисления условий, очевидно, были использованы данные, полученные в качестве результата выполнения запроса. Если требуется изменять оформление данных динамическлого списка в зависимости от результата работы обработчика ПриПолученииДанныхНаСервере, то следует менять оформление непосредственно в самом обработчике.