Почему внешняя обработка открывается и сразу закрывается при запуске из раздела программы

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

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

Выясним причину такого поведения платформы 1С:Предприятие 8.3 и разберем по шагам, как исправить форму и модуль обработки для стабильного запуска.

Причина проблемы: режим открытия окна формы

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

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

Когда же запуск выполняется напрямую из карточки справочника ДополнительныеОтчетыИОбработки, окно самого элемента справочника остается открытым на экране. Владелец не закрывается, поэтому и форма обработки продолжает работать. Чтобы устранить эту проблему, окно обработки необходимо сделать независимым от вызывающего контекста.

Пошаговое исправление свойства «Режим открытия окна»

Разберем по шагам порядок действий для устранения некорректного поведения:

  1. Откроем исходный файл внешней обработки (.epf) в режиме Конфигуратор.
  2. Перейдем к дереву метаданных обработки и откроем редактор ее основной формы.
  3. Выделим корневой элемент в дереве элементов формы (свойство формы) и откроем палитру свойств (сочетание клавиш Alt + Enter).
  4. Найдем свойство Режим открытия окна (в коде и платформенных механизмах это соответствует перечислению РежимОткрытияОкнаФормы).
  5. Заменим значение Блокировать окно владельца на Независимый (РежимОткрытияОкнаФормы.Независимый).
  6. Сохраним файл обработки.
  7. Перейдем в режим 1С:Предприятие, откроем справочник Дополнительные отчеты и обработки, найдем нужную позицию и нажмем кнопку Загрузить из файла, выбрав обновленный файл. Это обязательный шаг, так как конфигурация хранит двоичные данные обработки в базе данных, а не считывает их с диска «на лету».

Проверка программного кода и параметров открытия

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

Посмотрим на обработчик события ПриСозданииНаСервере или ПередОткрытием в модуле формы. Нередко разработчики закладывают проверку структуры параметров:


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

Если в коде установлен параметр Отказ = Истина, форма не отобразится, а сразу же закроется. Чтобы выявить такие проверки, проверим параметры, приходящие в форму при разных сценариях открытия, и сделаем их необязательными либо предусмотрим значения по умолчанию:


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

Проверка типа команды в функции «СведенияОВнешнейОбработке»

Рассмотрим еще один важный нюанс интеграции с подсистемой БСП. В модуле объекта внешней обработки расположена экспортная функция СведенияОВнешнейОбработке(). В таблице команд этой функции задается вариант запуска формы.

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


ТаблицаКоманд = ПолучитьТаблицуКоманд();

НоваяСтрока = ТаблицаКоманд.Добавить();
НоваяСтрока.Представление = "Открыть рабочее место";
НоваяСтрока.Идентификатор = "ОткрытьФорму";
// Обязательно проверяем тип команды:
НоваяСтрока.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяСтрока.ПоказыватьОповещение = Ложь;

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

Как отладить закрытие формы при вызове из интерфейса

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

  1. В модуле формы внешней обработки добавим обработчик события ПередЗакрытием.
  2. Поставим точку останова внутри процедуры ПередЗакрытием:
    
    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
        // Устанавливаем точку останова здесь
        ТекущееСостояние = Истина;
    КонецПроцедуры
    
  3. При запуске из интерфейса раздела отладчик остановится в момент закрытия. Откроем окно Стек вызовов (Ctrl + Alt + C), чтобы увидеть всю цепочку системных процедур, инициировавших закрытие окна.

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

← На главную