Работа с динамическим списком
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С )
Функцию с добавлением отбора лучше доработать и вставить перед добавлением поиск
Функция ДобавитьОтбор(СписокОтборов, ИмяПоля, Значение, ВидСравнения = Неопределено, Использование = Истина)
ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбора = Неопределено;
Для Каждого Отбор Из Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы Цикл
Если Отбор.ЛевоеЗначение = ПолеОтбора Тогда
ЭлементОтбора = Отбор;
Прервать
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора Неопределено тогда
НовыйЭлемент = ЭлементОтбора;
Иначе
НовыйЭлемент = СписокОтборов.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
КонецЕсли;
НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
НовыйЭлемент.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения);
НовыйЭлемент.ПравоеЗначение = Значение;
НовыйЭлемент.Использование = Использование;
Возврат НовыйЭлемент;
КонецФункции
Процедуры и функции для работы с динамическим списком написаны в общем модуле ОбщегоНазначенияКлиентСервер библиотеки стандартных подсистем. Например , я часто вызываю процедуру УстановитьЭлементОтбораДинамическогоСписка когда нужно Добавить или заменить существующий элемент отбора динамического списка