1с открыть форму выбора с отбором по реквизиту формы

В данной статье рассмотрены несколько способов программного открытия формы с установленным отбором.
У начинающих разработчиков достаточно часто возникает вопрос – как при открытии формы установить в ней отбор? Чаще всего речь идет о форме списка или форме выбора. Но в общем случае – описанные в статье механизмы можно применять к любым формам, в которых используется динамический список. Ниже – видео версия этой статьи, для тех кому больше нравится видео формат.

Итак, что же это за способы, и чем они отличаются?
Забегая вперед, скажу – с точки зрения пользователей, разные технические решения могут выглядеть и вести себя одинаково. И разница будет только в коде и используемых механизмах платформы. В разных случаях могут понадобиться разные варианты, поэтому ниже я привожу 6 самых распространенных.

Содержание

Использование параметризованной команды для указания отбора

Один из распространенных приемов – создать глобальную параметризуемую команду, и параметр этой команды передать в качестве отбора. В свойствах команды нужно указать тип параметра команды. Можно указать группу “Панель навигации формы”, тогда команда автоматически будет добавляться в командный интерфейс при открытии формы соответствующего объекта.

Параметризованная команда для открытия формы с отбором

Текст команды будет следующий:

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

Ключевой момент здесь – правильно упаковать параметры. Нужно поместить параметр команды в структуру, где ключ структуры будет соответствовать одному из полей отбора динамического списка. В нашем случае – Контрагент. А значение – сам параметр.
И уже эту структуру поместить в структуру ПараметрыФормы (это стандартное название, которое платформа генерирует при добавлении команды, но вы можете использовать любое другое).

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

Параметризуемая команда и передача параметра

Второй вариант – передать параметр команды не в свойство “Отбор”, а в качестве параметра формы. В этом случае платформа не сможет сгенерировать отбор автоматически, и придется добавить немного кода.

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

Здесь нюанс в том, что не обязательно создавать параметр в открываемой форме в конфигураторе. Даже если мы его не добавим на закладке Параметры в редакторе формы, он все равно будет доступен, т.к. мы явным образом его передали в методе ОткрытьФорму.

Получение ссылки через параметры выполнения команды

Бывают ситуации, когда глобальная команда не имеет параметра. Но в некоторых случаях все равно можно получить ссылку. Для этого можно воспользоваться параметрами выполнения команды. Если команда размещена в форме элемента, мы сможем получить ссылку этого элемента через свойство ПараметрыВыполненияКоманды.Источник.Объект.Ссылка

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

Открытие формы с отбором при помощи команды формы

Суть все та же – получаем ссылку, которую хотим использовать в качестве отбора, и передаем в открываемую форму. Как рассмотрено выше, можно поместить либо в отдельный параметр формы, либо в параметр Отбор.

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

Следует понимать, что мы можем передать в свойство “Отбор” структуру с несколькими ключами, на пример, мы хотим отфильтровать документы не только по контрагенту, но и по организации. И важно учитывать, что платформа стыкует передаваемые параметры и поля отбора по именам ключей. Если переданные ключи не будут соответствовать доступным полям отбора, то автоматически платформа фильтр наложить не сможет.

И еще один момент, о котором стоит упомянуть. Нам никто не запрещает передать больше одного параметра при открытии формы. Например, мы хотим отфильтровать документы по контрагенту и по организации, или реализовать какие-то более сложные фильтры.

Отбор при помощи связи параметров выбора

Кроме использования команд, есть и другие способы открыть форму с установленным отбором. Рассмотрим абстрактный пример. В форме контрагента у нас есть реквизит с типом Документ.ПоступлениеТоваров. И мы хотим при подборе документа в это поле, чтобы фильтровались только документы нужного контрагента.

Использование свойства СвязиПараметровВыбора

В свойствах элемента управления (либо в свойствах реквизита объекта, если мы хотим это сделать для всех форм, где доступен этот реквизит) находим СвязиПараметровВыбора, и настраиваем для отбора по текущей ссылке:

Суть работы этого механизма – точно такая же как с использованием параметризованной команды: мы в свойство Отбор.Контрагент помещаем нужную ссылку. Только в одном случае мы это делали через передачу структуры параметров, а в другом – с помощью настроек в конфигураторе.

Отбор при помощи программной установки параметров выбора

