Каталог решений - Форма выбора для реквизита с составным типом данных

Форма выбора для реквизита с составным типом данных

Форма выбора для реквизита с составным типом данных

В наличии

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

Категория:

Описание

У документа есть реквизит ДокументОснование, который имеет составной тип данных. Этот реквизит заполняется автоматически при вводе на основании и вручную. Все было хорошо, пока данный реквизит отображался на форме в виде поля ввода, однако, начальство поставило задачу: должна быть галка рядом, а реквизит должен быть в виде надписи-гиперссылки (ну, как в документе реализации в УТ 11.4, см. скриншот).

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

Естественно, рисовать форму выбора самостоятельно очень не хотелось, да и погуглив, сразу получить ответа на данный вопрос не вышло. Вот и пришлось придумывать собственное решение.

Для наглядности, создал внешнюю обработку, добавил ей форму. Добавил реквизиты ВводНаОсновании с типом Булево и ДокументОснование с составным типом данных: ДокументСсылка.РеализацияТоваровУслуг, ДокументСсылка.ЗаказКлиента. Драг-дроп их на форму. ДокументОснование должен быть надписью-гиперссылкой, соответственно, внеся корректировки, получилось следующее:

Добавляем обработчик события ПриИзменении для нашей галочки:

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

	// если пользователь снимает галочку, то очищаем поле	
	Иначе
		ДокументОснование = Неопределено;
	КонецЕсли;
КонецПроцедуры

Как можно заметить, используется метод ПоказатьВыборЭлемента (доступен с версии платформы 8.3.3). Данный метод необходимо использовать вместо метода ВыбратьЭлемент, если РежимИспользованияМодальности для конфигурации установлен в НеИспользуется. Добавляем обработчик (обязательно должен быть экспортный):

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

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

&НаКлиенте
Процедура ОписаниеЗакрытияФормыВыбора(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	// если пользователь просто закрыл форму, ничего не выбрав
	Если РезультатЗакрытия = Неопределено Тогда
		ВводНаОсновании = Ложь;
	КонецЕсли;	
	
	ДокументОснование = РезультатЗакрытия;
	
	// а тут может начаться алгоритм заполнения документа на основании
КонецПроцедуры

В итоге получилось следующее:

Выбор типа документа

Выбор самого документа с типовой формой выбора:

Результат:

Ни на что не претендую, т.к. делюсь лишь тем, как решил такую задачу сам, не найдя помощи у гугла. Надеюсь, статья поможет ещё кому-нибудь, да и мне пригодится в качестве шпаргалки на будущее.

has been added to your cart:
Оформление заказа