В чем разница между командами объекта и командами формы в 1С и что выбрать

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

В процессе разработки на платформе 1С:Предприятие 8.3 (Управляемые формы) перед программистом часто встает дилемма: создать команду непосредственно внутри формы или добавить её в дерево метаданных к самому объекту (справочнику, документу и т.д.). На первый взгляд, результат для пользователя одинаков — он видит кнопку, нажимает на неё и получает результат. Однако «под капотом» эти механизмы работают совершенно по-разному. Разберем детально, в чем заключаются технические и методологические различия этих подходов.

Команда формы: локальный инструмент для конкретной задачи

Когда мы создаем команду в редакторе формы (вкладка «Команды» -> «Команды формы»), мы создаем локальный обработчик, который «живет» только в контексте этого окна. Это классический способ реализации логики, которая не выходит за пределы текущей формы.

Рассмотрим основные особенности команд формы:

  1. Ограниченная область видимости: Эта команда недоступна нигде, кроме той формы, в которой она создана. Если вам нужно аналогичное действие в форме списка и в форме элемента, вам придется либо дублировать команду, либо использовать другие механизмы.
  2. Прямой доступ к данным формы: Обработчик команды формы имеет легкий доступ к реквизитам формы через Объект или напрямую к элементам управления.
  3. Отсутствие индивидуальных прав: На команду формы нельзя назначить отдельные права доступа в роли. Видимость кнопки обычно регулируется программно или через права на саму форму/объект.

Команда объекта: универсальность и интеграция в интерфейс

Добавление команды в дерево конфигурации (ветка «Команды» внутри конкретного объекта метаданных) — это более мощный инструмент. Такие команды называют «подключаемыми» или «командами метаданных».

Проанализируем преимущества команды объекта:

  1. Глобальное присутствие: Создав одну команду у справочника Товары, мы можем отобразить её во всех формах этого справочника: в списках, в формах выбора и в формах элемента. Более того, платформа может автоматически добавить её в командную панель.
  2. Управление правами: Для каждой такой команды в дереве ролей можно настроить право «Просмотр». Если у пользователя нет прав на команду, платформа сама скроет кнопку из интерфейса во всех формах.
  3. Групповая обработка данных: Это критически важное техническое отличие. Команда объекта может работать с массивом ссылок. Если в свойствах команды «Тип параметра команды» указать массив, пользователь сможет выделить в списке несколько строк, нажать кнопку, и процедура обработает все выбранные объекты сразу.

Рассмотрим пример кода обработчика команды объекта, который принимает массив ссылок:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    // ПараметрКоманды содержит массив ссылок, если выбрано несколько строк
    Для Каждого СсылкаИзСписка Из ПараметрКоманды Цикл
        Сообщить("Обработка объекта: " + СсылкаИзСписка);
    КонецЦикла;
КонецПроцедуры

Методологические различия и стандарты разработки

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

Разберем по шагам, на что влияет выбор типа команды:

1. Использование функциональных опций. Команды объекта можно привязывать к функциональным опциям напрямую в конфигураторе. Если в настройках программы отключена какая-то подсистема, кнопка исчезнет автоматически везде. Для команд формы вам пришлось бы писать код в процедуре ПриСозданииНаСервере для каждой формы.

2. Автоматическое размещение. У команд объекта есть свойство «Группа». Мы можем жестко задать, где появится кнопка: в «Панели навигации» (слева), в «Панели действий» (сверху) или в специфических группах формы, таких как «Печать», «Отчеты» или «Создать на основании». Это обеспечивает единообразие интерфейса: пользователь всегда знает, что кнопки печати находятся в одном и том же месте во всех документах.

3. Работа с контекстом. Обработчик команды объекта получает параметр ПараметрыВыполненияКоманды, который содержит уникальный идентификатор формы-владельца и другие полезные данные. Это позволяет открывать новые окна или возвращать результаты корректно, сохраняя модульность кода.

Сравнение команд в контексте расширений и доработок

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

Когда и что использовать: краткое резюме

Чтобы окончательно определиться с выбором, проанализируем типичные сценарии:

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


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

В данном примере ПараметрыВыполненияКоманды.Источник позволяет платформе понять, откуда был вызван отчет, и корректно связать окна в интерфейсе. Таким образом, команды объекта — это не просто «другой способ повесить процедуру на кнопку», а полноценный инструмент проектирования интерфейса управляемого приложения.

← На главную