Ну и последний способ, которым можно воспользоваться – он более редкий, и его применяют не так часто. Речь пойдет о свойстве ПараметрыВыбора. Это свойство по своему использованию близко к СвязиПараметровВыбора, но цель у него другая. Связи параметров позволяют использовать данные текущей формы – например, текущую ссылку, или какой-то другой реквизит, который в разных формах будет иметь разные значения.
А вот параметры выбора изначально задаются в конфигураторе некоторыми фиксированными значениями. Например, значением предопределенных элементов справочника, значениями перечислений, и т.д. То есть, подразумевается, что они всегда будут одни и те же. Но, разумеется, мы можем их переопределить программно.

Делать это можно в обработчике НачалоВыбора. Например, так:

&НаКлиенте
Процедура ОсновнойДокумент2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	НовыйПараметр = Новый ПараметрВыбора("Отбор.Контрагент", Объект.Ссылка);
	НовыйМассив = Новый Массив();
	НовыйМассив.Добавить(НовыйПараметр);
	НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
	Элементы.ОсновнойДокумент2.ПараметрыВыбора = НовыеПараметры;
	
КонецПроцедуры

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

Итак, мы рассмотрели шесть вариантов открытия формы с отбором в 1С 8. Какие-то проще, какие-то сложнее, но все находят свое применение. Пользуйтесь теми, какие удобнее!

Рассмотрим различные варианты установки отбора при выборе объекта на документе ДокументОтборПриемаТовара. У документа имеются следующие реквизиты (см. рисунок 1):

  • ПоставщикОтбор (тип СправочникСсылка.Поставщики);
  • ТоварОтбор (тип СправочникСсылка.Товары);
  • ОтветственныйОтбор (тип СправочникСсылка.Ответственный);
  • ПриемТовара (тип ДокументСсылка.ПриемТовара).
Рисунок 1. Структура документа ДокументОтборПриемаТовара

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

Документ ПриемТовара имеет реквизиты (см. рисунок 2):

  • Поставщик (тип СправочникСсылка.Поставщики);
  • Ответственный (тип СправочникСсылка.Ответственный);
  • Комментарий (Тип Строка).

А так же табличную часть Товары, состоящую из реквизитов Товар (тип СправочникСсылка.Товары) и Количество (тип Число).

Рисунок 2. Структура документа ПриемТовара

1. Установка отбора в свойствах реквизита объекта метаданных

Самый простой вариант отбора. Нужно всего лишь в свойствах реквизита «Связи параметров выбора»  и «Параметры выбора» задать параметры выбора. Допустим, при выборе документа ПриемТовара, нужно в форме выбора показывать документы отобранные по поставщику и только проведенные. Для этого в связях параметров выбора задаем отбор по поставщику, а в параметрах выбора отбор только проведенных документов (см. рисунок 3).

Рисунок 3. Отбор в свойствах реквизита объекта метаданных

Больше ничего делать не нужно, платформа сама завернет указанные параметры выбора в структуру (см. рисунок 4) и поместит её в параметр Отбор формы выбора, далее, анализируя данный параметр формы, платформа устанавливает отборы для динамического списка.

Рисунок 6. Значение параметра формы выбора Отбор

2. Установка отбора в свойствах элемента формы

Такой же простой вариант как и первый, только те же самые свойства задаются для элемента формы (см. рисунок 5).

Рисунок 5. Отбор в свойствах элемента формы

Свойства элемента формы имеют приоритет над свойствами реквизита объекта.

3. Установка собственного отбора при создании формы выбора на сервере

Усложним задачу и будем производить отбор документов по табличной части, а конкретно по товару в ней. Для этого в связях параметров выбора зададим связь, где параметр будет Товар (прям ручками пишем), а реквизит ТоварОтбор (см. рисунок 6).

Рисунок 6. Связь параметра Товар с реквизитом ТоварОтбор

Именно такую задаем связь, так как более одной точки(.) в колонке Имя при написании параметра мы не можем использовать (платформенное ограничение), то есть написать «Отбор.Товары.Товар» мы не сможем.
Так как имя параметра мы задали вручную, то платформа его не поместит в параметр Отбор формы выбора, поэтому в форме выбора документа ПриемТовара в обработчике события ПриСозданииНаСервере напишем программный код, который будет обрабатывать наш параметр Товар и устанавливать отбор по реквизиту табличной части:

  
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

4. Программная установка параметров выбора

