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