Разработка и Конфигурация · 7 мин
1С: как вызвать общую команду программно
Как программно вызвать общую команду в 1С: вызов модуля команды, перенос логики в общий модуль, работа с БСП. Примеры кода, ошибки и FAQ.
Общая команда в 1С — объект конфигурации, который добавляет кнопку в интерфейс форм, панель навигации или меню. При нажатии платформа выполняет экспортную процедуру ОбработкаКоманды из модуля команды. Но в отличие от кнопок формы, у общей команды нет встроенного метода вида «ВыполнитьКоманду» в глобальном контексте, поэтому программный вызов требует обходных приёмов.
Задача возникает регулярно: нужно повторно использовать логику команды из другого кода, запустить её по условию при открытии формы, из регламентного задания или из обработчика события. Ниже разобраны рабочие способы, их ограничения и типовые ошибки, которые приводят к ошибкам компиляции или падению кода в клиентском контексте.
Как устроена общая команда и почему её нельзя «нажать» из кода
Общая команда состоит из настроек отображения (группа командной панели, картинка, тип параметра команды) и модуля команды. В модуле обязательна процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) — именно её платформа вызывает при нажатии кнопки в интерфейсе.
Ключевое ограничение: команда — элемент интерфейса, а не прикладной объект. У неё нет менеджера объекта, нет метода выполнения через глобальный контекст, и нельзя программно «кликнуть» по кнопке командной панели формы. Поэтому все способы сводятся к вызову кода, который стоит за командой, а не самой команды как объекта метаданных.
Это важно понимать при проектировании: если логика команды нужна не только из интерфейса, её с самого начала следует размещать в общем модуле, а не в модуле команды.
Способ 1. Вызов процедуры ОбработкаКоманды напрямую
Модуль общей команды доступен из кода по имени объекта метаданных, аналогично общему модулю. То есть можно обратиться к его экспортной процедуре напрямую:
// Клиентский вызов из другого модуля
ПараметрыВыполнения = Новый Структура("Источник, Уникальность, Окно, НавигационнаяСсылка",
Неопределено, Ложь, Неопределено, Неопределено);
МояОбщаяКоманда.ОбработкаКоманды(СсылкаНаДокумент, ПараметрыВыполнения);
Здесь МояОбщаяКоманда — имя общей команды в дереве конфигурации. Первый параметр — то, что команда получила бы как параметр (ссылка, массив ссылок или Неопределено, если тип параметра не задан). Второй — структура, имитирующая ПараметрыВыполненияКоманды, которую платформа обычно заполняет сама.
Ограничения способа: контекст выполнения должен совпадать. Если модуль команды скомпилирован только в клиентском контексте (директива &НаКлиенте), вызвать его из серверного кода или фонового задания нельзя. Также код, который опирается на содержимое ПараметрыВыполненияКоманды.Источник (например, обращается к форме-владельцу), при программном вызове получит Неопределено и может упасть.
Способ 2. Перенос логики в общий модуль — рекомендуемый подход
Правильная архитектура для переиспользуемой логики: модуль команды содержит только вызов общего модуля, а вся работа выполняется там. Тогда любой код — клиентский, серверный, регламентное задание — вызывает ту же процедуру без посредников.
// Модуль общей команды
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Экспорт
МойОбщийМодульКлиент.ВыполнитьОбработкуДокументов(ПараметрКоманды);
КонецПроцедуры
// Общий модуль МойОбщийМодульКлиент
Процедура ВыполнитьОбработкуДокументов(МассивДокументов) Экспорт
// основная логика
КонецПроцедуры
При таком устройстве программный вызов тривиален: МойОбщийМодульКлиент.ВыполнитьОбработкуДокументов(Документы). Не нужно конструировать фиктивные ПараметрыВыполненияКоманды, не возникает проблем с контекстом компиляции команды, а логику проще тестировать.
Способ 3. Подключаемые команды БСП
Если конфигурация построена на Библиотеке стандартных подсистем, команды печати, заполнения и отчётов подключаются через механизм «Подключаемые команды». Их программный вызов выполняется через программный интерфейс подсистемы, а не через модуль команды.
Например, для формирования печатной формы без участия пользователя используется серверный программный интерфейс модуля УправлениеПечатью — процедуры формирования печатных форм по идентификатору макета. Это надёжнее, чем имитация нажатия кнопки «Печать», потому что не зависит от состава формы и прав пользователя на интерфейс.
Общий принцип тот же: ищите программный интерфейс подсистемы (модули с постфиксом «Клиент», «ВызовСервера», «Переопределяемый»), а не пытайтесь дёрнуть команду как элемент интерфейса.
Проверка результата и типичные ошибки
После внедрения программного вызова проверьте три вещи: команда по-прежнему работает из интерфейса, программный вызов отрабатывает в нужном контексте, и оба пути дают одинаковый результат в данных (созданные документы, записи регистров, печатные формы).
Как проверить результат
Команда выполняется как раньше
Ошибка после переноса логики в общий модуль
Код отрабатывает без исключений, данные создаются
Ошибка контекста или неопределённая процедура
Идентичные объекты и записи в базе
Разное поведение — логика продублирована и разошлась
Частые вопросы
Можно ли программно «нажать» кнопку общей команды на форме?
Нет, у формы нет метода для программного нажатия кнопки командной панели, связанной с общей командой. Вместо этого вызовите процедуру, которая стоит за командой, — напрямую из модуля команды или из общего модуля.
Почему при вызове модуля команды возникает «Процедура или функция не определена»?
Чаще всего несовпадение контекстов: модуль команды компилируется только на клиенте, а вызов идёт с сервера или из фонового задания. Проверьте директивы компиляции и при необходимости вынесите серверную часть в общий модуль с флагом «Сервер».
Что передавать в ПараметрыВыполненияКоманды при прямом вызове?
Структуру с ключами Источник, Уникальность, Окно, НавигационнаяСсылка. Если код команды не использует эти значения, допустимо передать Неопределено вместо всей структуры — зависит от реализации конкретной ОбработкаКоманды.
Как вызвать логику команды из регламентного задания?
Только через общий серверный модуль: регламентные задания выполняются на сервере без клиентского контекста, поэтому модуль команды и любые клиентские модули там недоступны. Интерактивные действия (открытие форм, вопросы пользователю) из задания невозможны в принципе.
Можно ли вызвать команду печати БСП программно?
Да, через программный интерфейс модуля УправлениеПечатью: сформировать печатную форму по идентификатору команды печати и массиву объектов. Это устойчивее, чем имитация нажатия кнопки, и работает в том числе на сервере.
Что важно запомнить
Общую команду нельзя выполнить как объект — вызывают код, который за ней стоит. Лучшее решение: логика в общем модуле, модуль команды — тонкая обёртка. Прямой вызов ОбработкаКоманды допустим, но требует совпадения контекстов и корректных параметров.