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