Работа с динамическим списком

Печать (Ctrl+P)

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, ВидСравненияКомпоновкиДанных.Меньше);

Previous Article
Next Article

4 Replies to “Работа с динамическим списком”

  1. Александр

    Нихт арбайтн

    Несоответствие типов
    Группировка = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип(“ГруппировкаКомпоновкиДанных”));

    по причине:
    Несоответствие типов

  2. Александр

    Потому что “Группировка” – это свойство формы, используйте другой идентификатор переменной.

    Пространства имён – не самая сильная сторона 1С )

  3. Alex

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

    • master1c8

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.