К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как добавить на форму общую команду в 1С

Разбираем, как добавить общую команду на форму в 1С: настройка параметра команды, типов параметризации, обработчиков, отличия от команд формы и типичные ошибки разработчика.

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

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

Ниже разберем полный цикл работы: создание общей команды, настройку типов параметризации, написание обработчика, управление видимостью и различия от локальных команд формы. Материал применим к управляемым формам в конфигурациях на управляемом приложении (режим «Такси»).

Чем общая команда отличается от команды формы

Прежде чем добавлять команду, важно выбрать правильный механизм. Команда формы создается в редакторе конкретной формы и живет только внутри неё: обработчик пишется в модуле этой формы, а кнопку нужно вручную перетащить в дерево элементов. Такой подход оправдан, когда действие уникально для данной формы и активно использует её реквизиты и данные.

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

Общая команда или команда формы

Общая команда

Подходит для действий, повторяющихся на формах разных объектов: переход к отчетам, связанным спискам, обработкам. Логика пишется один раз, команда появляется автоматически по типу параметра.

Команда формы

Подходит для действий, специфичных для конкретной формы: пересчет реквизитов, работа с табличными частями, управление элементами формы. Требует ручного размещения кнопки и обработчика в модуле формы.

Параметризуемая команда объекта

Создается в свойствах самого объекта метаданных (справочника, документа). Промежуточный вариант: привязана к одному объекту, но доступна и из списка, и из формы элемента.

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

Создание общей команды в конфигураторе

Откройте конфигуратор и в дереве конфигурации найдите ветку «Общие» → «Общие команды». Через контекстное меню выберите «Добавить». Задайте имя команды по правилам именования метаданных (без пробелов, например ПоказатьДвиженияДокумента) и синоним — именно его увидит пользователь на кнопке.

В палитре свойств новой команды обратите внимание на ключевые свойства:

  • Тип параметра команды — составной тип, определяющий, на формах каких объектов появится команда. Можно указать несколько типов, например разные виды документов.
  • Режим использования параметра — «Одиночный» (команда работает с одним объектом) или «Множественный» (можно выделить несколько элементов в списке и передать массив).
  • Группа — определяет, в какую группу командной панели попадет кнопка (например, «Командная панель формы.Важное» или «Панель навигации»).
  • Картинка и Отображение — внешний вид кнопки.
  • Изменяет данные — если установлено, платформа будет предлагать сохранить объект перед выполнением команды.

После сохранения конфигурации откройте форму объекта нужного типа в режиме предприятия — команда должна появиться в командной панели без дополнительных действий. Если кнопки нет, причины разберем в разделе про типичные ошибки.

Настройка типа параметра команды

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

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

Как параметр попадает в обработчик

Когда пользователь нажимает кнопку на форме объекта, платформа определяет ключевой реквизит формы (основной реквизит типа «ДокументОбъект», «СправочникОбъект» и т. п.), берет его ссылку и передает в обработчик команды. Вам не нужно писать код для извлечения параметра — он уже доступен как аргумент процедуры.

Написание обработчика команды

Логика команды описывается в её модуле. Откройте палитру свойств команды и нажмите кнопку с изображением лупы у поля «Действие» либо перейдите на закладку «Модуль команды». Платформа создаст заготовку процедуры ОбработкаКоманды с двумя параметрами: ПараметрКоманды (ссылка или массив ссылок) и ПараметрыВыполненияКоманды (структура со сведениями об источнике вызова).

Типичный обработчик открывает другую форму, передавая в неё параметр. Пример — команда, открывающая отчет по движениям документа:

&НаКлиенте

Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии",

Новый Структура("Регистратор", ПараметрКоманды), Истина);

ОткрытьФорму("Отчет.ДвиженияДокумента.Форма",

ПараметрыФормы,

ПараметрыВыполненияКоманды.Источник,

ПараметрКоманды);

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

Обратите внимание на параметр ПараметрыВыполненияКоманды.Источник — это ссылка на форму-источник. Передавать её владельцем открываемой формы удобно, чтобы новое окно было логически связано с исходным. Четвертый аргумент ОткрытьФорму (ключ уникальности) не даст открыть несколько одинаковых окон для одного объекта.

