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