Как правильно открыть форму выбора и сохранить выбранное значение в управляемых формах 1С?

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

В современной разработке на платформе 1С:Предприятие 8.3 использование модальных окон (таких как ОткрытьМодально) признано устаревшим подходом. В управляемых формах, особенно при работе в веб-клиенте, подобные вызовы вызывают ошибку: «Интерактивные операции недоступны» или «Использование модальных окон в данном режиме запрещено». Давайте разберем, как реализовать открытие формы выбора и передачу данных из нее в основную форму асинхронно и правильно.

Метод 1: Использование объекта ОписаниеОповещения

Это самый современный и рекомендуемый способ для работы с формами, когда вам нужно дождаться результата выбора пользователя и выполнить код (например, заполнить табличную часть) только после того, как форма будет закрыта.

Разберем реализацию по шагам:

  1. Создаем объект ОписаниеОповещения, которому передаем имя процедуры-обработчика, которая будет запущена платформой автоматически после закрытия формы выбора.
  2. Вызываем ОткрытьФорму, передавая созданное оповещение в шестой параметр метода.
  3. В процедуре-обработчике анализируем полученный результат и выполняем необходимые действия.

Посмотрим на пример кода:


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

&НаКлиенте
Процедура ВыполнитьКомандуЗавершение(Результат, ДополнительныеПараметры) Экспорт 
    // Если пользователь закрыл форму, не выбрав значение, результат будет Неопределено
    Если Результат = Неопределено Тогда 
        Возврат;
    КонецЕсли;
    
    // В переменной Результат теперь находится выбранный элемент
    Для каждого ТекущаяСтрока из Объект.Товары Цикл        
        ТекущаяСтрока.СчетУчета = Результат;
    КонецЦикла;    
КонецПроцедуры

Метод 2: Использование события ОбработкаВыбора

Если вы хотите построить архитектуру вашего решения на событиях формы, используйте штатное событие ОбработкаВыбора. Этот метод позволяет форме-владельцу «слушать», какое значение было выбрано в дочерней форме.

Для реализации этого подхода выполните следующие действия:

  1. Откройте форму выбора с параметрами, передав ЭтаФорма в качестве владельца.
  2. Убедитесь, что в форме выбора для списка или поля установлен признак РежимВыбора.
  3. В основной форме (в которую нужно передать значение) создайте обработчик события ОбработкаВыбора(РезультатВыбора, ИсточникВыбора).

Пример реализации:


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

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

Почему нельзя использовать модальные окна?

Использование модальности блокирует выполнение кода в основном потоке до тех пор, пока пользователь не закроет диалоговое окно. В облачных сервисах и веб-интерфейсах это нарушает работу клиент-серверного взаимодействия, так как сервер не может ждать ответа от клиента (браузера) неопределенное время. Асинхронные методы, описанные выше, позволяют приложению оставаться «отзывчивым».

Важные рекомендации:

Теперь вы знаете, как правильно организовать выбор данных в управляемом приложении. Использование ОписаниеОповещения является наиболее универсальным решением для большинства задач!

← На главную