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