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

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

Как обратиться к общей команде в 1С

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

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

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

Ниже разобраны основные сценарии: поиск команды в метаданных, вызов её обработчика, добавление команды на форму, передача параметров и типичные ошибки, из-за которых код «не видит» команду.

Что такое общая команда и где она хранится

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

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

КомандаМетаданные = Метаданные.ОбщиеКоманды.Найти("ОткрытьНастройкиОбмена");

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

ВызватьИсключение "Общая команда не найдена в конфигурации";

КонецЕсли;

Как программно выполнить действие общей команды

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

Допустим, команда «ПечатьПрайса» имеет модуль команды «ПрайсЛистКлиент» с процедурой ОбработкаКоманды. Тогда из любого клиентского контекста вызов выглядит так:

ПрайсЛистКлиент.ОбработкаКоманды(ПараметрКоманды, Неопределено);

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

Обращение к общей команде из формы

На управляемой форме общая команда появляется автоматически, если у неё заполнено свойство «Тип параметра команды», а тип основного реквизита формы входит в этот состав. Например, команда с типом параметра «ДокументСсылка.РеализацияТоваровУслуг» сама отобразится в командной панели формы документа и в списке документов.

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

ЭлементКнопка = Элементы.Найти("ПечатьПрайса");

Если ЭлементКнопка <> Неопределено Тогда

ЭлементКнопка.Видимость = ПользователюДоступнаПечать();

КонецЕсли;

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

Как подключить общую команду к форме
  1. 1
    Откройте общую команду и заполните свойство «Тип параметра команды» нужным типом ссылки
  2. 2
    Убедитесь, что в свойстве «Модуль команды» указан общий модуль с процедурой ОбработкаКоманды
  3. 3
    Откройте форму объекта и проверьте, что команда появилась в командной панели автоматически
  4. 4
    Если команды нет — перетащите её вручную из списка глобальных команд в редакторе формы
  5. 5
    Запустите режим предприятия и проверьте, что кнопка выполняет обработчик с правильным параметром

Передача параметров в команду

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

Когда требуется передать произвольную структуру данных, общая команда не подходит как транспорт — вместо этого в обработчике открывают форму обработки с параметрами:

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

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

ОткрытьФорму("Обработка.ПодготовкаОтгрузки.Форма", ПараметрыФормы,

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

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

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

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

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

Обращение к команде из командного интерфейса и подсистем

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

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

Типичные ошибки при обращении к общей команде

Самая частая проблема — попытка вызвать команду как функцию: ОбщиеКоманды.МояКоманда(). Такой коллекции в глобальном контексте нет, и код падает с ошибкой. Правильные пути — Метаданные.ОбщиеКоманды для свойств и прямой вызов обработчика для выполнения.

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

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

Проверка результата и FAQ

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

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

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

Видимость команды на форме
Норма

Кнопка есть в командной панели у пользователя с нужной ролью

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

Кнопки нет — проверить тип параметра, права и функциональные опции

Параметр в обработчике
Норма

ПараметрКоманды содержит ссылку или массив ссылок ожидаемого типа

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

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

Программный вызов
Норма

Обработчик выполняется из модуля формы без ошибок компиляции

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

Ошибка «метод не обнаружен» — неверное имя модуля или контекст сервера/клиента

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

Штатного метода нет. Создайте соответствие: ключ — имя команды, значение — вызов конкретного обработчика, и ищите по нему. Это безопаснее Выполнить().

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

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

Итог

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

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

Как вызвать обработчик общей команды из модуля объекта?

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

Почему общая команда не отображается в списке документов?

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

Как передать в общую команду несколько параметров?

Напрямую — никак, параметр команды один. Сделайте тип параметра составным для разных ссылок либо в обработчике откройте форму обработки со структурой произвольных параметров, собранной из контекста источника.

Можно ли программно скрыть кнопку общей команды на одной форме?

Да: в модуле формы найдите элемент по имени команды через Элементы.Найти() и установите Видимость = Ложь. Для скрытия во всей системе используйте функциональные опции или права — это надёжнее точечного кода.

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

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