Как открыть общую форму отчета вместо собственной основной формы

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

При разработке отчетов в системе 1С:Предприятие 8.3 часто возникает ситуация, когда стандартного функционала общей формы отчета (например, из Библиотеки Стандартных Подсистем — БСП) недостаточно, и разработчик создает собственную форму. Однако позже может потребоваться вернуть использование общей формы или реализовать логику, при которой в зависимости от условий должна открываться либо собственная, либо общая форма. В этой статье мы подробно разберем, как правильно управлять процессом выбора формы и какие механизмы платформы для этого предназначены. При необходимости встроить результат в карточку объекта можно использовать решение для вывода отчета на произвольную форму с использованием вариантов.

Использование обработчика ОбработкаПолученияФормы

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

Рассмотрим важный нюанс: если в конфигураторе у отчета жестко задана Основная форма, платформа во многих сценариях интерактивного открытия (например, из панели отчетов) будет пытаться вызвать именно её, игнорируя программные переопределения. Чтобы механизм подмены работал стабильно, рекомендуется сбросить значение свойства «Основная форма» в конфигураторе (оставить поле пустым).

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


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

КонецПроцедуры

В данном примере мы анализируем параметр ВидФормы. Если система запрашивает основную форму, мы принудительно устанавливаем в ВыбраннаяФорма имя нашей общей формы. Обратите внимание, что использование СтандартнаяОбработка = Ложь критически важно для того, чтобы платформа не пыталась открыть форму по умолчанию после выполнения вашего кода.

Особенности открытия общей формы через параметры

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

Выясним, какие параметры обычно ожидает общая форма отчета:

  1. ИсточникДанных — путь к объекту метаданных (например, "Отчет.Продажи").
  2. КлючВарианта — имя конкретного варианта отчета, который должен быть загружен при открытии.
  3. ПользовательскиеНастройки — объект или ссылка на настройки, если их нужно применить программно.
  4. СформироватьПриОткрытии — булево значение, определяющее, нужно ли сразу запускать формирование отчета.

Если вы вызываете форму программно через ОткрытьФорму() из другого места конфигурации, код может выглядеть следующим образом:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КлючВарианта", "Основной");
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);

ОткрытьФорму("ОбщаяФорма.ФормаОтчета", ПараметрыОткрытия, , "Отчет.МойУникальныйОтчет");

Здесь четвертый параметр функции ОткрытьФорму (Уникальность) часто используется для идентификации окна отчета. В качестве имени формы мы указываем общую форму, но контекст передаем через параметры.

Вызов из собственной формы (событие ПриСозданииНаСервере)

Разберем ситуацию, когда вы все же оставили собственную форму основной, но в процессе её инициализации поняли, что нужно открыть общую. Это менее предпочтительный вариант, так как он создает лишнюю нагрузку на сервер (сначала создается одна форма, чтобы тут же закрыться), но иногда это единственный путь при сложной логике прав доступа.

Важно помнить: метод ОткрытьФорму является клиентским. Его нельзя вызвать напрямую из серверного события ПриСозданииНаСервере. В таком случае алгоритм будет следующим:

Посмотрим на пример в модуле собственной формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Логика условия открытия общей формы
    ПараметрыФормы = Новый Структура("КлючВарианта", "Стандартный");
    ОткрытьФорму("ОбщаяФорма.ФормаОтчета", ПараметрыФормы);
    
    // Отменяем открытие текущей собственной формы
    Отказ = Истина;
    
КонецПроцедуры

Нюансы работы с расширениями и метаданными

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

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

Резюмируем: для корректного открытия общей формы вместо собственной лучше всего использовать модуль менеджера и событие ОбработкаПолученияФормы, предварительно убедившись, что у объекта в метаданных не выбрана основная форма по умолчанию. Это обеспечит чистоту кода и предсказуемое поведение системы в любых режимах работы пользователя.

← На главную