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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавление общей команды в раздел
  1. 1
    Создайте общую команду в ветке «Общие» → «Общие команды» и заполните обработчик ОбработкаКоманды
  2. 2
    Укажите группу команд, например «Панель навигации» или «Командная панель формы»
  3. 3
    Откройте свойства подсистемы, перейдите в «Командный интерфейс» и включите команду флажком
  4. 4
    Обновите конфигурацию базы данных и проверьте появление команды в разделе под пользователем с нужными правами

Как вызвать общую команду программно

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

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

Пример типовой организации кода:

// Общий модуль ОбработкаЗаказов (Сервер)

Процедура СформироватьОтчетПоЗаказу(ЗаказСсылка) Экспорт

// логика формирования

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

// Модуль общей команды

&НаКлиенте

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

ОбработкаЗаказов.СформироватьОтчетПоЗаказу(ПараметрКоманды);

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

bsl
// Чтение свойств общей команды
Команда = ОбщиеКоманды.ОтправитьПоПочте;
ЗаголовокКнопки = Команда.Создать().Синоним;

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

Параметр команды приходит в обработчик первым аргументом — ПараметрКоманды. Что именно туда попадёт, определяет свойство команды «Тип параметра команды». Если указан, например, «ДокументСсылка.ЗаказПокупателя», то при вызове команды из формы списка или формы документа платформа автоматически передаёт ссылку на текущий или выделенные объекты.

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

Права доступа и видимость команды

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Передача параметра
Норма

В ПараметрКоманды приходит ссылка на текущий объект

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

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

Выполнение логики
Норма

Обработчик отрабатывает без ошибок, данные изменяются корректно

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

Ошибка прав доступа или вызова сервера — пересмотрите права и структуру модулей

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

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

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

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

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

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

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

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

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

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

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

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

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

Итог

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

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