Как подключить внешние и встроенные отчеты к документам через подключаемые команды БСП?

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

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

Сценарий 1: Подключение внешнего отчета к документу

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

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

Разберем пример кода, который позволяет зарегистрировать внешний отчет для конкретного документа (например, ЗапросНаБелиберду):


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

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

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

Сценарий 2: Интеграция встроенного отчета (через конфигурацию или расширение)

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

Выясним, как работает этот механизм. БСП при формировании меню отчетов в форме вызывает экспортную процедуру ДобавитьКомандыОтчетов модуля менеджера объекта. Рассмотрим, как реализовать эту процедуру по шагам:

  1. Откроем модуль менеджера документа (например, РеализацияТоваровУслуг).
  2. Найдем или создадим процедуру ДобавитьКомандыОтчетов.
  3. Если мы работаем в расширении, используем аннотацию &После("ДобавитьКомандыОтчетов").

Пример кода для регистрации внутреннего отчета:


// В модуле менеджера документа
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов) Экспорт
    Команда = КомандыОтчетов.Добавить();
    // Указываем путь к объекту отчета в конфигурации
    Команда.Менеджер = "Отчет.НашНовыйОтчетПоПродажам"; 
    Команда.Представление = НСтр("ru = 'Анализ продаж по документу'");
    // Если нужно открывать отчет сразу по текущей ссылке документа
    Команда.ПараметрыОснования = "Ссылка"; 
    Команда.МножественныйВыбор = Ложь;
    Команда.Порядок = 1; // Указываем приоритет отображения в списке
КонецПроцедуры

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

Подготовка формы документа для работы с командами

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


&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуОтчета(Команда)
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

Передача контекста в отчет

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

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

Резюме

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

← На главную