Почему не срабатывает событие ОбработкаВыбора во внешней печатной форме и как это исправить?

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

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

Анализ проблемы: контекст выполнения формы

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

Ранее считалось, что достаточно передать ЭтаФорма в качестве владельца при открытии, чтобы событие сработало, однако на практике, особенно во внешних обработках, этот механизм может давать сбои. Давайте рассмотрим более надежный способ — использование объекта ОписаниеОповещения.

Решение проблемы через ОписаниеОповещения

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

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

Пример реализации решения

Давайте посмотрим, как изменить наш код, чтобы он стал надежным и предсказуемым. Проанализируем реализацию на пошаговом примере:

Сначала определим клиентскую процедуру, которая инициирует открытие формы с использованием оповещения:


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

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


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

И, наконец, серверная функция для формирования печатной формы:


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

Почему этот подход надежнее?

Рассмотренный нами вариант обладает рядом преимуществ:

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

← На главную