Приветствуем вас, уважаемые коллеги! Сегодня мы детально разберем одну очень распространенную, но от этого не менее досадную проблему, с которой регулярно сталкиваются разработчики и администраторы систем на платформе 1С:Предприятие 8. При переносе, обновлении или добавлении внешнего отчета, построенного на базе Системы компоновки данных (СКД), в базу данных под управлением обычного приложения (например, Управление торговлей 10.3, Управление производственным предприятием 1.3 или Комплексная автоматизация 1.1), этот отчет наотрез отказывается запускаться из справочника дополнительных обработок.
При этом наблюдается крайне специфическое поведение: если запустить этот же файл отчета через стандартное меню «Файл» -> «Открыть», он прекрасно открывается, формируется и работает без каких-либо нареканий. Но стоит его зарегистрировать в справочнике «Внешние обработки» и попытаться запустить оттуда — при двойном щелчке мыши или при нажатии кнопки «Выполнить» не происходит абсолютно ничего. Программа не выдает никаких ошибок, не падает в аварийный режим, а просто отвечает полной «тишиной».
Давайте вместе проанализируем причины этого явления, заглянем во внутренние механизмы работы платформы 1С и найдем простые и надежные способы решения этой проблемы.
Для начала давайте разберем по шагам, почему возникает такая разница в поведении системы при ручном открытии файла и при его запуске программным путем из справочника дополнительных обработок.
.erf. Видя, что в отчете отсутствует явно созданная основная форма, но при этом определена основная схема компоновки данных (СКД), платформа берет на себя задачу по автоматической генерации стандартной формы отчета. Она динамически создает управляющие элементы: кнопку «Сформировать», панель настроек, поле табличного документа и связывает их с СКД. Пользователь видит полноценный готовый к работе интерфейс.ВнешниеОтчеты.Создать().ПолучитьФорму() для последующего ее отображения пользователю.Вот на этапе вызова метода ПолучитьФорму() и кроется главная проблема. В обычном приложении 1С, если у внешнего отчета нет встроенной (явно созданной в конфигураторе) формы, этот метод не генерирует форму автоматически — он возвращает значение Неопределено.
Давайте посмотрим на пример типичного алгоритма запуска, который используется в коде справочника:
// Программный запуск внешнего отчета из справочника
ИмяФайла = ПолучитьИмяВременногоФайла("erf");
ДвоичныеДанные.Записать(ИмяФайла);
Попытка
НовыйОтчет = ВнешниеОтчеты.Создать(ИмяФайла);
ФормаОтчета = НовыйОтчет.ПолучитьФорму(); // Здесь возвращается Неопределено!
Если ФормаОтчета <> Неопределено Тогда
ФормаОтчета.Открыть();
Иначе
// Стандартный код часто не содержит ветки "Иначе" для этого условия
// или просто молча игнорирует открытие, если форма не получена.
КонецЕсли;
Исключение
Предупреждение("Не удалось открыть внешний отчет: " + ОписаниеОшибки());
КонецПопытки;
Как мы видим из примера кода, если переменная ФормаОтчета принимает значение Неопределено, условие Если ФормаОтчета <> Неопределено не выполняется, метод Открыть() не вызывается, а ветки обработки этого исключения в коде справочника обычно нет. В результате мы получаем ту самую «тишину» при клике.
Стоит отметить, что данное поведение не всегда является оплошностью разработчиков прикладного решения. В истории платформы 1С:Предприятие 8.2 (особенно на релизах ветки 8.2.15) существовал зарегистрированный баг. При работе в режиме обычного приложения метод ПолучитьФорму() для внешних отчетов на СКД возвращал Неопределено даже при попытках вызвать его напрямую из кода пользовательских обработок, если у отчета отсутствовала собственная форма. Позже поведение платформы было стабилизировано, однако логика работы программного открытия в старых конфигурациях (таких как ЗУП 2.5, УТ 10.3) осталась прежней — обязательное наличие спроектированной формы.
Самым простым, надежным и быстрым способом исправить эту проблему является добавление стандартной формы отчета непосредственно внутри конфигуратора внешнего отчета. Нам не потребуется вручную размещать кнопки, табличные документы или писать сложный код инициализации. Платформа 1С сделает все за нас через встроенный конструктор.
Разберем по шагам, как это сделать:
.erf).Ctrl + S или через меню «Файл» -> «Сохранить»).Теперь при попытке открыть отчет из справочника метод ПолучитьФорму() успешно вернет созданную нами форму, и отчет откроется корректно!
Если ваша конфигурация снята с поддержки или находится в режиме доработки, а внешних отчетов без собственных форм у вас планируется очень много, можно автоматизировать этот процесс на уровне кода конфигурации. Мы можем изменить логику открытия отчетов в самом справочнике.
Давайте рассмотрим пример кода, который можно внедрить в процедуру открытия внешнего отчета. Мы можем проверять, если метод ПолучитьФорму() возвращает Неопределено, то мы принудительно открываем общую универсальную форму отчета, которая присутствует во многих типовых конфигурациях обычного приложения, и программно передаем туда схему компоновки из нашего внешнего файла.
Рассмотрим пример реализации такой логики:
// Пример доработки процедуры открытия в справочнике "Внешние обработки"
Попытка
НовыйОтчет = ВнешниеОтчеты.Создать(ПутьКФайлу);
ФормаОтчета = НовыйОтчет.ПолучитьФорму();
Если ФормаОтчета = Неопределено Тогда
// Если форма не определена, пробуем открыть стандартную общую форму отчета
// Во многих конфигурациях это "ОбщаяФормаОтчета" или "ФормаОтчета" из универсальных механизмов
Попытка
ФормаОтчета = ПолучитьОбщуюФорму("ХозяйственныеОперации", НовыйОтчет); // Пример для некоторых конфигураций
Исключение
// Если общая форма недоступна, создаем ее программно
ФормаОтчета = ВнешниеОтчеты.ПолучитьФорму(ПутьКФайлу);
КонецПопытки;
КонецЕсли;
Если ФормаОтчета <> Неопределено Тогда
ФормаОтчета.Открыть();
Иначе
ВызватьИсключение "Не удалось автоматически сформировать интерфейс для отчета.";
КонецЕсли;
Исключение
Сообщить("Ошибка открытия отчета: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
Такой подход избавит вас от необходимости перевыпускать и перенастраивать десятки внешних файлов отчетов, однако он требует внесения изменений в основную конфигурацию, что не всегда желательно или возможно.
Давайте проанализируем, как обстоят дела в современных конфигурациях на управляемых формах (таких как 1С:Управление торговлей 11, Бухгалтерия предприятия 3.0, ERP Управление предприятием). Если вы добавите внешний отчет на СКД без собственной формы в справочник «Дополнительные отчеты и обработки» в управляемом приложении, он откроется без каких-либо затруднений.
Это связано с принципиально иной архитектурой работы управляемого интерфейса и механизмов Библиотеки стандартных подсистем (БСП):
ОткрытьФорму(), а не ПолучитьФорму().Открыть(). Метод ОткрытьФорму() умеет работать в асинхронном режиме и корректно обрабатывает создание формы на стороне сервера с последующей передачей клиенту.Если вы работаете в исторической конфигурации на обычных формах (1С 8.2 или 1С 8.3 в режиме обычного приложения) и ваш внешний отчет на СКД «молчит» при запуске из справочника — просто зайдите в конфигуратор этого отчета и добавьте стандартную форму отчета. Это займет ровно одну минуту, но полностью решит проблему совместимости с механизмами программного запуска внешних обработок.
Надеемся, что этот подробный разбор помог вам разобраться в механике работы платформы 1С и сэкономит ваше время при разработке отчетов! Успешной вам автоматизации!