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

Печать (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 для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.