bsl
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	ПоказатьВопрос(Новый ОписаниеОповещения("ПослеВопроса", ЭтотОбъект, ПараметрКоманды), "Выполнить действие для " + ПараметрКоманды + "?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

Если команда должна менять данные объекта (например, устанавливать признак или создавать связанный документ), выполняйте серверную часть через вызов серверной процедуры из общего модуля. В клиентском обработчике общей команды нельзя напрямую обращаться к запросам и методам записи объектов — это ограничение тонкого клиента.

Размещение команды на форме и управление видимостью

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

Если нужен нестандартный вариант — например, кнопка в конкретном месте формы рядом с полем, — придется добавить команду на форму вручную. В редакторе формы откройте закладку «Команды», закладку «Глобальные команды» (в некоторых версиях платформы — «Общие команды»), найдите нужную команду и перетащите её в дерево элементов формы. Платформа создаст кнопку, привязанную к этой команде, а обработчик по-прежнему останется в модуле общей команды.

Управление доступностью по правам

Видимость общей команды регулируется правами доступа. В роли можно снять право «Просмотр» (или «Использование», в зависимости от версии платформы) на конкретную общую команду — тогда кнопка исчезнет у пользователей с этой ролью. Дополнительно можно программно управлять видимостью кнопки, если она добавлена на форму вручную, через Элементы.ИмяКнопки.Видимость в обработчике ПриСозданииНаСервере.

Порядок добавления общей команды на формы объектов
  1. 1
    Создайте общую команду в ветке «Общие» → «Общие команды» и задайте имя и синоним
  2. 2
    В свойстве «Тип параметра команды» отметьте типы объектов, на формах которых нужна команда
  3. 3
    Выберите режим использования параметра: «Одиночный» или «Множественный»
  4. 4
    Напишите обработчик ОбработкаКоманды в модуле команды
  5. 5
    При необходимости настройте группу размещения, картинку и права доступа
  6. 6
    Обновите конфигурацию базы данных и проверьте появление кнопки на форме объекта в режиме предприятия

Проверка результата и типичные ошибки

После обновления конфигурации базы данных откройте в режиме предприятия форму объекта подходящего типа и форму списка. Команда должна быть видна в командной панели, а при нажатии — выполнять задуманное действие с корректным параметром. Проверьте оба режима: вызов из формы элемента и из списка, где параметр берется из текущей строки.

Контрольные точки

Как проверить результат

Кнопка на форме объекта
Норма

Команда видна в командной панели или панели навигации, нажатие вызывает обработчик

Тревожный признак

Кнопки нет — проверьте тип параметра команды и права доступа

Передаваемый параметр
Норма

В обработчик приходит ссылка на текущий объект (или массив при множественном режиме)

Тревожный признак

Параметр пустой или неверного типа — основной реквизит формы не соответствует типу параметра

Поведение при несохраненном объекте
Норма

Платформа предлагает записать объект перед выполнением (при установленном флаге «Изменяет данные») или команда корректно работает со ссылкой

Тревожный признак

В обработчик приходит пустая ссылка нового объекта, логика ломается

Типичные ошибки
01
Пустой «Тип параметра команды» — команда не появляется ни на одной форме объекта, разработчик ищет проблему в редакторе формы
02
Попытка найти обработчик в модуле формы — логика общей команды живёт только в модуле самой команды
03
В клиентском обработчике вызываются запросы или запись объектов — на тонком клиенте это приводит к ошибке компиляции или выполнения, серверную логику нужно выносить в общий модуль
04
Игнорирование случая нового несохраненного объекта — в параметр приходит пустая ссылка, и обработчик падает или открывает пустой отчет
05
Дублирование одной и той же логики в командах форм разных объектов вместо одной общей команды с составным типом параметра

Отдельная ситуация — команда видна, но при нажатии ничего не происходит. Чаще всего причина в исключении внутри обработчика, которое «проглатывается» оберткой платформы, либо в том, что открываемая форма блокируется правами. Включите отладку, поставьте точку останова в ОбработкаКоманды и проверьте, доходит ли выполнение до процедуры.

Итог

Что важно запомнить

Общая команда добавляется на форму не вручную, а через свойство «Тип параметра команды»: платформа сама показывает её на формах объектов подходящего типа. Логика описывается один раз в модуле команды, параметр приходит автоматически. Ручное перетаскивание в редакторе формы нужно только для нестандартного размещения кнопки.

Частые вопросы

Можно ли одной общей командой обслужить несколько видов документов?

Да. В свойстве «Тип параметра команды» отметьте несколько ссылочных типов — команда появится на формах всех перечисленных объектов. В обработчике при необходимости анализируйте тип параметра через ТипЗнч(ПараметрКоманды) и ветвите логику.

Почему команда не появилась на форме после обновления конфигурации?

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

Как передать в обработчик не ссылку, а данные формы?

Общая команда всегда получает ссылку (или массив ссылок) — механизм параметризации не передает данные формы напрямую. Если нужны несохраненные изменения формы, используйте команду формы с обработчиком в модуле формы либо в обработчике общей команды обращайтесь к ПараметрыВыполненияКоманды.Источник, чтобы взаимодействовать с формой-источником.

Чем общая команда отличается от команды, созданной в свойствах документа?

Команда объекта (на закладке «Команды» в палитре свойств документа или справочника) привязана к одному виду объектов, а общая команда — к произвольному набору типов. По механизме обработки они похожи: обе получают параметр-ссылку и имеют модуль команды. Если действие нужно только для одного объекта, команда объекта логичнее; для нескольких — общая.

Можно ли скрыть общую команду для части пользователей?

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

Работает ли общая команда в обычном приложении?

Механизм общих команд с автоматической параметризацией ориентирован на управляемые формы. В обычном приложении переиспользуемые действия традиционно реализуются через кнопки командных панелей и общие модули, а современные свойства общих команд рассчитаны на управляемый интерфейс. Для новых разработок ориентируйтесь на управляемые формы.