Так как у элемента формы есть свойства СвязиПараметровВыбора и ПараметрыВыбора, и они доступны не только для чтения, но и на запись, то все что описано выше можно выполнить с помощью программного кода. Для этого в форме документа ДокументОтборПриемаТовара в событии ПриСозданииНаСервере напишем код, который будет формировать массив связей параметров и параметров выбора, и устанавливать их в соответствующие свойства элемента формы ПриемТовара, который связан с реквизитом объекта ПриемТовара:

  
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Создаем связи параметров выбора.
МассивСвязей = Новый Массив;
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Поставщик", "Объект.ПоставщикОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Ответственный", "Объект.ОтветственныйОтбор");
МассивСвязей.Добавить(НоваяСвязь);
НоваяСвязь = Новый СвязьПараметраВыбора("Товар", "Объект.ТоварОтбор");
МассивСвязей.Добавить(НоваяСвязь);

// Создаем параметры выбора.
МассивПараметров = Новый Массив;
НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
МассивПараметров.Добавить(НовыйПараметр);

// Устанавливаем связи параметров и параметры выбора для элемента формы.
Элементы.ПриемТовара.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);

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

Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.

5. Установка параметров выбора в момент начала выбора

Этот вариант позволяет «на лету» устанавливать параметры выбора. Усложним задачу и будем устанавливать отбор только по заполненным реквизитам отбора.
В модуле формы документа ДокументОтборПриемаТовара в событии НачалоВыбора для элемента ПриемТовара, который связан с реквизитом объекта ПриемТовара, напишем код, который будет устанавливать параметры выбора в зависимости от заполненности реквизитов отбора:

  
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

МассивПараметров = Новый Массив;
Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Поставщик", Объект.ПоставщикОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Ответственный", Объект.ОтветственныйОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
НовыйПараметр = Новый ПараметрВыбора("Товар", Объект.ТоварОтбор);
МассивПараметров.Добавить(НовыйПараметр);
КонецЕсли;
НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
МассивПараметров.Добавить(НовыйПараметр);
Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);

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

Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.

6. Открытие формы выбора с установленным параметром формы Отбор в момент начала выбора

Данный способ отличается от предыдущего тем, что мы отменяем стандартную обработку события НачалоВыбора, сами формируем параметр формы Отбор, передаем его в открываемую форму выбора с указанием владельца формы, то есть все делаем за платформу. Обратите внимание, что в данном случае нам не нужно обходить ограничение платформы (больше одной точки в имени параметра), что бы установить отбор по товару в табличной части, достаточно указать параметр отбора Товары типа Структура, в котором ключом будет имя колонки «Товар», а значение ссылка на товар.

  
&НаКлиенте
Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Отбор = Новый Структура;
Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
Отбор.Вставить("Поставщик", Объект.ПоставщикОтбор);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
Отбор.Вставить("Ответственный", Объект.ОтветственныйОтбор);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
Отбор.Вставить("Товары", Новый Структура("Товар", Объект.ТоварОтбор));
КонецЕсли;
Отбор.Вставить("Проведен", Истина);
ПараметрыФормы = Новый Структура("Отбор", Отбор);
ОткрытьФорму("Документ.ПриемТовара.ФормаВыбора", ПараметрыФормы, Элемент);

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

Отборы на динамический список платформа наложит сама, писать дополнительно код больше не нужно, как в варианте №3.

А что будет, если отбор в связях параметров выбора и параметры выбора пересекаются?

Как показал мой эксперимент, страшного ничего не случится, платформа установит отбор по связям параметров выбора.

Для открытия формы выбора (справочника, документа и т.п.) необходимо воспользоваться параметрами открываемой формы.

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

Давайте рассмотрим работу механизма на примере: в документе «Поступление товаров» при выборе контрагента необходимо выбирать только поставщиков (отбор будем производить по реквизиту Поставщик типа Булево справочника «Контрагенты»).

Для начала, проверим наличие поля отбора «Поставщик» в настройках отбора динамического списка. Для этого откроем форму выбора справочника «Контрагенты» и перейдем к настройкам динамического списка:Настройка отбора в форме выбора

Мы видим, что поле Поставщик есть среди полей отбора. Значит, наш отбор работать будет (на самом деле, мы можем добавить дополнительные поля в динамический список и использовать их для отбора):

Теперь нам осталось написать только код процедуры, который будет вызывать форму выбора:

ПараметрыОтбора = Новый Структура("Поставщик", Истина);
ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыФормы);

Как видите, ничего сложного нет: мы создаем структуру, имитирующую отбор (ключ структуры — имя поля отбора, а значение — значение отбора), и включаем его в параметры открываемой формы.

