Почему дополнительная обработка БСП закрывается сразу после открытия и как это исправить?

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

При разработке и интеграции внешних отчетов и обработок с использованием подсистемы Дополнительные отчеты и обработки библиотеки стандартных подсистем (БСП) программисты часто сталкиваются со странным поведением интерфейса. Дополнительная обработка успешно регистрируется в системе, её форма без ошибок инициализируется, однако сразу после открытия окно обработки мгновенно закрывается. Это происходит одновременно с закрытием формы списка дополнительных обработок или формы запуска.

В этой статье мы подробно проанализируем причины возникновения данной проблемы, разберем поведение платформы «1С:Предприятие» и предложим несколько эффективных способов решения — от простого изменения интерактивных свойств формы до программного управления контекстом выполнения.

Причина 1. Неправильный режим открытия окна управляемой формы

Основная и наиболее распространенная причина автоматического закрытия формы кроется в настройках свойства самой управляемой формы внешней обработки. Разберем этот механизм подробнее.

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

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

Решение проблемы в Конфигураторе:

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Принудительно устанавливаем независимый режим открытия окна
    ЭтаФорма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый;
    
КонецПроцедуры

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

Причина 2. Кэширование внешней обработки в сеансе работы 1С

Очень часто разработчики сталкиваются с ситуацией, когда свойство РежимОткрытияОкна уже изменено на Независимый, но обработка все равно продолжает закрываться. Выясним, почему это происходит.

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

Как решить проблему кэширования:

  1. После загрузки новой версии обработки в справочник «Дополнительные отчеты и обработки» обязательно завершите текущий сеанс работы в режиме «1С:Предприятие».
  2. Запустите систему заново. Кэш сеанса будет очищен, и платформа загрузит актуальную версию обработки с новым режимом работы окна.
  3. Для удобства отладки используйте встроенный в БСП режим отладки внешних обработок, который позволяет запускать файлы напрямую с диска, минуя кэширование справочника БСП.

Причина 3. Блокировка выполнения безопасным режимом

Рассмотрим еще одну неочевидную, но частую проблему на примере обработки «Универсальный обмен данными в формате XML». При регистрации внешней обработки в модуле объекта мы определяем функцию СведенияОВнешнейОбработке(). Часто разработчики оставляют параметры безопасности по умолчанию:

ПараметрыРегистрации.БезопасныйРежим = Истина;

Если обработка работает в безопасном режиме, платформа накладывает серьезные ограничения на выполнение кода: запрещен доступ к файловой системе, COM-соединениям, вызовам внешних компонент и некоторым методам платформы. Обработка «Универсальный обмен данными в формате XML» активно использует чтение файлов на диске и работу с COM для подключения к базам-приемникам.

Если при открытии формы (в обработчиках ПриСозданииНаСервере или ПриОткрытии) происходит попытка обратиться к запрещенному ресурсу внутри блока Попытка...Исключение, ошибка может быть молча подавлена кодом обработки, но инициализация формы прервется, и форма сразу закроется.

Решение проблемы с безопасным режимом:

Если ваша обработка должна выполнять административные действия, работу с файлами или COM-объектами, отключите безопасный режим при регистрации в модуле объекта:


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

После изменения параметров регистрации не забудьте обновить элемент справочника доп. обработок в режиме «1С:Предприятие», чтобы система обновила права доступа и настройки безопасности в профилях безопасности базы данных.

Причина 4. Конфликты контекстов и циклические ссылки

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

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

Резюме

Если ваша дополнительная обработка закрывается сразу после запуска из БСП, выполните следующие шаги по порядку:

  1. Установите Режим открытия окна формы в значение Независимый (в Конфигураторе или кодом в ПриСозданииНаСервере).
  2. Проверьте, отключен ли безопасный режим (БезопасныйРежим = Ложь), если обработка работает с внешними ресурсами и файлами.
  3. Перезапустите сеанс «1С:Предприятия», чтобы гарантированно очистить кэш платформы и применить новые свойства формы.
← На главную