Почему не срабатывает событие НачалоВыбора на управляемой форме в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

Разберем распространенную ситуацию при доработке типовых конфигураций (таких как 1С:Управление торговлей, 1С:ERP или 1С:Комплексная автоматизация): разработчик назначает процедуру на событие НачалоВыбора для определенного реквизита на форме, на демо-базе функционал успешно тестируется, однако в рабочей или чистой тестовой базе отладчик даже не заходит в обработчик, и форма выбора открывается стандартным образом.

Проанализируем основные причины такого поведения платформы и детально рассмотрим варианты диагностики и исправления ошибки.

1. Дублирующие элементы формы и влияние функциональных опций

В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) состав элементов формы динамически меняется в зависимости от включенных функциональных опций. Например, в зависимости от настроек ведения учета партнеров и контрагентов (совместно или раздельно), на форме документа могут физически присутствовать несколько различных элементов управления, привязанных к одним и тем же или смежным данным (например, Партнер и ПартнерБезКЛ / Контрагент).

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

Разберем по шагам, как выявить и исправить эту проблему:

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

2. Программное переопределение и назначение обработчиков

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

Посмотрим на пример программного назначения обработчика события на клиенте или сервере:


// В контексте управляемой формы
ЭлементФормы = Элементы.Найти("ПартнерБезКЛ");
Если ЭлементФормы <> Неопределено Тогда
    ЭлементФормы.УстановитьДействие("НачалоВыбора", "ПартнерНачалоВыбора");
КонецЕсли;

Обратите внимание, что процедура ПартнерНачалоВыбора на клиенте должна иметь директиву компиляции &НаКлиенте и правильную сигнатуру параметров платформы:


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

3. Влияние расширений конфигурации

Если в информационной базе подключены доработки через механизм расширений, необходимо проверить наличие перехвата событий формы в модулях расширений:

  1. Проанализируем модули расширений, подключенные к документу или справочнику.
  2. Найдем методы с аннотацией &Вместо("ПартнерНачалоВыбора") или аналогичные. Если в расширяющем методе отсутствует вызов ПродолжитьВызов(), то оригинальный обработчик из основной конфигурации никогда не будет вызван.

4. Особенности режима ввода по строке и режима выбора из списка

Событие НачалоВыбора инициируется исключительно при нажатии кнопки выбора (кнопки с многоточием или комбинации клавиш F4). Рассмотрим нюансы поведения платформы, при которых данное событие обходится:

  1. Ввод значения по строке: если пользователь не нажимает кнопку выбора, а начинает набирать текст в поле ввода, событие НачалоВыбора не срабатывает. Вместо него вызываются клиентские события АвтоПодбор, ОкончаниеВводаТекста и серверный обработчик ОбработкаПолученияДанныхВыбора в модуле менеджера объекта.
  2. Свойство «РежимВыбораИзСписка»: если у поля ввода включен данный флаг, нажатие на кнопку выбора открывает фиксированный список значений СписокВыбора, переопределяя стандартную логику вызова формы.

5. Альтернативные способы настройки отборов при выборе

Если назначение обработчика НачалоВыбора требуется только для фильтрации списка выбора, рекомендуется использовать типовые платформенные механизмы без написания дополнительного процедурного кода:

  1. Параметры выбора и Связи параметров выбора: в свойствах реквизита или элемента формы можно настроить отбор по фиксированным значениям или по значениям других реквизитов текущей формы (например, отбор договоров по выбранному контрагенту/организации).
  2. ОбработкаПолученияФормы и ОбработкаПолученияДанныхВыбора: переопределение процедур в модуле менеджера прикладного объекта позволяет централизованно управлять открываемыми формами и фильтрацией данных во всей системе независимо от контекста конкретной формы.
← На главную