Читайте также:

  1. Функция ОткрытьФорму()
  2. Как открыть форму отчета с отбором?

Поделиться страницей в соц.сетях

Форма выбора открывается при нажатии на кнопку выбора у элемента формы. Если требуется наложить отборы на выбираемые значения или открыть другую форму, то необходимо использовать событие элемента формы НачалоВыбора.

Процедура для обычного приложения

Процедура СобытиеНачалоВыбора(Элемент, СтандартнаяОбработка)

СтандартнаяОбработка

= Ложь;

ФормаВыбора

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

ФормаВыбора

.Открыть();КонецПроцедуры

Процедуры для управляемого приложения

Настройка отборов с использованием объекта НастройкиКомпоновкиДанных. Есть возможность задать вид сравнения, доступность элементов отбора для редактирования и т.д.

&НаКлиенте
Процедура СобытиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка

= Ложь;

Настройки

= Новый НастройкиКомпоновкиДанных;

Элемент

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

ПараметрыФормы

= Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);

ОткрытьФорму

("Документ.Документ1.ФормаВыбора", ПараметрыФормы, Элементы.Реквизит1);КонецПроцедуры

Настройка отборов с использованием структуры. Это более простой вариант открытия формы выбора с установленными отборами. В этом варианте некоторые настройки недоступны.

&НаКлиенте
Процедура СобытиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка

= Ложь;

ПараметрыФормы

= Новый Структура;

Отборы

= Новый Структура;
Отборы.Вставить("Реквизит1", "Значение");
Отборы.Вставить("Реквизит2", "Значение");
Отборы.Вставить("Реквизит3", "Значение");

ПараметрыФормы

.Вставить("Отбор", Отборы);

ОткрытьФорму

("Документ.Документ1.ФормаВыбора", ПараметрыФормы, Элементы.Реквизит1);КонецПроцедуры

Как установить отбор в открываемой форме

Содержание[Убрать]

    • Установка отбора в форме при открытии
      • Установка отбора в 8.1 обычное приложение
      • Установка отбора в 8.2, 8.3 тонкий клиент (управляемая форма)
        • Фильтр по одному элементу
        • Как открыть форму выбора с отбором в списке? Как установить выбор групп и элементов?
        • Ещё один вариант открытия формы с отбором в списке для 8.3

Как программно установить отбор в открываемой форме?

Установка отбора в форме при открытии

Установка отбора в 8.1 обычное приложение

Для установки отбора используется свойство «Отбор» у менеджеров списков объектов, например, для открытия списка договоров определенного контрагента можно написать следующий код:

ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора("ФормаВыбора", ЭтаФорма, "ФормаВыбораДоговора");
ФормаВыбора.Отбор.Владелец.Значение = КонтрагентСсылка;
ФормаВыбора.Отбор.Владелец.Использование = ИСТИНА;
ФормаВыбора.ОткрытьМодально();

В данном случае мы применили вид сравнения «Равно«, но не указывали его т.к. оно стоит по умолчанию. Используя разные значения вида сравнения мы значительно расширяем возможности.

Например, у нас в базе контрагент является и продавцом и покупателем, при этом договоры находятся в соответствующей группе внутри справочника. Поэтому мы сделаем отбор не только на самого контрагента, но и на группу «Группа Покупатели» в которой находится договор:


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

ГруппаПокупатели = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Группа Покупатели");
ФормаВыбора.Отбор.Родитель.ВидСравнения = ВидСравнения.ВИерархии;
ФормаВыбора.Отбор.Родитель.Значение = ГруппаПокупатели;
ФормаВыбора.Отбор.Родитель.Использование = ИСТИНА;
ФормаВыбора.ОткрытьМодально();

Установка отбора в 8.2, 8.3 тонкий клиент (управляемая форма)

Фильтр по одному элементу

&НаКлиенте
Процедура СписокДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

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

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

Как открыть форму выбора с отбором в списке? Как установить выбор групп и элементов?

&НаКлиенте
Процедура СписокДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    МассивДоговоров = ПолучитьДоговорыНаСервере();
    СЗДоговоров = Новый СписокЗначений;
    СЗДоговоров.ЗагрузитьЗначения(МассивДоговоров);

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

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

Ещё один вариант открытия формы с отбором в списке для 8.3

Ниже текст процедуры открытия формы для команды объекта 

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

Недостаточно прав для комментирования

