gifts2017

Открытие управляемой формы списка (выбора) с произвольными отборами

Опубликовал Николай Клементьев (Rusmus) в раздел Программирование - Практика программирования

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

Доработка формы выбора. В автоматически созданную управляемую форму выбора добавляем ключевой параметр 'ПараметрыОтбора', тип = произвольный. Из обработчика события ПриОткрытии() вызываем процедуру НастроитьОтборСписка():

&НаКлиенте

Процедура НастроитьОтборСписка()

Перем ПараметрыОтбора, РежимОтображения;

Если Параметры.Свойство("ПараметрыОтбора", ПараметрыОтбора)

И ТипЗнч(ПараметрыОтбора) = Тип("Структура")

Тогда 

Отбор = Список.Отбор.Элементы;

Для Каждого ЭлементСтруктуры Из ПараметрыОтбора Цикл 

ИмяОтбора = ЭлементСтруктуры.Ключ;

НастройкаОтбора = ЭлементСтруктуры.Значение;

Если НЕ НастройкаОтбора.Свойство("РежимОтображения", РежимОтображения) Тогда 

РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

КонецЕсли;

ЭлементОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ИдентификаторПользовательскойНастройки = ИмяОтбора;

ЭлементОтбора.Представление = ИмяОтбора;

ЭлементОтбора.ПредставлениеПользовательскойНастройки = ИмяОтбора;

ЭлементОтбора.РежимОтображения = РежимОтображения;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.ВидСравнения = НастройкаОтбора.ВидСравнения;

ЭлементОтбора.ЛевоеЗначение = НастройкаОтбора.ЛевоеЗначение;

ЭлементОтбора.ПравоеЗначение = НастройкаОтбора.ПравоеЗначение;

КонецЦикла;

КонецЕсли;

КонецПроцедуры 

Использование. В месте, откуда надо вызвать открытие нашей формы, помещаем код, например:

НастройкаОтбораПоВладельцам = Новый Структура;

НастройкаОтбораПоВладельцам.Вставить("ЛевоеЗначение", Новый ПолеКомпоновкиДанных("Владелец"));

НастройкаОтбораПоВладельцам.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.ВСписке);

НастройкаОтбораПоВладельцам.Вставить("ПравоеЗначение", СписокКонтрагентов);

НастройкаОтбораПоВладельцам.Вставить("РежимОтображения", РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);

ПараметрыОтбора = Новый Структура;

ПараметрыОтбора.Вставить("Владелец", НастройкаОтбораПоВладельцам); // Ключ структуры не обязательно должен быть "Владелец"

ПараметрыОткрытия = Новый Структура("ПараметрыОтбора", ПараметрыОтбора);

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыОткрытия, Элемент, ЭтаФорма);

Форма открывается, отборы применяются =).
PS. Хорошо бы, чтобы подобный механизм был встроен в платформу. Как можно передать эту идею разработчикам?

PPS. Глючит раскраска текста в Google Chrome.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Леонид Стасюков (stilet) 16.04.10 20:25
В процедуре Процедура НастроитьОтборСписка() в строке
Отбор = Список.Отбор.Элементы;
какое значение у Список?

НастройкаОтбораПоВладельцам.Вставить("ПравоеЗначение" , СписокКонтрагентов);
СписокКонтрагентов это просто список значений заранее настроенный?
2. Николай Клементьев (Rusmus) 17.04.10 13:36
> Отбор = Список.Отбор.Элементы;
Список - реквизит формы, тип = ДинамическийСписок

> НастройкаОтбораПоВладельцам.Вставить("ПравоеЗначение" , СписокКонтрагентов);
СписокКонтрагентов - тип = СписокЗначений
3. BigB (BigB) 19.04.10 13:04
(0)
PS. Хорошо бы, чтобы подобный механизм был встроен в платформу. Как можно передать эту идею разработчикам?

