Почему мгновенно закрывается форма внешнего отчета в 1С при запуске и как это исправить?

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

Разработчики и администраторы систем на платформе «1С:Предприятие 8.3» часто сталкиваются с задачей подключения типовых или измененных отчетов в качестве внешних. Для этого используется стандартный механизм библиотеки стандартных подсистем (БСП) — справочник «Дополнительные отчеты и обработки». Однако при регистрации некоторых отчетов (особенно регламентированных, таких как 4-ФСС, Декларация по НДС или Прибыли) возникает специфическая проблема: при запуске из интерфейса программа на долю секунды показывает форму отчета, после чего она мгновенно и безвозвратно закрывается без вывода каких-либо сообщений об ошибках.

В этой статье мы подробно разберем внутреннюю механику этой ошибки, выясним, почему поведение платформы приводит к такому результату, и рассмотрим три практических способа решения проблемы.

Почему происходит мгновенное закрытие формы?

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

При этом возникают два ключевых фактора:

  1. Отсутствие владельца формы: При запуске команды из интерфейса дополнительных обработок форма отчета открывается методом платформы без явного указания родительского окна (параметр Владелец принимает значение Неопределено).
  2. Режим открытия окна «Блокировать окно владельца»: У регламентированных отчетов в свойствах конфигурации или программно в коде часто устанавливается именно этот режим работы окна. Платформа, пытаясь открыть окно с требованием заблокировать владельца, не находит активного владельца-родителя. В интерфейсе «Такси» это вызывает бесконфликтное, но аварийное завершение работы формы — платформа просто закрывает её сразу после инициализации.

В типовых конфигурациях (например, «Зарплата и управление персоналом 3.1», «Бухгалтерия предприятия 3.0» или «ERP Управление предприятием») это поведение часто провоцируется вызовом общего модуля. Проанализируем общие механизмы регламентированной отчетности: при создании формы на сервере срабатывает процедура РегламентированнаяОтчетностьКлиентСервер.ВыборФормыРегламентированногоОтчетаПоУмолчанию(Форма), которая принудительно переопределяет режим открытия окна в значение Блокировать окно владельца.

Перейдем к методам устранения этой проблемы.

Способ 1. Изменение режима открытия формы в Конфигураторе

Самый быстрый и очевидный способ заставить форму открываться — изменить режим открытия окна непосредственно в свойствах формы вашего внешнего отчета (файла .erf).

Выполним следующие шаги:

  1. Откроем внешний отчет в режиме Конфигуратора через меню Файл — Открыть.
  2. В дереве метаданных внешнего отчета перейдем в ветку Формы и откроем свойства основной формы отчета (нажав по ней правой кнопкой мыши и выбрав пункт Свойства).
  3. В палитре свойств найдем категорию Использование и свойство Режим открытия окна (Window opening mode).
  4. Изменим его значение с Блокировать окно владельца на Независимый.
  5. Сохраним файл внешнего отчета.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Вызов типовых механизмов, которые могут сбрасывать настройки окна:
    // РегламентированнаяОтчетностьКлиентСервер.ВыборФормыРегламентированногоОтчетаПоУмолчанию(ЭтотОбъект);
    
    // Наш код для исправления поведения окна:
    ЭтотОбъект.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый;
    
КонецПроцедуры

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

Способ 2. Архитектурно правильное подключение через регламентированные отчеты

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

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

  1. Запустим программу в режиме 1С:Предприятие.
  2. Перейдем в рабочее место 1С-Отчетность (в зависимости от конфигурации раздел Отчеты — Регламентированные отчеты).
  3. В верхней панели перейдем по кнопке Настройки и выберем пункт Справочник регламентированных отчетов.
  4. В открывшемся списке найдем нужный отчет (например, 4-ФСС) и дважды кликнем для редактирования его карточки.
  5. В поле Использовать переставим переключатель из положения Объект (встроенный отчет конфигурации) в положение Файл (внешний отчет).
  6. Программа откроет диалоговое окно выбора файла. Укажем подготовленный файл внешнего отчета с расширением .erf.
  7. Запишем и закроем настройки карточки отчета.

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

Способ 3. Переопределение метода вызова команды в БСП

Если бизнес-требования обязывают вас разместить отчет именно внутри раздела «Дополнительные отчеты», стандартный режим открытия формы использовать крайне нежелательно. Вместо этого настроим вызов через клиентский метод. Это позволит нам самостоятельно управлять процессом инициализации формы программно.

Для реализации этого подхода перепишем функцию СведенияОВнешнейОбработке в модуле объекта нашего внешнего отчета. Вместо использования типа команды ОткрытиеФормы укажем ВызовКлиентскогоМетода:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
    ПараметрыРегистрации.Вставить("Наименование", "Регламентированный отчет 4-ФСС (Внешний)");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Внешний отчет с обходом блокировки окна");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Обратите внимание на использование метода "ВызовКлиентскогоМетода" вместо "ОткрытиеФормы"
    ДобавитьКоманду(ТаблицаКоманд, 
                    "Открыть отчет 4-ФСС", 
                    "ИмяНашейКомандыДляОткрытия", 
                    "ВызовКлиентскогоМетода", 
                    Истина);

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;

КонецФункции

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

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

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


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

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

Рекомендации по поиску аналогичных ошибок

Если вы столкнулись с похожим поведением другой формы, рекомендуем выполнить экспресс-отладку по следующим шагам:

← На главную