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

21.04.10

Разработка - Работа с интерфейсом

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

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

&НаКлиенте

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

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

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

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

Тогда 

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

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

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

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

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

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

КонецЦикла;

КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61791    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54394    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16694    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10731    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9606    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3662    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12077    1    5    

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

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

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

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

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

ПараметрыОтбора = Новый Структура("Контрагент", Список);
ПараметрыОткрытия = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаВыбора", ПараметрыОткрытия, Элемент);
user712426; adhocprog; gaabora; TuneSoft; klinval; distorshion; Rudakov_D; doom2good; w-divin; +9 Ответить
13. VVi3ard 52 04.10.12 11:53 Сейчас в теме
в (11) указано более правильное решение, но все эти решения не правильные :)

Потому как при вводе по строке(без открытия формы) все эти отборы и способы не работают, поэтому если нужно реально ограничить список доступных элементов для выбора то либо стандартные "СвязьПараметровВыбора" либо как в 8.1 генерировать список значений программно и назначать его как списоквыбора для поля ввода.
AlexBratushka; +1 Ответить
14. doom2good 136 19.03.13 08:29 Сейчас в теме
Я вижу, что единственный правильный вариант в (11), а если нужно ещё и ограничить список при вводе строки, тогда можно указать связи параметров выбора (не подходит для случая с отбором, например, поле "владелец" "в списке"), или вообще запретить редактирование текста.
Кстати, я считаю, что нельзя жестко фиксировать отбор формы выбора. Нужно оставить пользователю возможность его отключить, так как, скорее всего, программист не всегда может предугадать, что в дальнейшем будет нужно выбрать пользователю. Другими словами, нужно оставить пользователю шанс на "если очень хочется, то можно" (т.е. дать управление в руки пользователя на вой страх и риск), что позволит в будущем обойтись без программирования в случае возникновения исключительной непредвиденной ситуации (если, конечно, такая ситуация не вызовет ошибок).
22. Symbiat 25.03.21 14:24 Сейчас в теме
(11)
Список = Новый СписокЗначений;
Список.Добавить(Значение1);
Список.Добавить(Значение2);

ПараметрыОтбора = Новый Структура("Контрагент", Список);
ПараметрыОткрытия = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаВыбора", ПараметрыОткрытия, Элемент);


Добрый день.
Воспользовался вашим советом, делаю все абсолютно по аналогии - накладываю отбор на форму выбора справочника Договоры контрагентов. Получаю ошибку - Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.

Подскажите, в чем м.б. проблема?
12. galyausik1 16.07.12 13:04 Сейчас в теме
спасибо за полезную информацию!!!
15. bashinsky 133 07.06.13 12:07 Сейчас в теме
Для открытия списка документов с отбором я использовал такую конструкцию. Думаю она и для справочника подойдет.

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

Отбор = Форма.Список.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”)); //Добавляем отбор
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; //Как будем сравнивать
Отбор.Использование = Истина; // Устанавливаем галку использования
Отбор.ЛевоеЗначение = Список.Отбор.ДоступныеПоляОтбора.Элементы.Найти(“Контрагент”).Поле; //Выбираем по какому реквизиту будем делать отбор
Отбор.ПравоеЗначение = Объект.Контрагент; // И само значение отбора
websamson; slige; VladimirElohov; +3 Ответить
17. a.komratov 03.09.13 14:39 Сейчас в теме
Коллеги, а как в форму в качества параметра передать настройки сортировки, которые должны применяться к списку? Я хочу открыть форму выбора, в которой элементы будут отсортированы по определенному реквизиту.
18. TSSV 1144 28.10.13 16:48 Сейчас в теме
(17) komratov, вот пример используемого мной кода для задачи добавления сортировки списка по заданному полю, причем сортировка должна быть обязательно первой. В процедуре "ПриСозданииНаСервере" формы списка:
    Если ПараметрыСеанса.ТекущийПользователь.ДопНастройки_БэкОфисОбрабатыватьИзмененияСтатусовЗаказовКлиентов Тогда
        ПолеКомпоновкиСтатусИзмененНаКОтгрузке = Новый ПолеКомпоновкиДанных("СтатусИзмененНаКОтгрузке");
        ЭлементПорядкаСтатусИзмененНаКОтгрузке = Неопределено;
        Для каждого ЭлементПорядка Из Список.Порядок.Элементы Цикл
            Если ЭлементПорядка.Поле = ПолеКомпоновкиСтатусИзмененНаКОтгрузке Тогда
                ЭлементПорядкаСтатусИзмененНаКОтгрузке = ЭлементПорядка;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если ЭлементПорядкаСтатусИзмененНаКОтгрузке <> Неопределено Тогда
            Список.Порядок.Элементы.Удалить(ЭлементПорядкаСтатусИзмененНаКОтгрузке);
        КонецЕсли;
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке = Список.Порядок.Элементы.Вставить(0,Тип("ЭлементПорядкаКомпоновкиДанных"));
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке.Поле = ПолеКомпоновкиСтатусИзмененНаКОтгрузке;
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке.Использование = Истина;
        НовыйЭлементПорядкаЭлементПорядкаСтатусИзмененНаКОтгрузке.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
    КонецЕсли;
Показать
19. motorsoft 3 26.07.17 15:48 Сейчас в теме
Спасибо! Нагло пользуюсь вашим кодом, сейчас возникла необходимость использовать группы условий(например группа или), если я правильно понимаю, мне нужно доработать процедуру НастроитьСписокОтбора()? Может быть поддадите волшебного пендаля, в каком направлении двигать? Заранее спасибо!
20. mikl79 118 31.10.17 14:14 Сейчас в теме
Добрый день. Использование - код я поместил в обработчик НачалоВыбора, но не работает.
ругается:

{Документ.УПДК_РеализацияНедвижимости.Форма.ФормаДокумента.Форма(1971)}: Ошибка при вызове метода контекста (ОткрытьФорму)
ОткрытьФорму("Справочник.УПДК_ВидыПравовыхДокументов.ФормаВыбора", ПараметрыОткрытия);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'val':
форма: Элемент
имя: {http://v8.1c.ru/8.2/mngsrv/ws}val
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}Value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
21. dolter 119 05.06.18 23:45 Сейчас в теме
Что-то много комментариев. Кто-нибудь уже написал про

Форма = ПолучитьФорму(...);
// Настройка формы
...
Форма.Открыть();

??

Просто в таком случае не надо перекурочивать сами формы выбора объектов, а только место вызова...
Оставьте свое сообщение