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