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