Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Динамический список
Дальше: Табличная часть

Дополнительная обработка данных, получаемых динамическим списком

Примечание

Пример можно посмотреть в демонстрационной базе «Дополнительные колонки в списках», форма списка справочника Товары.

Иногда в динамическом списке требуется отобразить некоторую вспомогательную информацию, которую затруднительно, неэффективно или невозможно получить в рамках запроса динамического списка.

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

Данное событие вызывается после получения данных динамическим списком в том случае, если динамическим списком получена хотя бы одна строка. В обработчик события ПриПолученииДанныхНаСервере() первым параметром передается имя таблицы формы, из которой вызван этот обработчик.

Во втором параметре передается копия полных настроек динамического списка типа НастройкиКомпоновкиДанных. С помощью свойства настроек ДополнительныеСвойства предоставляется возможность передавать необходимые данные из формы во внеконтекстный обработчик.

Третий параметр содержит коллекцию строк, которые будет отображать динамический список. В коллекции содержатся собственно данные (кроме строк группировок) и оформление этих данных.

Необходимо учитывать, что настройки списка: отбор (в том числе поиск), сортировка, группировка, условное оформление – будут применяться к значениям, полученным до изменения их обработчиком.

Для пояснения сказанного рассмотрим пример. Допустим, в списке товаров в отдельной колонке нам нужно выводить суммарное количество поступлений товаров за период, указанный в реквизите формы. В реальной жизни для этого, конечно, может использоваться регистр накопления остатков, но в нашей конфигурации его нет. Поэтому, в качестве примера, «оторванного от жизни», нам эта задача вполне подходит.

Откроем форму списка справочника Товары, добавим реквизит формы Период типа СтандартныйПериод и перетащим его в форму. Создадим у получившегося поля обработчик события ПриИзменении и заполним его следующим образом (листинг 3.107).

Листинг 3.107. Обработчик события «ПриИзменении» поля «Период»

&НаКлиенте

Процедура ПериодПриИзменении(Элемент)

 

Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ДатаНачала", Период.ДатаНачала);

Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ДатаОкончания", Период.ДатаОкончания);

Элементы.Список.Обновить();

 

КонецПроцедуры

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

При этом сначала выполняется запрос, указанный в свойствах динамического списка. Добавим туда заготовку для поля Поступило, в котором будет отображаться количество поступлений товара за заданный период (листинг 3.108).

Листинг 3.108. Произвольный запрос динамического списка

ВЫБРАТЬ

СправочникТовары.Ссылка,

СправочникТовары.ПометкаУдаления,

СправочникТовары.Код,

СправочникТовары.Наименование,

СправочникТовары.Артикул,

СправочникТовары.Сорт,

СправочникТовары.Предопределенный,

СправочникТовары.ИмяПредопределенныхДанных,

ЦеныСрезПоследних.Цена,

ВЫРАЗИТЬ (NULL КАК Число) КАК Поступило

ИЗ

РегистрСведений.Цены.СрезПоследних КАК ЦеныСрезПоследних

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК СправочникТовары

ПО ЦеныСрезПоследних.Товар = СправочникТовары.Ссылка

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

Создадим обработчик события ПриПолученииДанныхНаСервере (обработчик должен быть внеконтекстным серверным) у таблицы формы Список и заполним его следующим образом (листинг 3.109).

Листинг 3.109. Обработчик события «ПриПолученииДанныхНаСервере» таблицы «Список»

&НаСервереБезКонтекста

Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)

 

Если Настройки.ДополнительныеСвойства.Свойство("ДатаНачала") И Настройки.ДополнительныеСвойства.Свойство("ДатаОкончания") Тогда

ДатаНачала = Настройки.ДополнительныеСвойства.ДатаНачала;

ДатаОкончания = Настройки.ДополнительныеСвойства.ДатаОкончания;

 

КонецЕсли;

 

Если НЕ ЗначениеЗаполнено(ДатаНачала) ИЛИ НЕ ЗначениеЗаполнено(ДатаОкончания) Тогда

Возврат;

 

КонецЕсли;

 

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| МАКСИМУМ(НакладнаяТовары.Ссылка) КАК Ссылка,

| СУММА(НакладнаяТовары.Количество) КАК ИтогКоличество,

| НакладнаяТовары.Товар КАК Товар

|ИЗ

| Документ.Накладная.Товары КАК НакладнаяТовары

|ГДЕ

| НакладнаяТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

| И НакладнаяТовары.Товар В(&Товары)

| И НакладнаяТовары.Ссылка.Проведен = ИСТИНА

|

|СГРУППИРОВАТЬ ПО

| НакладнаяТовары.Товар";

 

Запрос.УстановитьПараметр("Товары", Строки.ПолучитьКлючи());

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);

Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

 

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

СтрокаСписка = Строки[Выборка.Товар];

СтрокаСписка.Данные["Поступило"] = Выборка.ИтогКоличество;

СтрокаСписка.Оформление["Поступило"].УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Малиновый);

 

КонецЦикла;

 

КонецПроцедуры

Сначала мы получаем из структуры дополнительных свойств настроек динамического списка, переданных в параметре Настройки, даты начала и окончания периода, заданные в реквизите формы Период. Эти даты будут использоваться в качестве значений параметров ДатаНачала и ДатаОкончания запроса для получения данных.

С помощью этого запроса выбираются данные из табличных частей накладных за период, группируются по товарам, а значение поля Количество суммируется по каждому товару.

Массив выбираемых товаров ограничивается с помощью параметра Товары. Значение этого параметра получается с помощью метода ПолучитьКлючи() коллекции строк динамического списка, переданной в параметре Строки. Этот метод возвращает массив значений ключей для всех записей, которые будут отображаться динамическим списком.

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

Надо заметить, что работа с оформлением ячеек динамического списка (Строки.Оформление) ничем не отличается от работы с оформлением ячеек системы компоновки данных. Мы изменили цвет текста колонки Поступило просто в целях демонстрации.

После завершения обработчика измененный набор данных (коллекция Строки) будет передан клиентскому приложению для отображения таблицей формы, которая связана с динамическим списком.

Проверим, как это работает.

Раскроем реквизит Список и перетащим новое поле Поступило в таблицу формы (рис. 3.129).

Рис. 3.129. Добавление новой колонки в список в конфигураторе

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

Рис. 3.130. Заполнение новой колонки в динамическом списке в режиме «1С:Предприятие»

Если настроить список программно или интерактивно (например, задать отбор, условное оформление и т. д.), то настройки списка будут применены, но только к данным, полученным до изменения их обработчиком ПриПолученииДанныхНаСервере().

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

Назад: Динамический список
Дальше: Табличная часть