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