Почему внешний отчет на СКД не открывается из справочника в 1С на обычных формах

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

Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем одну очень распространенную, но от этого не менее досадную проблему, с которой регулярно сталкиваются разработчики и администраторы систем на платформе 1С:Предприятие 8. При переносе, обновлении или добавлении внешнего отчета, построенного на базе Системы компоновки данных (СКД), в базу данных под управлением обычного приложения (например, Управление торговлей 10.3, Управление производственным предприятием 1.3 или Комплексная автоматизация 1.1), этот отчет наотрез отказывается запускаться из справочника дополнительных обработок.

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

Давайте вместе проанализируем причины этого явления, заглянем во внутренние механизмы работы платформы 1С и найдем простые и надежные способы решения этой проблемы.

Выясняем причину: в чем разница способов запуска отчета

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

  1. Сценарий 1: Ручное открытие через «Файл» -> «Открыть»
    Когда мы вручную выбираем файл отчета с диска, инициализацией и построением интерфейса занимается непосредственно сама платформа 1С:Предприятие. Платформа считывает структуру файла .erf. Видя, что в отчете отсутствует явно созданная основная форма, но при этом определена основная схема компоновки данных (СКД), платформа берет на себя задачу по автоматической генерации стандартной формы отчета. Она динамически создает управляющие элементы: кнопку «Сформировать», панель настроек, поле табличного документа и связывает их с СКД. Пользователь видит полноценный готовый к работе интерфейс.
  2. Сценарий 2: Запуск из справочника «Внешние обработки»
    В типовых конфигурациях на обычных формах запуск внешних отчетов и обработок из справочника происходит полностью программным путем. Код, написанный разработчиками конфигурации (обычно в модуле справочника или в связанных с ним общих модулях), выполняет следующие операции:
    • Извлекает двоичные данные файла отчета из реквизита справочника (хранилища значения).
    • Сохраняет эти данные во временный файл на локальном диске пользователя во временный каталог.
    • Регистрирует и подключает этот файл как внешний отчет с помощью метода платформы ВнешниеОтчеты.Создать().
    • Пытается получить форму этого отчета с помощью метода ПолучитьФорму() для последующего ее отображения пользователю.

Вот на этапе вызова метода ПолучитьФорму() и кроется главная проблема. В обычном приложении 1С, если у внешнего отчета нет встроенной (явно созданной в конфигураторе) формы, этот метод не генерирует форму автоматически — он возвращает значение Неопределено.

Давайте посмотрим на пример типичного алгоритма запуска, который используется в коде справочника:


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

Как мы видим из примера кода, если переменная ФормаОтчета принимает значение Неопределено, условие Если ФормаОтчета <> Неопределено не выполняется, метод Открыть() не вызывается, а ветки обработки этого исключения в коде справочника обычно нет. В результате мы получаем ту самую «тишину» при клике.

Исторический контекст и особенности платформы 1С

Стоит отметить, что данное поведение не всегда является оплошностью разработчиков прикладного решения. В истории платформы 1С:Предприятие 8.2 (особенно на релизах ветки 8.2.15) существовал зарегистрированный баг. При работе в режиме обычного приложения метод ПолучитьФорму() для внешних отчетов на СКД возвращал Неопределено даже при попытках вызвать его напрямую из кода пользовательских обработок, если у отчета отсутствовала собственная форма. Позже поведение платформы было стабилизировано, однако логика работы программного открытия в старых конфигурациях (таких как ЗУП 2.5, УТ 10.3) осталась прежней — обязательное наличие спроектированной формы.

Решение 1: Создание стандартной формы в конфигураторе за несколько кликов

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

Разберем по шагам, как это сделать:

  1. Откройте конфигуратор вашей базы данных 1С.
  2. Через меню «Файл» -> «Открыть» найдите и откройте файл вашего внешнего отчета (с расширением .erf).
  3. В открывшемся дереве метаданных внешнего отчета найдите ветку «Формы».
  4. Нажмите на иконку добавления нового элемента (зеленый плюс) или щелкните правой кнопкой мыши по ветке «Формы» и выберите пункт «Добавить».
  5. Перед вами откроется стандартный «Конструктор формы отчета». В поле «Тип формы» обязательно выберите вариант «Форма отчета». Обратите внимание, что флаг «Назначить форму основной» должен быть установлен.
  6. Нажмите кнопку «Готово» в нижней части окна конструктора.
  7. Платформа 1С автоматически сгенерирует стандартную форму обычного приложения, которая по умолчанию будет связана со схемой компоновки данных. На форме появятся все стандартные элементы управления (кнопки «Сформировать», «Настройка», поле табличного документа для вывода результата).
  8. Сохраните изменения во внешнем отчете (сочетанием клавиш Ctrl + S или через меню «Файл» -> «Сохранить»).
  9. Загрузите обновленный файл отчета обратно в справочник дополнительных обработок вашей информационной базы.

Теперь при попытке открыть отчет из справочника метод ПолучитьФорму() успешно вернет созданную нами форму, и отчет откроется корректно!

Решение 2: Программное изменение кода справочника (для нетиповых конфигураций)

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

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

Рассмотрим пример реализации такой логики:


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

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

Почему этой проблемы нет в Управляемых формах (УФ)?

Давайте проанализируем, как обстоят дела в современных конфигурациях на управляемых формах (таких как 1С:Управление торговлей 11, Бухгалтерия предприятия 3.0, ERP Управление предприятием). Если вы добавите внешний отчет на СКД без собственной формы в справочник «Дополнительные отчеты и обработки» в управляемом приложении, он откроется без каких-либо затруднений.

Это связано с принципиально иной архитектурой работы управляемого интерфейса и механизмов Библиотеки стандартных подсистем (БСП):

Подведем итоги

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

Надеемся, что этот подробный разбор помог вам разобраться в механике работы платформы 1С и сэкономит ваше время при разработке отчетов! Успешной вам автоматизации!

← На главную