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

21.04.10

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

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

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

&НаКлиенте

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

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

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

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

Тогда 

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

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

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

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

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

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

КонецЦикла;

КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

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

5000 руб.

14.01.2016    55437    17    23    

43

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

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

6000 руб.

16.01.2015    63827    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    19719    28    6    

44

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    21833    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

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

27.05.2024    10945    smielka    37    

105

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

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

27.12.2023    17957    1225    elcoan    53    

125

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    12656    167    acces969    31    

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

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

> НастройкаОтбораПоВладельцам.Вставить("ПравоеЗначение" , СписокКонтрагентов);
СписокКонтрагентов - тип = СписокЗначений
3. BigB 193 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 145 19.03.13 08:29 Сейчас в теме
Я вижу, что единственный правильный вариант в (11), а если нужно ещё и ограничить список при вводе строки, тогда можно указать связи параметров выбора (не подходит для случая с отбором, например, поле "владелец" "в списке"), или вообще запретить редактирование текста.
Кстати, я считаю, что нельзя жестко фиксировать отбор формы выбора. Нужно оставить пользователю возможность его отключить, так как, скорее всего, программист не всегда может предугадать, что в дальнейшем будет нужно выбрать пользователю. Другими словами, нужно оставить пользователю шанс на "если очень хочется, то можно" (т.е. дать управление в руки пользователя на вой страх и риск), что позволит в будущем обойтись без программирования в случае возникновения исключительной непредвиденной ситуации (если, конечно, такая ситуация не вызовет ошибок).
22. Symbiat 25.03.21 14:24 Сейчас в теме
(11)
Список = Новый СписокЗначений;
Список.Добавить(Значение1);
Список.Добавить(Значение2);

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


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

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

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

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

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

??

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