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