Форма выбора открывается при нажатии на кнопку выбора у элемента формы. Если требуется наложить отборы на выбираемые значения или открыть другую форму, то необходимо использовать событие элемента формы НачалоВыбора.
Процедура для обычного приложения
Процедура СобытиеНачалоВыбора(Элемент, СтандартнаяОбработка) СтандартнаяОбработка
= Ложь; ФормаВыбора
= Документы.Документ1.ПолучитьФормуВыбора(, Элемент);
ФормаВыбора.Отбор.Реквизит1.ВидСравнения = ВидСравнения.Равно;
ФормаВыбора.Отбор.Реквизит1.Значение = "Значение";
ФормаВыбора.Отбор.Реквизит1.Использование = Истина;//Чтобы этот отбор был доступен для изменения
ФормаВыбора.ЭлементыФормы.ДокументСписок.НастройкаОтбора.Реквизит1.Доступность = Истина; ФормаВыбора
.Открыть();КонецПроцедуры
Процедуры для управляемого приложения
Настройка отборов с использованием объекта НастройкиКомпоновкиДанных. Есть возможность задать вид сравнения, доступность элементов отбора для редактирования и т.д.
&НаКлиенте
Процедура СобытиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка
= Ложь; Настройки
= Новый НастройкиКомпоновкиДанных; Элемент
= Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент.Использование = Истина;
Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Реквизит1");
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Элемент.ПравоеЗначение = "Значение";
Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный; ПараметрыФормы
= Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки); ОткрытьФорму
("Документ.Документ1.ФормаВыбора", ПараметрыФормы, Элементы.Реквизит1);КонецПроцедуры
Настройка отборов с использованием структуры. Это более простой вариант открытия формы выбора с установленными отборами. В этом варианте некоторые настройки недоступны.
&НаКлиенте
Процедура СобытиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка
= Ложь; ПараметрыФормы
= Новый Структура; Отборы
= Новый Структура;
Отборы.Вставить("Реквизит1", "Значение");
Отборы.Вставить("Реквизит2", "Значение");
Отборы.Вставить("Реквизит3", "Значение"); ПараметрыФормы
.Вставить("Отбор", Отборы); ОткрытьФорму
("Документ.Документ1.ФормаВыбора", ПараметрыФормы, Элементы.Реквизит1);КонецПроцедуры
В данной статье рассмотрены несколько способов программного открытия формы с установленным отбором.
У начинающих разработчиков достаточно часто возникает вопрос – как при открытии формы установить в ней отбор? Чаще всего речь идет о форме списка или форме выбора. Но в общем случае – описанные в статье механизмы можно применять к любым формам, в которых используется динамический список. Ниже – видео версия этой статьи, для тех кому больше нравится видео формат.
Итак, что же это за способы, и чем они отличаются?
Забегая вперед, скажу – с точки зрения пользователей, разные технические решения могут выглядеть и вести себя одинаково. И разница будет только в коде и используемых механизмах платформы. В разных случаях могут понадобиться разные варианты, поэтому ниже я привожу 6 самых распространенных.
Содержание
Использование параметризованной команды для указания отбора
Один из распространенных приемов – создать глобальную параметризуемую команду, и параметр этой команды передать в качестве отбора. В свойствах команды нужно указать тип параметра команды. Можно указать группу “Панель навигации формы”, тогда команда автоматически будет добавляться в командный интерфейс при открытии формы соответствующего объекта.
Текст команды будет следующий:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОтборПоКонтрагенту = Новый Структура("Контрагент", ПараметрКоманды);
ПараметрыФормы = Новый Структура("Отбор", ОтборПоКонтрагенту);
ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Ключевой момент здесь – правильно упаковать параметры. Нужно поместить параметр команды в структуру, где ключ структуры будет соответствовать одному из полей отбора динамического списка. В нашем случае – Контрагент. А значение – сам параметр.
И уже эту структуру поместить в структуру ПараметрыФормы (это стандартное название, которое платформа генерирует при добавлении команды, но вы можете использовать любое другое).
Трюк в том, что у формы с основным реквизитом – динамическим списком платформа добавляет параметр Отбор, и на основании содержимого этого параметра, при открытии формы накладывает отбор динамического списка. Поэтому никакого кода дополнительно писать не надо – платформа все сделает за нас.
Параметризуемая команда и передача параметра
Второй вариант – передать параметр команды не в свойство “Отбор”, а в качестве параметра формы. В этом случае платформа не сможет сгенерировать отбор автоматически, и придется добавить немного кода.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы= Новый Структура("Контрагент", ПараметрКоманды);
ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Список.Отбор.Элементы.Очистить();
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Параметры.Контрагент;
КонецПроцедуры
Здесь нюанс в том, что не обязательно создавать параметр в открываемой форме в конфигураторе. Даже если мы его не добавим на закладке Параметры в редакторе формы, он все равно будет доступен, т.к. мы явным образом его передали в методе ОткрытьФорму.
Получение ссылки через параметры выполнения команды
Бывают ситуации, когда глобальная команда не имеет параметра. Но в некоторых случаях все равно можно получить ссылку. Для этого можно воспользоваться параметрами выполнения команды. Если команда размещена в форме элемента, мы сможем получить ссылку этого элемента через свойство ПараметрыВыполненияКоманды.Источник.Объект.Ссылка
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОтборПоКонтрагенту = Новый Структура("Контрагент", ПараметрыВыполненияКоманды.Источник.Объект.Ссылка);
ПараметрыФормы = Новый Структура("Отбор", ОтборПоКонтрагенту);
ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Открытие формы с отбором при помощи команды формы
Суть все та же – получаем ссылку, которую хотим использовать в качестве отбора, и передаем в открываемую форму. Как рассмотрено выше, можно поместить либо в отдельный параметр формы, либо в параметр Отбор.
&НаКлиенте
Процедура ВыбратьДокумент(Команда)
ПараметрыФормы = Новый Структура("Контрагент", Объект.Ссылка);
ОткрытьФорму("Документ.ПоступленияТоваров.Форма.ФормаВыбораПоКнопке", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
Следует понимать, что мы можем передать в свойство “Отбор” структуру с несколькими ключами, на пример, мы хотим отфильтровать документы не только по контрагенту, но и по организации. И важно учитывать, что платформа стыкует передаваемые параметры и поля отбора по именам ключей. Если переданные ключи не будут соответствовать доступным полям отбора, то автоматически платформа фильтр наложить не сможет.
И еще один момент, о котором стоит упомянуть. Нам никто не запрещает передать больше одного параметра при открытии формы. Например, мы хотим отфильтровать документы по контрагенту и по организации, или реализовать какие-то более сложные фильтры.
Отбор при помощи связи параметров выбора
Кроме использования команд, есть и другие способы открыть форму с установленным отбором. Рассмотрим абстрактный пример. В форме контрагента у нас есть реквизит с типом Документ.ПоступлениеТоваров. И мы хотим при подборе документа в это поле, чтобы фильтровались только документы нужного контрагента.
В свойствах элемента управления (либо в свойствах реквизита объекта, если мы хотим это сделать для всех форм, где доступен этот реквизит) находим СвязиПараметровВыбора, и настраиваем для отбора по текущей ссылке:
Суть работы этого механизма – точно такая же как с использованием параметризованной команды: мы в свойство Отбор.Контрагент помещаем нужную ссылку. Только в одном случае мы это делали через передачу структуры параметров, а в другом – с помощью настроек в конфигураторе.
Отбор при помощи программной установки параметров выбора
Ну и последний способ, которым можно воспользоваться – он более редкий, и его применяют не так часто. Речь пойдет о свойстве ПараметрыВыбора. Это свойство по своему использованию близко к СвязиПараметровВыбора, но цель у него другая. Связи параметров позволяют использовать данные текущей формы – например, текущую ссылку, или какой-то другой реквизит, который в разных формах будет иметь разные значения.
А вот параметры выбора изначально задаются в конфигураторе некоторыми фиксированными значениями. Например, значением предопределенных элементов справочника, значениями перечислений, и т.д. То есть, подразумевается, что они всегда будут одни и те же. Но, разумеется, мы можем их переопределить программно.
Делать это можно в обработчике НачалоВыбора. Например, так:
&НаКлиенте
Процедура ОсновнойДокумент2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
НовыйПараметр = Новый ПараметрВыбора("Отбор.Контрагент", Объект.Ссылка);
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НовыйПараметр);
НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
Элементы.ОсновнойДокумент2.ПараметрыВыбора = НовыеПараметры;
КонецПроцедуры
Обратите внимание, что нам необходимо упаковать ссылку в фиксированный массив, и уже этот фиксированный массив присвоить свойству ПараметрыВыбора. В результате этих манипуляций, при открытии формы выбора точно также будет наложен нужный отбор.
Итак, мы рассмотрели шесть вариантов открытия формы с отбором в 1С 8. Какие-то проще, какие-то сложнее, но все находят свое применение. Пользуйтесь теми, какие удобнее!
Содержание:
1. Как открыть форму списка с отбором
2. Перемещение условия по отбору в запрос
Приветствую, коллеги! В данной статье я расскажу, как работать с отбором в обычных формах списка в системе 1С:Предприятие 8.3. Мы рассмотрим как программные решения, так и решения при помощи автоматизации системы. Также будет дана инструкция по запуску формы списка с отбором.
1. Как открыть форму списка с отбором
Существуют различные варианты в системе 1С для открытия и работы с формами списка, которые содержат какой-то, установленный раннее, отбор. Рассмотрим все способы.
Первый, наиболее очевидный способ открыть форму списка с отбором – отметить специальный параметр «Отбор» внутри формы. После этого необходимо запустить данную форму списка, учитывая параметр. Сам параметр «Отбор» является структурой. Исходя из представления структуры, можно сделать вывод, что наименования элементов и наименования полей будут иметь однозначное соответствие. Как раз основываясь на данном соответствии и будет происходить отбор, а внутри самих значений находятся и значения по отбору. Параметр «Отбор» является расширением внутри формы, которой можно управлять, и которая принадлежит динамическому списку. То есть, параметр может существовать только для тех форм, которые в основном реквизите содержат тот реквизит, который имеет тип «Динамический список». Примером подобных форм являются формы со списком и формы с выбором.
Во время запуска формы списка в 1С 8 отбор будет осуществлён по конкретному полю, которое было избрано. В примере кода ниже показано, как открыть список с приходными накладными, которые имеют отбор в поле «Номер», для примера было взят номер «333»:
Рис. 1 Пример отбора в форме списка в 1С
Следующий вариант открытия формы, а в последствии и работы с ней, – код, который используется без параметров:
Рис. 2 Вариант открытия формы списка в 1С 8
Далее внутри обработчика по событиям внутри формы списка с приходными накладными «ПриСозданииНаСервере» нужно прописать программный код, который будет осуществлять отбор обычной формы по динамическому перечню, который представляет главный реквизит внутри формы, как показано на скриншоте примера ниже:
Рис. 3 Отбор обычной формы по динамическому перечню
Преимущество этого способа состоит в том, что «ВидСравнения» внутри отбора обычной формы в 1С можно создать не только вида «Равно», как было представлено в способе выше, но и вида «Меньше» или «Больше».
Также стоит отметить, что в данном методе есть большой минус: при помощи такого отбора обычная форма будет открыта в любом случае, не важно, откуда она была вызвана. Так что форму, которая будет вызываться данным способом, лучше не назначать в виде основной формы. В случае, если она была создана основной, то до начала отбора нужно произвести анализ того, как и откуда будет запускаться эта форма. Такой анализ может быть создан по параметрам в форме.
2. Перемещение условия по отбору в запрос
Рассмотрим помещение основного условия по отбору в запрос, который будет избирать данные в динамический список. Как пример, необходимо запустить перечень приходных накладных, внутри данной документации есть номенклатура, которая будет выделена во всём общем списке. Внутри самой формы списка при отборе в 1С нужно создать специальную команду и кнопку, которая будет отвечать за неё – «Приходные накладные».
Рис. 4 Перемещение основного условия по отбору в запрос
Далее обработчик, который будет исполнять команду по кнопке, стоит прописать, как показано на скриншоте примера кода:
Рис. 5 Обработчик реализации перемещения основного условия по отбору в запрос
Внутри данного обработчика всё работает так, что в итоге мы выведем форму списка в 1С с приходными накладными, после чего данный список передаётся в параметр формы «ФильтрПоТовару», а также в него передаётся ссылка выбранного элемента внутри перечня с номенклатурой, после чего можно открыть форму с данным параметром.
Далее можно создать специальную форму списка с документами «ПриходнаяНакладная», где необходимо прописать реквизит для формы «ФильтрПоТовару», который будет использован в виде параметра в форме во время её запуска. Далее запускаем свойства для главного реквизита внутри формы «Список». После нужно отметить «галочкой» пункт «ПроизвольныйЗапрос» и внутри строки «Настройка списка» кликаем на «Открыть». Свойства по реквизиту и действия внутри данной панели указаны на скриншоте ниже:
Рис. 6 Работа с формой списка с документами
Внутри поля «Запрос» нужно прописать следующий запрос, который указан ниже:
Рис. 7 Запрос для формы списка с документами
Обратите внимание, что в запросе был использован параметр «Товар». В данный параметр и будет передана ссылка для текущей строки внутри списка с номенклатурой, которая находится внутри параметра формы списка с приходными накладными «ФильтрПоТовару». Далее, чтобы осуществить вышеописанное действие, внутри обработчика событий формы списка «ПриОткрытии» нужно прописать код установки значения параметра для запроса «Товар»:
Рис. 8 Код в обработчике событий формы списка 1С 8
Рассмотри вышеуказанный программный код. В нём «Список.Параметры» является перечнем всех возможных параметров в запросе для динамического списка в реквизите «Список». Параметр «Товар» будет иметь то же значение, что и значение у параметра внутри формы «ФильтрПоТовару».
В результате, кликнув на «Приходные накладные», внутри формы списка в1С 8 по номенклатуре мы получим конкретный перечень приходных накладных, для которых будет указана номенклатура, которая в текущее время также выбрана внутри списка с номенклатурой.
В данной статье были представлены три возможных различных метода для открытия обычных форм с отбором, и, в последствии, работа с формами списка. Для каждого из способов были описаны все нюансы, дана инструкция и представлены преимущества и недостатки каждого.
Специалист компании «Кодерлайн»
Анна Лисовая
Как установить отбор в открываемой форме
Содержание[Убрать]
-
- Установка отбора в форме при открытии
- Установка отбора в 8.1 обычное приложение
- Установка отбора в 8.2, 8.3 тонкий клиент (управляемая форма)
- Фильтр по одному элементу
- Как открыть форму выбора с отбором в списке? Как установить выбор групп и элементов?
- Ещё один вариант открытия формы с отбором в списке для 8.3
- Установка отбора в форме при открытии
Как программно установить отбор в открываемой форме?
Установка отбора в форме при открытии
Установка отбора в 8.1 обычное приложение
Для установки отбора используется свойство «Отбор» у менеджеров списков объектов, например, для открытия списка договоров определенного контрагента можно написать следующий код:
ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора("ФормаВыбора", ЭтаФорма, "ФормаВыбораДоговора");
ФормаВыбора.Отбор.Владелец.Значение = КонтрагентСсылка;
ФормаВыбора.Отбор.Владелец.Использование = ИСТИНА;
ФормаВыбора.ОткрытьМодально();
В данном случае мы применили вид сравнения «Равно«, но не указывали его т.к. оно стоит по умолчанию. Используя разные значения вида сравнения мы значительно расширяем возможности.
Например, у нас в базе контрагент является и продавцом и покупателем, при этом договоры находятся в соответствующей группе внутри справочника. Поэтому мы сделаем отбор не только на самого контрагента, но и на группу «Группа Покупатели» в которой находится договор:
ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора("ФормаВыбора", ЭтаФорма, "ФормаВыбораДоговора");
ФормаВыбора.Отбор.Владелец.Значение = КонтрагентСсылка;
ФормаВыбора.Отбор.Владелец.Использование = ИСТИНА;
ГруппаПокупатели = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Группа Покупатели");
ФормаВыбора.Отбор.Родитель.ВидСравнения = ВидСравнения.ВИерархии;
ФормаВыбора.Отбор.Родитель.Значение = ГруппаПокупатели;
ФормаВыбора.Отбор.Родитель.Использование = ИСТИНА;
ФормаВыбора.ОткрытьМодально();
Установка отбора в 8.2, 8.3 тонкий клиент (управляемая форма)
Фильтр по одному элементу
&НаКлиенте
Процедура СписокДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ЗначениеОтбора = Новый Структура("Владелец", Элементы.Список.ТекущиеДанные.Контрагент);
ПараметрыВыбора = Новый Структура("Отбор", ЗначениеОтбора);
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора",ПараметрыВыбора, Элемент); // здесь передан Элемент, чтобы выбранное значение попало в поле
КонецПроцедуры
Как открыть форму выбора с отбором в списке? Как установить выбор групп и элементов?
&НаКлиенте
Процедура СписокДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
МассивДоговоров = ПолучитьДоговорыНаСервере();
СЗДоговоров = Новый СписокЗначений;
СЗДоговоров.ЗагрузитьЗначения(МассивДоговоров);
НастройкиКомп = Новый НастройкиКомпоновкиДанных;
ОтборСписка = НастройкиКомп.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборСписка.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ОтборСписка.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ОтборСписка.ПравоеЗначение = СЗДоговоров;
ОтборСписка.Использование = Истина;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", НастройкиКомп);
ПараметрыФормы.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.ГруппыИЭлементы); // Здесь устанавливается возможность выбора не только элементов, но групп
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.Форма.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Ещё один вариант открытия формы с отбором в списке для 8.3
Ниже текст процедуры открытия формы для команды объекта
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
СписокПокупателей = ПолучитьСписокПокупателей();
Отбор = Новый Структура;
Отбор.Вставить("Ссылка", СписокПокупателей );
ПараметрыФормы.Вставить("Отбор", Отбор);
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Недостаточно прав для комментирования
На днях получил задание реализовать поиск документа по контрагенту, указанному в нем. Все было бы элементарно просто, но структура документа была не совсем обычна. Документ регистрирует продажу долга контрагентов сторонней организации, при этом одним документом может продаваться сразу несколько долгов. Поэтому в документе есть табличная часть, состоящая из двух колонок: Контрагент и СуммаДолга.
Список документов представлен управляемой формой и динамическим списком на ней. И конечно стандартный инструмент Настройка списка дает возможность проводить отбор только по реквизитам документа, но не по реквизитам табличной части.
Рассмотрим причину возникновения этой проблемы. Дело в том, что формирование динамического списка происходит на основе запроса. Этот запрос может быть сформирован как вручную, так и автоматически, если мы указываем Основную таблицу динамического списка. Когда мы создаем форму списка по умолчанию применяется второй способ — автоматическое формирование запроса. При этом в выбираемые поля запроса попадают все реквизиты документа и табличные части. И именно по этим полям потом можно делать отбор. Но табличные части попадают в поле запроса целиком, поэтому сделать отбор по конкретному реквизиту табличной части невозможно.
Решением проблемы может быть изменение стандартного автоматически формируемого запроса. Для этого нужно выполнить следующие действия:
- В свойствах реквизита Список на управляемой форме установим флаг Произвольного запроса и перейдем в Настройку списка. Для наглядности для появившегося запроса можно открыть конструктор запросов.
- В конструкторе запросов необходимо убрать из полей выборки все табличне части. Вместо этого добавим табличную часть, по реквизиту которой необходимо делать отбор, в источники запроса (таблицы).
- Далее левым соединением соединяем табличные части с самим документом.
- И делаем группировку по всем полям (хотя можно и использовать ВЫБРАТЬ РАЗЛИЧНЫЕ).
- На вкладке Компановка данных — Таблицы снимаем флаг Обязательно для табличной части. Это нужно для того, чтобы соединение выполнялось не всегда, а только если используется отбор. Таким образом экономятся ресурсы и ускоряется работа конфигурации.
На вкладке Компановка данных — Условия создаем необходимые условия отбора по необходимым реквизитам табличной части.
- Сохраняем запрос и переходим на вкладку Настройка. Там можно сразу добавить необходимые условия отбора, чтобы пользователям самим не приходилось каждый раз выбирать поля. Не забудьте снять флаги с полей отбора, иначе при открытии формы списка условие отбора будет сразу применено.