Продолжаем разговор о открытие форм различным способом (и с различными целями), предыдущая статья рассказывала о том, как открыть форму с заполнением, а данная статья расскажет о том, ка открыть форму с отбором (форма списка, форма выбора) в обычном и управляемом приложении.

Открытие формы с отбором в обычном приложении

В обычном приложении (я пробовал на платформе 8.2.18.102) я знаю только один способ открытия формы списка или формы выбора с отбором (буду рад увидеть другие варианты), выглядит он примерно так:

нФормаВыбора = Справочники.ТестСправочник.ПолучитьФормуВыбора(, ЭлементыФормы.тестОбъект);

нФормаВыбора.Отбор.ТестРеквизит.ВидСравнения = ВидСравнения.Равно;

нФормаВыбора.Отбор.ТестРеквизит.Значение = «Тест1»;

нФормаВыбора.Отбор.ТестРеквизит.Использование = Истина;

нФормаВыбора.Открыть();

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

Кроме этого, если код открытия формы у Вас размещается в событии «НачалоВыбора», то не забудьте отменить стандартную обработку, а в качестве владельца открывающейся формы можно указать первый параметр события — «Элемент».

Открытие формы с отбором в управляемом приложении

В управляемом приложении я знаю несколько способов открыть форму с отбором. Первый способ простой, но сильно ограничен по возможностям, выглядит он примерно так:

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

ПараметрыОтбора.Вставить(«ТестРеквизит», «Тест1»);

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

ПараметрыФормы.Вставить(«Отбор», ПараметрыОтбора);

ОткрытьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», ПараметрыФормы, Элементы.тестОбъект);

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

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

фиксНастройки = Новый НастройкиКомпоновкиДанных;

эОтбор = фиксНастройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

эОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТестРеквизит»);

эОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;

эОтбор.ПравоеЗначение = «Тест2»;

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

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

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

ПараметрыФормы.Вставить(«ФиксированныеНастройки», фиксНастройки);

ОткрытьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», ПараметрыФормы, Элементы.тестОбъект);

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

нФормаВыбора = ПолучитьФорму(«Справочник.ТестСправочник.Форма.ФормаВыбора», , Элементы.тестОбъект);

эОтбор = нФормаВыбора.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

эОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТестРеквизит»);

эОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;

эОтбор.ПравоеЗначение = «Тест2»;

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

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

нФормаВыбора.Открыть();

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

В заключение отмечу, что я намеренно не использую модальное открытие формы списка/выбора (1С с некоторых пор приказала отказываться от модальности), но если у Вас есть потребность в модальности, то такое, разумеется, тоже возможно.

На этом все, надеюсь данная статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Открытие формы выбора с отбором

Приведен пример открытия формы выбора с отбором по контрагенту и по периоду, как для управляемых форм так и для обычных.

Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 и более ранних версий — также ОткрытьФормуМодально). Применение альтернативного способа, с получением формы и ее последующим открытием с помощью метода ПолучитьФорму, не рекомендуется.
Подробности

Пример 1 (Управляемые формы). Открыть форму выбора документов корректировок реализаций с отбором по полю формы «Контрагент» типа «СправочникСсылка.Контрагенты» и по полю формы «Период» типа «СтандартныйПериод».

Элементы.СписокДокументов — Табличная часть формы, в которой будет отрабатывать событие «ОбработкаВыбора» после того как будут выбраны документы из формы выбора.

&НаКлиенте
Процедура Подбор(Команда)
	
    НастройкиКомпоновки = Новый НастройкиКомпоновкиДанных;

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

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

    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("ФиксированныеНастройки", НастройкиКомпоновки);
    ПараметрыВыбора.Вставить("РежимВыбора",Истина);
    ПараметрыВыбора.Вставить("МножественныйВыбор",Истина);

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

Пример 2 (Обычные формы). Открыть форму выбора документов корректировок реализаций с отбором по полю формы «Контрагент» типа «СправочникСсылка.Контрагенты» и по полю формы «Период» типа «СтандартныйПериод».

ЭлементыФормы.СписокДокументов — Табличная часть формы, в которой будет отрабатывать событие «ОбработкаВыбора» после того как будут выбраны документы из формы выбора.

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

Комментарии

Понравилась статья? Поделить с друзьями:
  • 1с очистить дополнительные реквизиты при копировании
  • 1с расширение добавление реквизита в табличную часть
  • 1с регистр накопления отличие измерения от реквизита
  • 1с скд расположение реквизитов в специальной позиции
  • 1с сортировка табличной части по реквизиту реквизита