Почему внешний отчет с управляемой формой не открывается в обычном приложении и как это исправить?

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

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

Выясним причину: почему встроенный отчет работает, а внешний — нет?

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

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

Способ 1: Использование «формы-заглушки» (метод программного моста)

Это самый эффективный и быстрый способ, позволяющий не перерисовывать сложный интерфейс с нуля. Мы создадим «посредника» — обычную форму, которая будет единственной задачей иметь запуск управляемой формы. Разберем по шагам, как это реализовать:

  1. Откройте ваш внешний отчет в Конфигураторе.
  2. Перейдите в список форм отчета и нажмите «Добавить».
  3. В мастере создания формы выберите тип «Обычная форма». Назовите ее, например, ФормаДляОбычногоПриложения.
  4. Не добавляйте на нее никаких реквизитов, она может оставаться пустой.
  5. В окне свойств отчета (в дереве метаданных файла) найдите раздел «Основные формы». Убедитесь, что в поле Основная форма отчета (для обычного приложения) выбрана именно эта новая обычная форма.
  6. Зайдите в модуль созданной обычной формы и пропишите обработчик события ПриОткрытии.

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


Процедура ПриОткрытии(Отказ)
    
    // Получаем управляемую форму по ее имени в метаданных внешнего отчета
    ФормаУпр = ЭтотОбъект.ПолучитьФорму("ФормаУправляемая"); 
    
    // Открываем управляемую форму
    ФормаУпр.Открыть();
    
    // Устанавливаем Отказ в Истина, чтобы пустая обычная форма не отобразилась
    Отказ = Истина;
    
КонецПроцедуры

Этот метод «обманывает» платформу: при нажатии «Файл — Открыть» система успешно находит и инициализирует обычную форму (что она умеет делать хорошо), а та, в свою очередь, перехватывает управление и запускает нужный нам современный интерфейс.

Способ 2: Проверка настроек и свойств метаданных

Если вы не хотите добавлять лишние формы, давайте проанализируем настройки самого файла отчета. Иногда проблема кроется в некорректном заполнении свойств основной формы. Рассмотрим, на что нужно обратить внимание:

  1. Щелкните правой кнопкой мыши по корню внешнего отчета в дереве метаданных и выберите «Свойства».
  2. Найдите категории Основная форма отчета и Форма отчета.
  3. Убедитесь, что управляемая форма выбрана в обоих полях. Даже если платформа визуально отображает имя формы, попробуйте перевыбрать её заново.
  4. Проверьте свойство Режим использования модальности в конфигурации. Если ваша управляемая форма использует модальные вызовы (например, Вопрос() вместо ПоказатьВопрос()), а в конфигурации использование модальности запрещено, форма может закрыться мгновенно после открытия без выдачи ошибок.

Способ 3: Интеграция через Библиотеку стандартных подсистем (БСП)

Если ваша конфигурация современная (например, «Управление торговлей 11», «Бухгалтерия 3.0» или любая другая на базе БСП), но пользователи по какой-то причине работают в обычном интерфейсе (толстом клиенте), лучшим решением будет отказ от открытия через «Файл — Открыть».

Зарегистрируйте отчет в справочнике Дополнительные отчеты и обработки. Рассмотрим, почему это помогает:

Технические нюансы контекста выполнения

Важно понимать, что даже если управляемая форма успешно открылась во внешнем отчете внутри обычного приложения, она будет работать в режиме Толстого клиента (управляемое приложение). Выясним, что это означает для разработчика:

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

Также проанализируем ситуацию с правами доступа. Убедитесь, что у пользователя в роли установлено право Интерактивное открытие внешних отчетов и обработок. Хотя автор темы указал, что это право установлено, для многих других это становится неочевидным препятствием. Без этого права «болт» при открытии — стандартная реакция системы.

Резюме по исправлению

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

← На главную