При разработке форм в некоторых случаях возникает необходимость переопределения выбора в полях ввода. Это может использоваться, например, для того, чтобы вызвать для выбора специфическую форму, или в стандартной форме установить какие-либо специфические настройки.
Переопределение выбора выполняется в обработчиках событий поля ввода. Переопределение начала выбора выполняется в обработчике события НачалоВыбора(), а переопределение обработки выбора сделанного пользователем выполняется в обработчике события ОбработкаВыбора(). При этом разработчик в этих событиях реализует на встроенном языке те действия, которые выполняет система при стандартной обработке события. В большинстве случаев разработчик опирается на стандартные принципы взаимодействия между формами. Соответственно нет необходимости обязательно переопределять оба события. Например, если необходимо просто подключить для выбора специфическую форму, то достаточно переопределить событие НачалоВыбора(), а обработка выбора будет выполняться автоматически.
Пример переопределения выбора в поле ввода приведен в демонстрационной конфигурации "Примеры ИТС". В качестве примера, демонстрирующего переопределение выбора, в приходной накладной для поля ввода Контрагент реализован выбор из справочника с автоматическим открытием группы, соответствующей группе последнего выбранного контрагента.
В обработчике КонтрагентНачалоВыбора() у менеджера справочника получается основная форма выбора данного справочника. При получении ей передается элемент управления (поле ввода) в качестве владельца формы. Это необходимо, для того чтобы форма выбора оповещала о выборе непосредственно поле ввода. Далее для полученной формы устанавливается значение свойства ПараметрВыборГруппИЭлементов. Это свойство предоставляется расширением формы списка справочника. Далее если контрагент еще не выбран, устанавливается значение реквизита НачальныйТекущийРодитель в соответствие с ранее сохраненным значением. Реквизит НачальныйТекущийРодитель формы добавлен в форму выбора справочника Контрагенты для обеспечения возможности установки начального значения текущего родителя. Если контрагент уже выбран, то начальное значение родителя не устанавливается, но устанавливается значение свойства ПараметрТекущаяСтрока, предоставляемого также расширением формы списка справочника. Это обеспечивает установку в открываемой форме курсора на уже выбранный элемент. Далее выполняется открытие формы и отмена стандартной обработки события, так как все необходимые действия сделаны в обработчике.
В данном примере используется метод менеджера справочника ПолучитьФормуВыбора(), поэтому нет необходимости устанавливать свойство формы РежимВыбора, так как при выполнении этого метода данному свойству автоматически будет установлено значение Истина. Если использовать другой метод для получения формы, то для организации выбора необходимо установить значение свойства РежимВыбора.
Таким образом, установка различных свойств открываемой формы обеспечивает реализацию стандартного взаимодействия между формами, принятого в системе, и позволяет работать с формой выбора без использования знаний о том, какие в ней имеются элементы управления. А введение реквизита НачальныйТекущийРодитель является дополнительной механикой взаимодействия, реализованной в конфигурации, которая также может быть использована при выборе контрагента в любых формах.
Следует заметить, что использование реквизита НачальныйТекущийРодитель является более правильным, чем непосредственная установка из модуля формы документа для табличного поля открываемой формы свойства ТекущийРодитель, так как это обеспечивает независимость использования формы от ее внутреннего устройства.
В обработчике КонтрагентОбработкаВыбора() выполняется только сохранение родителя выбранного значения. Стандартная обработка при этом не отменяется, и собственно присвоение реквизиту документа выбранного значения выполняется автоматически.
Разумеется, на практике можно реализовывать и более сложные варианты переопределения выбора в поле ввода. Например, в качестве выбираемого значения может выступать не ссылка на элемент справочника, а другое значение, которое будет анализироваться в обработчике ОбработкаВыбора(), и уже на основании него будет устанавливаться собственно значение реквизита документа. Однако при реализации таких решений следует учитывать, что форма выбора используется в самых различных местах конфигурации, и нужно либо изменять ее поведение так, чтобы это не сказалось на работе других форм конфигурации, либо использовать в конкретном случае другую (не основную) форму выбора.