Почему после выбора элемента из СпискаЗначений появляется окно с предупреждением и как его убрать?

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

При разработке интерфейсов управляемых форм в 1С:Предприятии часто требуется предоставить пользователю возможность выбора значения из динамически сформированного перечня. Нередко для этой цели используется интерактивный выбор через СписокЗначений по клику на гиперссылку или надпись формы. Однако разработчики могут столкнуться с ситуацией, когда сразу после завершения выбора элемента на экране появляется системное окно-предупреждение с выбранным значением или навигационной ссылкой.

В этой статье мы разберем причину такого поведения платформы, рассмотрим исправление ошибки в обработчике события, а также изучим современные подходы к выбору значений без модальных окон.

Выясним причину появления предупреждения

Проанализируем типовую ситуацию, когда выбор запускается в обработчике события Нажатие элемента формы (например, декорации или поля надписи в виде гиперссылки):


&НаКлиенте
Процедура РегионНажатие(Элемент, СтандартнаяОбработка)
    
    СписокРегионов = Новый СписокЗначений;
    СписокРегионов = ПолучитьСписокРегионов(СписокРегионов);
    
    ВыбранныйРегион = СписокРегионов.ВыбратьЭлемент("Выберите регион для поиска");
    Если ВыбранныйРегион <> Неопределено Тогда
        РегионПредставление = ВыбранныйРегион.Представление;
        РегионДляПоиска = ВыбранныйРегион.Значение;
    КонецЕсли; 
    
КонецПроцедуры

По умолчанию в сигнатуре события Нажатие параметр СтандартнаяОбработка имеет значение Истина. Это означает, что после выполнения пользовательского кода платформа приступает к стандартному действию для данного элемента управления:

  1. Для гиперссылок платформа пытается выполнить переход по навигационной ссылке.
  2. Если навигационная ссылка не задана или не является стандартным URL, платформа выводит модальное или блокирующее окно сообщения с содержимым элемента или предупреждением о невозможности перехода.

Таким образом, окно предупреждения вызывается не самим списком значений, а стандартным обработчиком нажатия элемента формы, который срабатывает сразу после выхода из процедуры.

Основное решение: отключение стандартной обработки

Чтобы подавить стандартное поведение платформы и предотвратить открытие нежелательного диалога, необходимо явно установить параметр СтандартнаяОбработка = Ложь; в теле процедуры.

Посмотрим на исправленный вариант кода:


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

Важный момент: передача созданного на клиенте СписокЗначений на сервер в качестве параметра приводит к лишней сериализации данных. Оптимальнее инициализировать и заполнять список непосредственно в контексте сервера и возвращать готовый объект на клиент.

Переход на немодальные и асинхронные методы

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

Вариант 1: Использование асинхронного вызова с ключевым словом Ожидать

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


&НаКлиенте
Асинх Процедура РегионНажатие(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    СписокРегионов = ПолучитьСписокРегионовНаСервере();
    
    ВыбранныйРегион = Ожидать СписокРегионов.ВыбратьЭлементАсинх("Выберите регион для поиска");
    Если ВыбранныйРегион <> Неопределено Тогда
        РегионПредставление = ВыбранныйРегион.Представление;
        РегионДляПоиска = ВыбранныйРегион.Значение;
    КонецЕсли;
    
КонецПроцедуры

Вариант 2: Использование описания оповещения

Если использование асинхронных процедур не подходит по архитектуре, применим метод ПоказатьВыборЭлемента() с обратным вызовом:


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

&НаКлиенте
Процедура ПослеВыбораРегиона(ВыбранныйРегион, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныйРегион <> Неопределено Тогда
        РегионПредставление = ВыбранныйРегион.Представление;
        РегионДляПоиска = ВыбранныйРегион.Значение;
    КонецЕсли;
    
КонецПроцедуры

Альтернативные интерфейсные решения

Для создания более удобного пользовательского интерфейса вместо модального окна со списком можно использовать альтернативные механизмы платформы:

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