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

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

Глобальные параметризуемые команды в 1С: пошаговое руководство

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

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

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

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

Что такое глобальная параметризуемая команда и когда она нужна

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

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

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

Откройте конфигуратор, разверните ветку «Общие → Общие команды» и добавьте новую команду. Задайте имя и синоним — синоним увидит пользователь в интерфейсе. Затем заполните ключевые свойства:

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

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

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

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

Минимальный обработчик открывает форму обработки и передаёт в неё полученный параметр. Важно передавать параметр через структуру параметров формы — тогда на стороне обработки его можно прочитать в событии «ПриСозданииНаСервере».

&НаКлиенте

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

Если ПараметрКоманды = Неопределено Тогда

ПоказатьПредупреждение(, "Команда вызвана без параметра.");

Возврат;

КонецЕсли;

ПараметрыФормы = Новый Структура("ДокументОснование", ПараметрКоманды);

ОткрытьФорму("Обработка.ПроверкаДокумента.Форма", ПараметрыФормы,

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

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

ПараметрыВыполненияКоманды.Окно);

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

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

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

Где команда появится в интерфейсе

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

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

Передача параметра из формы списка и множественный режим

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

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

Маршрут решения

Как выбрать режим параметра

Команда работает с одним объектом из формы документа или элемента справочникаИспользуйте одиночный режим и проверяйте параметр на Неопределено
Команда должна обрабатывать несколько выделенных строк спискаИспользуйте множественный режим и обрабатывайте массив на сервере
Команда нужна и в формах, и глобально в панели действийСоздайте одну команду, но предусмотрите ветку поведения при пустом параметре

Добавление команды через расширение конфигурации

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

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

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

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

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

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

Вызов из формы документа
Норма

В обработчик приходит ссылка на открытый документ

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

Параметр равен Неопределено — типы не совпадают

Вызов из списка с выделением строк
Норма

В множественном режиме приходит массив ссылок

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

Приходит одна ссылка или пустое значение — неверный режим

Повторное нажатие кнопки
Норма

Открывается то же окно или обновляется существующее

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

Плодятся дубликаты окон — не переданы Источник и Уникальность

Типичные ошибки
01
Не задан тип параметра команды — команда становится обычной глобальной и ничего не получает на вход
02
Несовпадение типа параметра с типом основного реквизита формы — в обработчик приходит Неопределено
03
Открытие формы без передачи Источника и Уникальности — дубли окон при повторных нажатиях
04
Обработка массива ссылок в клиентском коде циклом с обращениями к серверу — резкое падение производительности
05
Команда добавлена, но не размещена ни в одной подсистеме и ни в одной форме — пользователь её просто не видит

Отдельная частая проблема — права доступа. Если у пользователя нет права на обработку, которую открывает команда, он получит ошибку нарушения прав. Проверяйте роли на все объекты, задействованные в цепочке вызова: сама команда, открываемая обработка или отчёт, читаемые данные.

FAQ: частые вопросы о параметризуемых командах

Чем параметризуемая команда отличается от обычной глобальной?

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

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

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

Почему в обработчик приходит Неопределено?

Чаще всего тип параметра команды не совпадает с типом основного реквизита формы, из которой она вызвана, либо команда вызвана из контекста, где параметра нет в принципе (например, из панели действий раздела). Добавьте в обработчик проверку на Неопределено с понятным сообщением пользователю.

Как добавить такую команду, не снимая конфигурацию с поддержки?

Создайте расширение конфигурации, добавьте в него общую команду с типом параметра и обработчиком, затем разместите её в подсистеме расширения или на заимствованной форме. Альтернатива — механизм подключаемых команд БСП, если он используется в вашей конфигурации.

Работает ли механизм в тонком и веб-клиенте?

Да, общие команды и их параметры поддерживаются во всех клиентах управляемого приложения. Ограничения касаются лишь кода обработчика: он должен быть написан с учётом доступности методов в соответствующем клиенте и не использовать модальные вызовы без учёта режима модальности.

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

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

Итог

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

Глобальная параметризуемая команда создаётся как общая команда с заполненным типом параметра. Платформа сама передаёт в обработчик ссылку текущего объекта или массив выделенных строк. Проверяйте параметр на Неопределено, передавайте Источник и Уникальность при открытии форм, а доработки типовых конфигураций выполняйте через расширения.