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