Добавить в корзинуПозвонить
Найти в Дзене
1с разное

Отбор динамического списка. Программное добавление

Всем привет! Бывает, встречается задача - вынести на форму динамического списка на управляемых формах функцию (или механизм) быстрого отбора списка: например, быстрый отбор по складу среди документов или по стеллажу среди складских ячеек (складские ячейки - это список одноименного справочника). См. скрины Быстрый отбор по складу - программируется в конфигураторе. Конечно же, в пользовательском режиме можно использовать стандартный функционал (механизм) "Настройки списка" - но тогда нужно будет обучить пользователей правильно его использовать. Иногда лучше пойти другим путем - вынести на форму "быстрый отбор". Второй пример: при активизации ячейки слева (динамический список справочника СкладскиеЯчейки) - выделяется красной рамкой стеллаж справа (прямоугольник на табличном макете). И наоборот, при активизации стеллажа на макете справа - накладывается отбор в динамическом списке слева, который можно отключить по кнопке "Снять отбор". Известный способ, как задать программно любой отбор ди

Всем привет!

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

См. скрины

Рис. 1. Быстрый отбор по складу в списке документов
Рис. 1. Быстрый отбор по складу в списке документов

Быстрый отбор по складу - программируется в конфигураторе. Конечно же, в пользовательском режиме можно использовать стандартный функционал (механизм) "Настройки списка" - но тогда нужно будет обучить пользователей правильно его использовать. Иногда лучше пойти другим путем - вынести на форму "быстрый отбор".

Рис. 2. Быстрый отбор по стеллажу в списке ячеек
Рис. 2. Быстрый отбор по стеллажу в списке ячеек

Второй пример: при активизации ячейки слева (динамический список справочника СкладскиеЯчейки) - выделяется красной рамкой стеллаж справа (прямоугольник на табличном макете). И наоборот, при активизации стеллажа на макете справа - накладывается отбор в динамическом списке слева, который можно отключить по кнопке "Снять отбор".

Известный способ, как задать программно любой отбор динамического списка, алгоритм вызываем при изменении склада:

-3

Код для копирования ниже

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктурнаяЕдиница"); //это склад
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Склад;

Обратите внимание, что каждый раз при изменении склада мы добавляем новый элемент отбора. Таким образом, уже при втором изменении склада, у нас динамический список будет отфильтрован некорректно.

Надо каким-то образом обновлять значение элемента отбора по складу.

Есть несколько способов решить эту задачу со своими плюсами и минусами.

1. Использовать процедуру Очистить() перед созданием нового элемента отбора

-4

Код для копирования ниже

Список.Отбор.Элементы.Очистить();
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктурнаяЕдиница"); //это склад
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Склад;

2. Пройтись по коллекции элементов отбора, найти отбор по складу - например сравнив тип значения ПравогоЗначения элемента отбора, далее установить новое значение

-5

Код для копирования ниже

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

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

-6

Код для копирования ниже

Для Каждого ЭлементОтбора Из Список.Отбор.Элементы Цикл
Если ЭлементОтбора.ИдентификаторПользовательскойНастройки = "Склад" Тогда
Список.Отбор.Элементы.Удалить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ИдентификаторПользовательскойНастройки = "Склад";
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СтруктурнаяЕдиница"); //это склад
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Склад;

На этом все. Всем добра!