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