О кнопках выбора (в смысле "педалек" у реквизитов),
Все знают, что наличие таких педалек устанавливается в свойствах реквизита, на закладке "Дополнительно", галкой "Имеет кнопку выбора" (внизу-справа). У реквизитов т.н. агрегатного типа (Справочник,Документ, итп) эта педалька устанавливается движком автоматически (и не может быть снята) - но сейчас не об этом.
1. У реквизитов примитивных типов (в частности, у строк) эта педальта тоже может быть установлена. И тогда, например, можно в процедуре формы "ПриНачалеВыбораЗначения" нажатие на эту педальку поймать, и закодировать какой-нибудь процесс выбора значения с последующей установкой в реквизит значения, вычисленного по выполненному выбору. Если для выбора будет открыта какая-то форма (с помощью "ОткрытьФорму") - то она откроется в режиме выбора(!), а выбранное значение попадет в по окончании выбора в процедуру "ОбработкаВыбораЗначения" (в ее первый параметр), и в этой процедуре переменную, указанную в первом параметре, можно пере-назначить как будда на душу положит - если при этом не обнулять значение третьего параметра этой процедуры (т.н. "флаг стандартной обработки") - то в реквизит будет установлено именно вот таким образом "переиначенный" в этой процедуре первый параметрр (изначально содержащий выбранное значение)!
В качестве небезынтересного примера.
Создайте внешнюю обработку с единственным реквизитом "ВыбКонтрагентНаим" типа "строка неограниченной длины", добавьте в этот реквизит педальку (см.выше как). А в модуле - вот такой код:
Процедура ПриНачалеВыбораЗначения(НаимРекв,ФСО) //предопределенная
Если НаимРекв="ВыбКонтрагентНаим" Тогда
ОткрытьФорму("Справочник.Контрагенты");//ну или любой другой, который есть в конфигурации
КонецЕсли;
КонецПроцедуры //ПриНачалеВыбораЗначения
//------------------------------------------------------------------------------
Процедура ОбработкаВыбораЗначения(ВыбЗнач,НаимРекв,ФСО) //предопределенная
Если НаимРекв="ВыбКонтрагентНаим" Тогда
ВыбЗнач=ВыбЗнач.ПолноеНаименование();
КонецЕсли;
КонецПроцедуры //ОбработкаВыбораЗначения
//==============================================================================
Сохраните и попробуйте в предприятии понажимать на педальку.
Поиграться... Например, добавить на эту же форму, например, реквизит "ВыбКонтрагент", а в "ОбработкаВыбораЗначения" (см.выще) перед "КонецЕсли;" добавить строку "Если НаимРекв="ВыбКонтрагент" Тогда Если Вопрос("А может всунем Родителя?","Да+Нет+Отмена",12)="Да" Тогда ВыбЗнач=ВыбЗнач.Родитель КонецЕсли;"
2. Теперь о педальке и выборе. В приложенном выше варианте - убираем педальку (отключаем галку "Имеет кнопку выбора" в свойствах текстового реквизита). И - снова открываем (если была открыта до сохранения - пере-открываем!) эту обработку. И - вспоминаем о том, что для выбора значения в реквизит можно использовать хот-кей F4 - и, став в этот текстовый реквизит, не обращая внимания на отсутствие педальки, смело жмём F4 - что получилось? Ага, всё верно, движок 1с при нажатии на любом(!) реквизите (хоть с педалькой выбора, хоть без неё!) хот-кея F4 выполняет предопределенную процедуру ПриНачалеВыбораЗначения модуля формы. Что иногда может пригодиться - для экономии места на форме (не расставляя педальки на реквизиты, для которых нужно организовывать выбор(!) значения с его преобразованием перед занесением в сам реквизит).
3. Иногда бывает нужным выбирать, например, для реквизита сначала элемент из справочника, показывая при этом не весь справочник. Или просто открывать для выбора какую-то не предназначенную для выбора "кем угодно" специальную форму выбора, не предназначенную в конфигурации явно для выбора значения какого-то типа+вида. Или вообще - выбирать из списка в виде ТЗ, размещенной на форме обработки, или даже - о, будда! - выбирать значение из формы документа! В таких случаях может пригодиться прием "подмена формы выбора". Для этого в ПриНачалеВыбораЗначения необходимо обнулить флаг стандартной обработки (что отменит открытие для выбора значения формы списка, предназначенной "по умолчанию" для выбора в конфигурации) и - аналогично приведенному выше примеру - открыть любую другую форму. При этом, тут же, сразу после "ОткрытьФорму" в переменной, указанной соответствующем параметре, можно получить контекст(!!!) открытой формы (сразу после того, как в открываемой форме отработает предопределенная процедура "ПриОткрытии") - и через этот самый полученный контекст можно много чего с этой формой налопатить, через точку обращаясь к реквизитам формы, к самой форме и к методам формы и реквизитов! например, если для выбора открыта форма списка справочника - можно в ней принудительно установить отбор, отключить/включить режим иерархического отображения, наложить фильтр с помощью "<ПеремКонтекст>.ИспользоватьСписокЭлементов(..)", ограничить виды отборов, открыть только нужного родителя, и т.д. - тут, как говорится, надо "играться"...
прим.: в открываемых формах режим выбора - т.е. открыта форма (любая!) для выбора или нет - можно определить с помощью "Форма.РежимВыбора()" (см.синтакс-помощник), а выполнить выбор по нажатию на кнопку - можно конкретизировать выбираемое значение, используя в формуле кнопки (или в процедуры, вызываемой по формуле кнопки) "Форма.ВыполнитьВыбор(<ЧтоИменноНадоВернуть>)".