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