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

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

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

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

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

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

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

Где находятся общие команды и как они устроены

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

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

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

Вызов общей команды через навигационную ссылку

Наиболее близкий к «настоящему» вызову способ — переход по служебной навигационной ссылке. У каждой общей команды есть адрес формата e1cib/command/ОбщаяКоманда.ИмяКоманды. Метод ПерейтиПоНавигационнойСсылке() глобального контекста заставляет платформу выполнить команду так, как если бы пользователь нажал её в интерфейсе.

Пример вызова из клиентского кода формы:

&НаКлиенте

Процедура ОткрытьНастройкиОбмена(Команда)

ПерейтиПоНавигационнойСсылке("e1cib/command/ОбщаяКоманда.НастройкиОбменаДанными");

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

Этот подход работает только на клиенте (тонкий, толстый, веб-клиент) и только в управляемом приложении. На сервере навигационные ссылки недоступны — там нет интерфейсного контекста. Если обработчик команды сам выполняет серверные действия, они будут вызваны изнутри обработчика уже после перехода.

Узнать точную ссылку команды можно в конфигураторе: свойство «Навигационная ссылка» недоступно напрямую, но адрес всегда строится по шаблону e1cib/command/ОбщаяКоманда.<Имя>. Убедитесь, что имя в ссылке совпадает с именем объекта метаданных с учётом регистра.

Вызов действия команды напрямую из кода

Если обработчик общей команды просто открывает форму, в большинстве случаев правильнее не эмулировать нажатие, а вызвать ОткрытьФорму() с теми же параметрами. Так код становится прозрачнее: видно, что именно открывается, и проще передавать параметры.

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

Пример рефакторинга. Было — логика в модуле команды:

// Модуль общей команды "ПечатьРеестра"

&НаКлиенте

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

ОткрытьФорму("Отчет.РеестрДокументов.Форма", Новый Структура("Период", ТекущаяДата()));

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

Стало — логика в общем модуле РаботаСОтчетамиКлиент:

// Общий модуль РаботаСОтчетамиКлиент

Процедура ОткрытьРеестрДокументов(Период) Экспорт

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

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

// Модуль общей команды — тонкая обёртка

&НаКлиенте

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

РаботаСОтчетамиКлиент.ОткрытьРеестрДокументов(ТекущаяДата());

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

Теперь тот же сценарий можно вызвать из любой формы: РаботаСОтчетамиКлиент.ОткрытьРеестрДокументов(НужнаяДата); — без привязки к команде и без навигационных ссылок.

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

Вызов команды из формы и добавление в интерфейс

Размещение команды на форме

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

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

Настройка командного интерфейса раздела

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

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

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

Почему команда не видна пользователю

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

Флажок видимости установлен

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

Команда снята с видимости или не добавлена в подсистему

Права в ролях
Норма

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

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

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

Функциональные опции
Норма

Опция, связанная с командой, включена

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

Опция выключена — команда недоступна во всём интерфейсе

Особенности обычного приложения и веб-клиента

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

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

Отдельный случай — запуск команды из внешних источников: из браузера, письма или другой программы. Для этого используется полный URL информационной базы с якорем навигационной ссылки, например http://server/base/#e1cib/command/ОбщаяКоманда.ИмяКоманды. Пользователь должен быть авторизован, иначе веб-клиент сначала покажет форму входа.

Способы вызова общей команды

ПерейтиПоНавигационнойСсылке

Максимально близко к нажатию пользователем; только клиент управляемого приложения, нельзя передать произвольные параметры

Прямой вызов ОткрытьФорму()

Полный контроль над параметрами и владельцем формы; подходит, если команда только открывает форму

Вызов процедуры общего модуля

Правильный вариант, когда нужна логика обработчика из сервера, фонового задания или другого кода

Кнопка на форме со ссылкой на команду

Для интерактивного вызова пользователем; не требует кода вообще

Типичные ошибки и их устранение

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

Вторая типичная ситуация — вызов ПерейтиПоНавигационнойСсылке() с директивой &НаСервере. Код компилируется, но в рантайме падает, потому что на сервере нет интерфейсного контекста. Выносите переход в клиентскую процедуру.

Третья ошибка — несовпадение имени команды в навигационной ссылке. Если команду переименовали, а строка ссылки в коде осталась старой, переход молча не сработает или откроет пустую страницу. После переименования команд ищите все вхождения старого имени по конфигурации (Глобальный поиск, Ctrl+Shift+F).

Типичные ошибки
01
Попытка вызвать модуль команды как общий модуль — ошибка компиляции; выносите логику в общий модуль
02
Вызов ПерейтиПоНавигационнойСсылке() на сервере — ошибка выполнения; переход возможен только на клиенте
03
Устаревшее имя команды в строке ссылки после переименования — переход не срабатывает; ищите вхождения глобальным поиском
04
Ожидание возврата значения от команды — обработчик команды ничего не возвращает; для получения результата используйте ОткрытьФормуМодально/описание оповещения

Как проверить, что вызов сработал

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

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

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

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

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

Общую команду нельзя вызвать как процедуру. Из клиентского кода управляемого приложения используйте ПерейтиПоНавигационнуюСсылке("e1cib/command/ОбщаяКоманда.Имя"). Для сервера и фоновых задач выносите логику обработчика в общий модуль и вызывайте её напрямую. Пользователю команду выводите через командный интерфейс подсистемы или кнопку на форме.

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

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

Нет, ссылка вида e1cib/command/... не поддерживает произвольные параметры. Параметризованные команды получают ПараметрКоманды только от платформы — из формы объекта соответствующего типа. Если нужны свои параметры, открывайте целевую форму напрямую через ОткрытьФорму() со структурой параметров.

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

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

Почему ПерейтиПоНавигационнойСсылке() не вызывает ошибку, но ничего не происходит?

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

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

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

Как добавить общую команду в избранное или на начальную страницу?

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

Работает ли вызов общей команды в мобильном клиенте?

Механизм навигационных ссылок в мобильном клиенте поддерживается с ограничениями и зависит от версии платформы. Надёжнее для мобильного решения вызывать действие команды напрямую — через ОткрытьФорму() или общий модуль — и тестировать на целевых устройствах.