testplatform@1c.ru
4. Александр Киселёв (Абигоп-НахУрт) 26.04.10 19:02
часть этого уже реализовано на уровне платформы. См. команду ПараметрыВыбора. Причём она работает даже для тех объектов у которых формы списка не созданы. Эти параметры применяются на уровне платформы, нужно только в форме владельце их задать элементу в котором происходит выбор. Только у этого способа есть врождённые недостатки - отборы возможны только на равенство :(.
5. VVV (V_V_V) 27.04.10 14:05
Самое хреновое в 8.2 - это отключенная возможность отборов по Критериям отборов в формах списков документов, как в 8.1. Такой мощный механизм, элементарно настраивался - и убрали...
6. Николай Клементьев (Rusmus) 27.04.10 15:34
(4) Именно отсутствие возможности проверки на равенство и сподвигло к созданию вышеприведенного кода.
7. microlab (microlab) 19.05.10 12:48
При открытии формы выбора не происходит позиционирование на элементе.
8. Николай Клементьев (Rusmus) 20.05.10 13:24
(7) решается добавлением обработчика:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ТипЗнч(ЭтаФорма.ВладелецФормы) = Тип("ПолеВвода") Тогда
Элементы.Список.ТекущаяСтрока = ЭтаФорма.ВладелецФормы.Значение;
КонецЕсли;
КонецПроцедуры
9. microlab (microlab) 21.05.10 02:18
(8) Тип значения "ЭтаФорма.ВладелецФормы" - "ПолеФормы", пока для решения (7) использую "серверную" функцию :(
10. Николай Клементьев (Rusmus) 21.05.10 08:43
(9) извиняюсь. предусмотрел только случай, когда управляемая форма открывается из обычной. Рекомендацию в (8) снимаю.
11. Николай Клементьев (Rusmus) 03.06.10 15:19
То ли в 8.2.11 добавили, то ли я раньше не заметил, но через типовой механизм можно передавать отбор по списку:

Список = Новый СписокЗначений;
Список.Добавить(Значение1);
Список.Добавить(Значение2);

ПараметрыОтбора = Новый Структура("Контрагент", Список);
ПараметрыОткрытия = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаВыбора", ПараметрыОткрытия, Элемент);
tunesoft; klinval; distorshion; Дмитрий Рудаков; doom2good; w-divin; +6 Ответить 2
12. Галя (galyausik1) 16.07.12 13:04
спасибо за полезную информацию!!!
13. Валерий Волошин (VVi3ard) 04.10.12 11:53
в (11) указано более правильное решение, но все эти решения не правильные :)

Потому как при вводе по строке(без открытия формы) все эти отборы и способы не работают, поэтому если нужно реально ограничить список доступных элементов для выбора то либо стандартные "СвязьПараметровВыбора" либо как в 8.1 генерировать список значений программно и назначать его как списоквыбора для поля ввода.
14. Костя С (doom2good) 19.03.13 08:29
Я вижу, что единственный правильный вариант в (11), а если нужно ещё и ограничить список при вводе строки, тогда можно указать связи параметров выбора (не подходит для случая с отбором, например, поле "владелец" "в списке"), или вообще запретить редактирование текста.
Кстати, я считаю, что нельзя жестко фиксировать отбор формы выбора. Нужно оставить пользователю возможность его отключить, так как, скорее всего, программист не всегда может предугадать, что в дальнейшем будет нужно выбрать пользователю. Другими словами, нужно оставить пользователю шанс на "если очень хочется, то можно" (т.е. дать управление в руки пользователя на вой страх и риск), что позволит в будущем обойтись без программирования в случае возникновения исключительной непредвиденной ситуации (если, конечно, такая ситуация не вызовет ошибок).
15. Дмитрий Башинский (bashinsky) 07.06.13 12:07
Для открытия списка документов с отбором я использовал такую конструкцию. Думаю она и для справочника подойдет.

Форма = ОткрытьФорму(“Документ.РасходнаяНакладная.Форма.ФормаСписка”); //Открываем форму списка документов

Отбор = Форма.Список.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”)); //Добавляем отбор
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; //Как будем сравнивать
Отбор.Использование = Истина; // Устанавливаем галку использования
Отбор.ЛевоеЗначение = Список.Отбор.ДоступныеПоляОтбора.Элементы.Найти(“Контрагент”).Поле; //Выбираем по какому реквизиту будем делать отбор
Отбор.ПравоеЗначение = Объект.Контрагент; // И само значение отбора
16. Гость 02.08.13 10:42
(8) - а вот и не подходит)) у параметра "ЭтаФорма.ВладелецФормы" - Поля "Значение" нет... это я про УФ... ровно как и "Тип("ПолеВвода")" в отладчике говорит, что он Тип("ПолеФормы")... я пока новичек, но вроде как это понимаю...
17. komratov (a.komratov) 03.09.13 14:39
Коллеги, а как в форму в качества параметра передать настройки сортировки, которые должны применяться к списку? Я хочу открыть форму выбора, в которой элементы будут отсортированы по определенному реквизиту.
18. Tsaregorodtsev (TSSV) 28.10.13 16:48
(17) komratov, вот пример используемого мной кода для задачи добавления сортировки списка по заданному полю, причем сортировка должна быть обязательно первой. В процедуре "ПриСозданииНаСервере" формы списка:
    Если ПараметрыСеанса.ТекущийПользователь.ДопНастройки_БэкОфисОбрабатыватьИзмененияСтатусовЗаказовКлиентов Тогда
        ПолеКомпоновкиСтатусИзмененНаКОтгрузке = Новый ПолеКомпоновкиДанных("СтатусИзмененНаКОтгрузке");
        ЭлементПорядкаСтатусИзмененНаКОтгрузке = Неопределено;
        Для каждого ЭлементПорядка Из Список.Порядок.Элементы Цикл
            Если ЭлементПорядка.Поле = ПолеКомпоновкиСтатусИзмененНаКОтгрузке Тогда
                ЭлементПорядкаСтатусИзмененНаКОтгрузке = ЭлементПорядка;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если ЭлементПорядкаСтатусИзмененНаКОтгрузке <> Неопределено Тогда
            Список.Порядок.Элементы.Удалить(ЭлементПорядкаСтатусИзмененНаКОтгрузке);
        КонецЕсли;
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке = Список.Порядок.Элементы.Вставить(0,Тип("ЭлементПорядкаКомпоновкиДанных"));
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке.Поле = ПолеКомпоновкиСтатусИзмененНаКОтгрузке;
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке.Использование = Истина;
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
    КонецЕсли;
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа