Как добавить кнопку на все формы в 1С:ERP: подробное руководство

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

При разработке в крупных конфигурациях, таких как 1С:ERP Управление предприятием 2, часто возникает задача добавить универсальный функционал, доступный из любой формы — будь то документ, справочник или форма списка. Это может быть кнопка вызова справочной системы, форма обратной связи или сервис логирования изменений. Однако начинающие разработчики часто сталкиваются с техническим ограничением платформы: обработчик команды кнопки должен находиться строго в модуле той формы, где эта кнопка расположена. Попытка назначить действие процедуре из общего модуля напрямую при программном создании команды приведет к ошибке.

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

Метод 1. Использование механизма «Подключаемых команд» БСП

Этот способ является наиболее «правильным» с точки зрения архитектуры современных конфигураций (ERP, КА, УТ 11). Механизм подключаемых команд позволяет централизованно внедрять кнопки в формы различных объектов без изменения кода самих форм. Разберем этот процесс по шагам.

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

Рассмотрим пример кода, который позволит добавить кнопку «Моя команда» во все документы системы:


Процедура ПриОпределенииКомандПодключенныхКОбъектам(Настройки) Экспорт

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

КонецПроцедуры

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

Метод 2. Перехват выполнения через расширение (AOP-подход)

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

Разберем, как реализовать «инъекцию» кода:

  1. Создадим расширение для конфигурации.
  2. Добавим в расширение общий модуль ПодключаемыеКомандыКлиент.
  3. Используем аннотацию &Вместо для процедуры ВыполнитьКоманду или НачатьВыполнениеКоманды (в зависимости от версии БСП).

Проанализируем пример кода в расширении:


&Вместо("НачатьВыполнениеКоманды")
Процедура расшир_НачатьВыполнениеКоманды(Форма, Команда, Источник = Неопределено)
    
    // Проверяем, наша ли это команда по идентификатору
    Если Команда.Имя = "ПодключеннаяКоманда_МояУниверсальнаяКнопка" Тогда
        // Вызываем нашу общую форму или выполняем код
        ПараметрыФормы = Новый Структура("ИмяИсходнойФормы", Форма.ИмяФормы);
        ОткрытьФорму("ОбщаяФорма.МояОбщаяФорма", ПараметрыФормы);
        Возврат; // Прерываем дальнейшее выполнение стандартного механизма
    КонецЕсли;

    // Если команда не наша, передаем управление стандартному коду
    ПродолжитьВызов(Форма, Команда, Источник);
    
КонецПроцедуры

Этот подход позволяет кнопке появиться на всех формах, где внедрена подсистема «Подключаемые команды», и при этом нам не нужно писать ни одной строчки кода в самих формах объектов.

Метод 3. Создание «Общей команды»

Если нам нужно решение с минимальным использованием кода, можно воспользоваться объектом метаданных Общая команда. Это стандартный путь платформы 1С для добавления кнопок во множество форм сразу.

Рассмотрим алгоритм настройки:

  1. В дереве метаданных перейдем в раздел Общие -> Общие команды и создадим новую команду.
  2. В свойстве Группа выберем подходящее место, например, Панель навигации формы.Обычное или Командная панель формы.Важное.
  3. Тип параметра команды: это критически важный пункт. Если мы хотим, чтобы кнопка была везде, можно выбрать ЛюбаяСсылка. Однако в ERP часто требуется ограничить список только справочниками и документами.
  4. Режим использования параметра: установим значение Множественный. Это позволит кнопке корректно отображаться и в формах списков (для работы с выделенными строками), и в формах объектов.

Выясним причину, по которой этот метод может быть неудобен в ERP: составной тип данных. Если в конфигурации тысячи объектов, выбор их вручную в свойстве «Тип параметра команды» превращается в рутину. К тому же, при появлении новых документов в обновлениях ERP, их придется добавлять в этот список вручную.

Тем не менее, в модуле такой команды мы легко можем получить контекст формы через параметр ПараметрКоманды:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    // ПараметрыВыполненияКоманды.Источник содержит ссылку на форму, из которой вызвана команда
    ИмяФормы = ПараметрыВыполненияКоманды.Источник.ИмяФормы;
    
    Сообщить("Команда вызвана из формы: " + ИмяФормы);
    
    // Открываем общую форму
    ОткрытьФорму("ОбщаяФорма.НашаФорма", Новый Структура("ИмяФормы", ИмяФормы));
    
КонецПроцедуры

Сравнение подходов и рекомендации

Проанализируем ситуацию выбора метода в зависимости от условий задачи:

1. Если нужно "быстро и просто": используем Общие команды. Это штатный механизм платформы, не требующий написания сложных перехватчиков. Основной минус — необходимость поддержки списка типов объектов в конфигураторе.

2. Если нужно "профессионально и масштабируемо": используем механизм БСП (Подключаемые команды). Это обеспечит бесшовную интеграцию в интерфейс ERP, кнопка будет выглядеть как родная часть системы, и она автоматически появится во всех новых объектах, если использовать программный перебор метаданных при регистрации.

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

Важные замечания по производительности

При использовании программного добавления кнопок через ПриСозданииНаСервере или перебор метаданных, следует учитывать следующие моменты:

Таким образом, мы разобрали основные сценарии внедрения универсальной кнопки в 1С:ERP. Выбор конкретного пути зависит от ваших требований к гибкости настройки и готовности работать с расширениями конфигурации.

← На главную