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