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