Получить консультацию

Как открыть форму с отбором в 1С 8. Шесть способов.

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

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

Содержание

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

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

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

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

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

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

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

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

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

Код модуля команды:

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

Код в открываемой форме:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оставьте комментарий

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

один + восемь =

К НАЧАЛУ