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