При разработке отчетов на базе Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с тем, что у отчета отсутствует собственная форма. Вместо этого система использует общую форму отчета, которая предоставляет стандартный интерфейс и функционал. Это удобно для унификации, но создает сложности, когда требуется добавить специфическое поведение, например, внедрить собственные пункты в контекстное меню поля табличного документа (результата отчета).
В этой статье мы разберем методически верные способы решения этой задачи, проанализируем возможности переопределяемых модулей и рассмотрим использование расширений как наиболее гибкого инструмента.
Прежде всего, выясним причину затруднения. В типовых конфигурациях (ERP, УТ, КА, БП) большинство отчетов не имеют созданных в конфигураторе форм. В корне конфигурации назначена Основная форма отчета, которая ведет к объекту ОбщаяФорма.ФормаОтчета. Поскольку эта форма является общей, любые изменения в ней затронут все отчеты в системе. Наша задача — добавить команду так, чтобы она работала либо для всех отчетов, либо для конкретного, не нарушая логику работы БСП.
Рассмотрим пошагово, как реализовать добавление команды в контекстное меню элемента Результат.
Поскольку нам нужно не только добавить кнопку в меню, но и прописать для нее процедуру-обработчик, использование расширения является самым «чистым» и эффективным способом. Это связано с тем, что обработчик команды формы должен физически находиться в модуле этой формы, а в случае с БСП — это модуль общей формы.
Выполним следующие шаги:
ФормаОтчета.ПриСозданииНаСервере (после выполнения основного кода).Разберем пример кода, который программно добавляет команду и пункт меню:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// 1. Создаем новую команду формы
ИмяКоманды = "МояСпециальнаяКоманда";
НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "Подключить_МояСпециальнаяКоманда";
НоваяКоманда.Заголовок = "Выполнить спец. действие";
// 2. Добавляем кнопку в контекстное меню поля "Результат"
// Поле табличного документа в типовых БСП обычно называется "Результат"
ЭлементРезультат = ЭтаФорма.Элементы.Найти("Результат");
Если ЭлементРезультат <> Неопределено Тогда
НоваяКнопка = ЭтаФорма.Элементы.Добавить("КонтекстноеМенюРезультат_МояКоманда", Тип("КнопкаФормы"), ЭлементРезультат.КонтекстноеМеню);
НоваяКнопка.ИмяКоманды = ИмяКоманды;
КонецЕсли;
КонецПроцедуры
Теперь проанализируем ситуацию с обработчиком. Нам нужно создать процедуру на клиенте в том же модуле расширения формы:
&НаКлиенте
Процедура Подключить_МояСпециальнаяКоманда(Команда)
// Получаем текущую область табличного документа
ТекущаяОбласть = Элементы.Результат.ТекущаяОбласть;
Если ТекущаяОбласть <> Неопределено Тогда
Сообщить("Вы нажали на ячейку с текстом: " + ТекущаяОбласть.Текст);
// Здесь размещаем вашу бизнес-логику
КонецЕсли;
КонецПроцедуры
Важный момент: если вы хотите, чтобы команда появлялась только в конкретном отчете, добавьте условие по имени объекта в начало процедуры ПриСозданииНаСервере, используя свойство Отчет.Метаданные().Имя.
Если по каким-то причинам использование расширений ограничено, можно обратиться к методике БСП через общие модули. В БСП существует модуль ФормаОтчетаПереопределяемый. Процедура ПриСозданииНаСервере в этом модуле вызывается при инициализации любой формы отчета.
Посмотрим, как это выглядит. Однако помните о замечании из обсуждения: добавить кнопку можно, но назначить обработчик, который находится вне модуля формы, напрямую не получится. Тем не менее, этот способ подходит для регистрации команд, которые обрабатываются через стандартные механизмы БСП.
Рассмотрим алгоритм действий в модуле ФормаОтчетаПереопределяемый:
ПриСозданииНаСервере.Но как решить проблему с обработчиком? В БСП 2.4+ и выше можно использовать механизм Подключаемых команд. Если ваша команда зарегистрирована в модуле менеджера отчета через процедуру ПриОпределенииКомандПодключенныхКОбъекту, система сама позаботится о ее размещении. Однако стандартно они попадают в командную панель, а не в контекстное меню.
Выясним причину, по которой вам может понадобиться контекстное меню. Если цель — предоставить пользователю выбор действий при нажатии на данные в отчете, то зачастую правильнее использовать механизм расшифровки. Это штатный способ 1С, который не требует взлома контекстного меню табличного документа.
Проанализируем ситуацию: при клике на ячейку в отчете БСП вызывает стандартное окно расшифровки. Мы можем программно добавить туда свои пункты в модуле объекта отчета:
// В модуле объекта отчета
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Стандартная инициализация компоновщика
КонецПроцедуры
Чтобы добавить свои действия в список расшифровки, нужно перехватить событие РезультатОбработкаРасшифровки в общей форме (через расширение) или настроить параметры расшифровки в самой схеме компоновки данных (СКД). В СКД можно указать конкретные поля, для которых будет доступно действие, и передать в них значения параметров, которые потом будут считаны вашим кодом.
Подведем итоги нашего исследования:
Элементы.Результат.КонтекстноеМеню и сразу прописать обработчик в этом же модуле.ФормаОтчетаПереопределяемый, но будьте готовы к сложностям с описанием клиентских обработчиков (часто приходится все равно прибегать к расширению клиента).Используя приведенные примеры кода, вы сможете гибко настраивать интерфейс отчетов на БСП, сохраняя при этом возможность легкого обновления конфигурации.