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