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