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

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

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

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

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

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

Как устроена общая команда и почему её нельзя «нажать» из кода

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

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

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

Способ 1. Вызов процедуры ОбработкаКоманды напрямую

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

// Клиентский вызов из другого модуля

ПараметрыВыполнения = Новый Структура("Источник, Уникальность, Окно, НавигационнаяСсылка",

Неопределено, Ложь, Неопределено, Неопределено);

МояОбщаяКоманда.ОбработкаКоманды(СсылкаНаДокумент, ПараметрыВыполнения);

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

Ограничения способа: контекст выполнения должен совпадать. Если модуль команды скомпилирован только в клиентском контексте (директива &НаКлиенте), вызвать его из серверного кода или фонового задания нельзя. Также код, который опирается на содержимое ПараметрыВыполненияКоманды.Источник (например, обращается к форме-владельцу), при программном вызове получит Неопределено и может упасть.

Способ 2. Перенос логики в общий модуль — рекомендуемый подход

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

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

&НаКлиенте

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

МойОбщийМодульКлиент.ВыполнитьОбработкуДокументов(ПараметрКоманды);

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

// Общий модуль МойОбщийМодульКлиент

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

// основная логика

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

При таком устройстве программный вызов тривиален: МойОбщийМодульКлиент.ВыполнитьОбработкуДокументов(Документы). Не нужно конструировать фиктивные ПараметрыВыполненияКоманды, не возникает проблем с контекстом компиляции команды, а логику проще тестировать.

Способ 3. Подключаемые команды БСП

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

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

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

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

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

Типичные ошибки
01
Вызов клиентского модуля команды из серверного кода — ошибка компиляции «Процедура или функция не определена»
02
Передача пустой структуры ПараметрыВыполненияКоманды, когда код ожидает форму-источник — падение на обращении к свойствам Неопределено
03
Дублирование логики: часть в модуле команды, часть в общем модуле — расхождение поведения кнопки и программного вызова
04
Попытка найти метод ВыполнитьКоманду в глобальном контексте — такого метода у платформы для общих команд нет
Контрольные точки

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

Нажатие кнопки в интерфейсе
Норма

Команда выполняется как раньше

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

Ошибка после переноса логики в общий модуль

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

Код отрабатывает без исключений, данные создаются

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

Ошибка контекста или неопределённая процедура

Сравнение результатов двух путей
Норма

Идентичные объекты и записи в базе

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

Разное поведение — логика продублирована и разошлась

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

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

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

Почему при вызове модуля команды возникает «Процедура или функция не определена»?

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

Что передавать в ПараметрыВыполненияКоманды при прямом вызове?

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

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

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

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

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

Итог

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

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