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