Работа с динамическим списком
1С: Предприятие 8.3.13 . Документация
Руководство разработчика
Глава 7 . Формы, Раздел 7.9.5
В данном разделе приведены примеры выполнения некоторых операций по работе с динамическим списком, размещенным в форме.
ПРИМЕЧАНИЕ. Примеры, приведенные ниже, не являются законченным. Они предназначены для демонстрации различных механизмов работы с динамическим списком.
7.9.5.1. Параметр запроса динамического списка
В данном разделе приведен пример установки параметра запроса динамического списка.
Предположим, что для динамического списка указан следующий запрос к данным:
ВЫБРАТЬ
Товары.Код КАК Код,
Товары.Наименование КАК Наименование,
Товары.Артикул КАК Артикул,
ТоварныеЗапасыОстатки.КоличествоОстаток КАК Количество,
ЦеныТоваровСрезПоследних.Цена КАК Цена,
Товары.ЭтоГруппа
ИЗ
Справочник.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(, Склад = &Склад) КАК ТоварныеЗапасыОстатки
ПО (ТоварныеЗапасыОстатки.Товар = Товары.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(, ВидЦен = &ВидЦен) КАК ЦеныТоваровСрезПоследних
ПО Товары.Ссылка = ЦеныТоваровСрезПоследних.ТоварТогда для установки параметров данного запроса (в обработчике ПриСозданииНаСервере()) нужно указать параметры Склад и ВидЦен следующим образом.
// СписокТоваров - реквизит формы типа ДинамическийСписок
// Параметры.Склад и Параметры.ВидЦен - параметры формы соответствующих типов
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокТоваров.Параметры.УстановитьЗначениеПараметра("Склад", Параметры.Склад);
СписокТоваров.Параметры.УстановитьЗначениеПараметра("ВидЦен", Параметры.ВидЦен);
КонецПроцедуры7.9.5.2. Отбор
В данном разделе приведены примеры установки и удаления отбора в динамическом списке.
Установить
Функция добавляет отбор в динамический список и возвращает созданный элемент отбора.
Функция ДобавитьОтбор(СписокОтборов, ИмяПоля, Значение, ВидСравнения = Неопределено, Использование = Истина)
НовыйЭлемент = СписокОтборов.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
НовыйЭлемент.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения);
НовыйЭлемент.ПравоеЗначение = Значение;
НовыйЭлемент.Использование = Использование;
Возврат НовыйЭлемент;
КонецФункцииПример использования:
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок" // В списке должна быть колонка "Контрагент" // // Выполняется установка отбора по полю "Контрагент", значение // отбора находится в переменной "КонтрагентСсылка", отбор включен, // условие отбора - равно. ДобавитьОтбор(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, "Контрагент", КонтрагентСсылка);
Удалить
Процедура удаляет отбор динамического списка и возвращает результат удаления. Если имя поля с удаляемым отбором не указано, выполняется очистка списка отборов.
Функция УдалитьОтбор(СписокОтборов, ИмяПоля = "")
Если ПустаяСтрока(ИмяПоля) Тогда
СписокОтборов.Элементы.Очистить();
Возврат Истина;
КонецЕсли;
Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
ОтборУдален = Ложь;
Для каждого ЭлементОтбора Из СписокОтборов.Элементы Цикл
Если ЭлементОтбора.Использование И ЭлементОтбора.ЛевоеЗначение = Поле Тогда
СписокОтборов.Элементы.Удалить(ЭлементОтбора);
ОтборУдален = Истина;
КонецЕсли;
КонецЦикла;
Возврат ОтборУдален;
КонецФункцииПример использования:
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок" // В списке должна быть колонка "Контрагент" // Выполняется удаление отбора по полю "Контрагент". Результат = УдалитьОтбор(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, "Контрагент");
7.9.5.3. Группировка
В данном разделе приведены примеры установки и удаления группировки в динамическом списке.
Установка
Функция добавляет группировку в динамический список и возвращает созданный элемент группировки.
Функция ДобавитьГруппировку(СписокГруппировок, ИмяПоля, Использование = Истина, ТипГруппировки = Неопределено)
Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
НовыйЭлемент = СписокГруппировок.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.Поле = Поле;
НовыйЭлемент.ТипГруппировки = ?(ТипГруппировки = Неопределено, ТипГруппировкиКомпоновкиДанных.Элементы, ТипГруппировки);
Возврат НовыйЭлемент;
КонецФункцииПример использования:
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок"
// В списке должна быть колонка "Контрагент"
//
// Выполняется создание группировки по полю "Контрагент", созданная
// группировка будет использоваться, тип группировки - только элементы
Группировка = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ДобавитьГруппировку(Группировка.ПоляГруппировки, "Контрагент");Удаление
Процедура удаляет группировку динамического списка и возвращает результат удаления. Если имя поля с удаляемой группировкой не указано, выполняется очистка списка группировок.
Функция УдалитьГруппировку(СписокГруппировок, ИмяПоля = "")
Если ПустаяСтрока(ИмяПоля) Тогда
СписокГруппировок.Элементы.Очистить();
Возврат Истина;
КонецЕсли;
Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
ГруппировкаУдалена = Ложь;
МассивЭлементовДляУдаления = Новый Массив;
Для каждого ЭлементГруппировки из СписокГруппировок.Элементы Цикл
Если ЭлементГруппировки.Поле = Поле тогда
МассивЭлементовДляУдаления.Добавить(ЭлементГруппировки);
КонецЕсли;
КонецЦикла;
Для каждого УдаляемыйЭлемент из МассивЭлементовДляУдаления Цикл
СписокГруппировок.Элементы.Удалить(УдаляемыйЭлемент);
ГруппировкаУдалена = Истина;
КонецЦикла;
Возврат ГруппировкаУдалена;
КонецФункцииПример использования:
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок" // // Выполняется удаление всех группировок в динамическом списке Результат = УдалитьГруппировку(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Группировка);
7.9.5.4. Порядок (сортировка)
В данном разделе приведены примеры установки и удаления упорядочивания динамического списка.
Установка
Функция добавляет поле сортировки в динамический список и возвращает созданный элемент порядка.
Функция ДобавитьПорядок(СписокПорядков, ИмяПоля, Использование = Истина, ТипУпорядочивания = Неопределено)
Поле = Новый ПолеКомпоновкиДанных(Поле);
НовыйЭлемент = СписокПорядков.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.Поле = Поле;
НовыйЭлемент.ТипУпорядочивания = ?(ТипУпорядочивания = Неопределено, НаправлениеСортировкиКомпоновкиДанных.Возр, ТипУпорядочивания);
Возврат НовыйЭлемент;
КонецФункцииПример использования:
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок" // В списке должна быть колонка "Наименование" // // Выполняется установка сортировки по полю "Наименование", // направление сортировки - по убыванию, сортировка используется ДобавитьПорядок(ДинамическийСписок.КомпоновщикНастроек.Настройки.Порядок, "Наименование", Истина, НаправлениеСортировкиКомпоновкиДанных.Убыв);
Удаление
Процедура удаляет сортировку динамического списка и возвращает результат удаления. Если имя поля упорядочивания не указано, выполняется очистка списка упорядочивания.
&НаКлиенте
Функция УдалитьПорядок(СписокПорядков, ИмяПоля = "")
Если ПустаяСтрока(ИмяПоля) Тогда
СписокПорядков.Элементы.Очистить();
Возврат Истина;
КонецЕсли;
Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
ПорядокУдален = Ложь;
МассивЭлементовДляУдаления = Новый Массив;
Для каждого ЭлементПорядка из СписокПорядков.Элементы Цикл
Если ЭлементПорядка.Поле = Поле тогда
МассивЭлементовДляУдаления.Добавить(ЭлементПорядка);
КонецЕсли;
КонецЦикла;
Для каждого УдаляемыйЭлемент из МассивЭлементовДляУдаления Цикл
СписокПорядков.Элементы.Удалить(УдаляемыйЭлемент);
ПорядокУдален = Истина;
КонецЦикла;
Возврат ПорядокУдален;
КонецФункцииПример использования:
// ДинамическийСписок - реквизит формы типа "ДинамическийСписок" // // Выполняется удаление (не отключение) порядка по полю "Наименование" Результат = УдалитьПорядок(ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Порядок, "Наименование");
7.9.5.5. Условное оформление
В данном разделе приведены примеры задания условного оформления динамического списка. В условном оформлении используется динамический список Список, в котором есть поля Организация и Сумма (типа Число). В примере задаются три элемента условного оформления:
● если значение поля Сумма меньше 500, то текст полей Организация и Сумма оформляется красным цветом;
● если значение поля Сумма больше 500, но меньше 10 000, то для всех полей строки текст оформляется синим цветом;
● если значение поля Сумма больше 10 000, то текст полей Организация и Сумма оформляется зеленым цветом.
Также в примере используется функция установки отбора (см. здесь).
Функция УстановитьУсловноеОформление(СписокОформления, ИменаОформляемыхПолей, СтруктураОформление, Использование = Истина) Экспорт
НовыйЭлемент = СписокОформления.Элементы.Добавить();
НовыйЭлемент.Использование = Использование;
// Зададим оформляемые поля, заданные массивом с именами полей
Для каждого ИмяПоля Из ИменаОформляемыхПолей Цикл
ОформляемоеПоле = НовыйЭлемент.Поля.Элементы.Добавить();
ОформляемоеПоле.Использование = Истина;
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
КонецЦикла;
// Зададим оформление, заданное структурой,
// в которой - Ключ: имя параметра оформления,
// а Значение - значение параметра оформления
Для каждого ЭлементОформления Из СтруктураОформление Цикл
НовыйЭлемент.Оформление.УстановитьЗначениеПараметра(ЭлементОформления.Ключ, ЭлементОформления.Значение);
КонецЦикла;
Возврат НовыйЭлемент;
КонецФункцииПример задания условного оформления:
ЭлементыУсловногоОформления = Список.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление;
ОформляемыеПоля = Новый Массив;
ОформляемыеПоля.Добавить("Сумма");
ОформляемыеПоля.Добавить("Организация");
// ***** Установка красного цвета для суммы менее 500
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(128,0,0));
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, ОформляемыеПоля, Оформление);
// Зададим условие оформления: Сумма < 500
ДобавитьОтбор(НовыйЭлемент.Отбор, "Сумма", 500, ВидСравненияКомпоновкиДанных.Меньше);
// ***** Установка зеленого цвета для суммы более 10 000
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(0,128,0));
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, ОформляемыеПоля, Оформление);
Зададим условие оформления: Сумма > 10 000
ДобавитьОтбор(НовыйЭлемент.Отбор, "Сумма", 10000, ВидСравненияКомпоновкиДанных.Больше);
// установка синего цвета, если сумма в интервале от 500 до 10 000
Оформление = Новый Структура;
Оформление.Вставить("ЦветТекста", Новый Цвет(0,0,128));
// Передача пустого массива в качестве списка оформляемых полей
// означает оформление всех полей строки
НовыйЭлемент = УстановитьУсловноеОформление(ЭлементыУсловногоОформления, Новый Массив, Оформление);
// Cоздадим группу условий "И"
ГруппаОтборов = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтборов.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
// Зададим условие оформления: Сумма > 500 И Сумма < 10 000
ДобавитьОтбор(ГруппаОтборов, "Сумма", 500, ВидСравненияКомпоновкиДанных.Больше);
ДобавитьОтбор(ГруппаОтборов, "Сумма", 10000, ВидСравненияКомпоновкиДанных.Меньше);
Нихт арбайтн
Несоответствие типов
Группировка = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип(“ГруппировкаКомпоновкиДанных”));
по причине:
Несоответствие типов
Потому что “Группировка” – это свойство формы, используйте другой идентификатор переменной.
Пространства имён – не самая сильная сторона 1С )
Функцию с добавлением отбора лучше доработать и вставить перед добавлением поиск
Функция ДобавитьОтбор(СписокОтборов, ИмяПоля, Значение, ВидСравнения = Неопределено, Использование = Истина)
ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбора = Неопределено;
Для Каждого Отбор Из Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы Цикл
Если Отбор.ЛевоеЗначение = ПолеОтбора Тогда
ЭлементОтбора = Отбор;
Прервать
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора Неопределено тогда
НовыйЭлемент = ЭлементОтбора;
Иначе
НовыйЭлемент = СписокОтборов.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
КонецЕсли;
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
НовыйЭлемент.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения);
НовыйЭлемент.ПравоеЗначение = Значение;
НовыйЭлемент.Использование = Использование;
Возврат НовыйЭлемент;
КонецФункции
Процедуры и функции для работы с динамическим списком написаны в общем модуле ОбщегоНазначенияКлиентСервер библиотеки стандартных подсистем. Например , я часто вызываю процедуру УстановитьЭлементОтбораДинамическогоСписка когда нужно Добавить или заменить существующий элемент отбора динамического списка