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

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

Как выполнить команду на форме 1С

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

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

Основная сложность в том, что платформа 1С не предоставляет универсального метода вида «выполнить команду по имени» для всех случаев. Подход зависит от типа команды: стандартная команда объекта, команда формы, созданная разработчиком, или глобальная команда интерфейса. Ниже разобраны рабочие варианты для управляемых форм, даны проверки результата и типичные ошибки.

Какие команды существуют на форме 1С

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

Первая категория — команды формы, созданные разработчиком в дереве команд формы (панель «Команды» в редакторе формы). У каждой такой команды есть имя, обработчик «Действие» в модуле формы и, как правило, кнопка в командной панели. Вторая категория — стандартные команды объекта: Записать, Провести, Печать и другие, которые платформа добавляет автоматически для документов, справочников и регистров. Третья категория — глобальные команды интерфейса и команды из общих команд конфигурации, доступные из разных форм.

Как выполнить команду формы программно из модуля той же формы

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

&НаКлиенте

Процедура ПослеЗаписи(ПараметрыЗаписи)

ЗаполнитьПоДанным(Команды.Найти("ЗаполнитьПоДанным"));

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

Параметр Команда в обработчике — это объект типа «КомандаФормы». Получить его можно через коллекцию ЭтаФорма.Команды методом Найти("ИмяКоманды"). Если обработчик не использует параметр, допустимо передать Неопределено, но корректнее передать реальный объект команды — тогда код внутри обработчика, обращающийся к свойствам команды, не сломается.

Такой подход работает и на клиенте, и на сервере: вызывайте обработчик в том контексте, где он объявлен. Директива компиляции (&НаКлиенте, &НаСервере) должна совпадать с местом вызова, иначе получите ошибку «Процедура или функция с указанным именем не определена».

bsl
&НаКлиенте
Процедура ВыполнитьКомандуПоИмени(ИмяКоманды)
    КомандаФормы = ЭтаФорма.Команды.Найти(ИмяКоманды);
    Если КомандаФормы = Неопределено Тогда
        ВызватьИсключение "Команда не найдена: " + ИмяКоманды;
    КонецЕсли;
    // Далее вызываем обработчик этой команды напрямую
КонецПроцедуры

Как выполнить стандартную команду объекта

Стандартные команды (Записать, Провести, Отменить проведение) не обязаны вызываться через имитацию нажатия кнопки. Для них есть прямые методы объекта, которые надёжнее и предсказуемее.

На форме документа запись выполняется методом Записать() формы, проведение — Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение)). Если нужно выполнить действие без формы (например, из фонового задания или другой формы), работайте с объектом данных: ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение). Это безопаснее, чем искать открытую форму и дёргать её команды.

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

Сравнение вариантов вызова

Прямой вызов обработчика

Подходит для команд формы внутри её же модуля. Просто и надёжно, но требует совпадения контекста клиент/сервер.

Методы объекта (Записать, Провести)

Замена стандартным командам. Работает без формы, предпочтителен для серверной логики и пакетной обработки.

Программный интерфейс подсистем

Для печати, обмена, подключаемых команд БСП. Даёт тот же результат, что и кнопка, без привязки к форме.

Как выполнить команду формы из другой формы или извне

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

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

Маршрут решения

Как выбрать способ вызова

Команда и вызов находятся в одной формеВызовите обработчик команды как обычную процедуру модуля формы
Нужно выполнить запись или проведениеИспользуйте методы Записать объекта или формы, а не имитацию команды
Действие нужно из другой формыИспользуйте Оповестить/ОбработкаОповещения или экспортную процедуру формы
Логика нужна и в форме, и вне еёВынесите код в общий модуль, а обработчик команды пусть только вызывает его

Пошаговый порядок добавления и выполнения своей команды

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

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

Порядок действий
  1. 1
    Откройте форму в конфигураторе, вкладка «Команды формы»
  2. 2
    Добавьте команду, задайте имя и создайте обработчик «Действие»
  3. 3
    Разместите кнопку в командной панели или оставьте команду скрытой
  4. 4
    Напишите код обработчика с учётом контекста (клиент/сервер)
  5. 5
    Проверьте интерактивный вызов кнопкой и программный вызов обработчика
  6. 6
    Убедитесь, что при программном вызове передаётся корректный параметр команды

Как проверить, что команда выполнилась

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

Если команда отрабатывает без видимого эффекта, поставьте точку останова в обработчике и убедитесь, что он вообще вызывается. Частая ситуация: программный вызов идёт, но обработчик завершается раньше из-за проверки условия внутри (например, «если форма модифицирована — отказ»). В таком случае смотрите логику условий, а не механику вызова.

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

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

Вызов обработчика
Норма

Точка останова в обработчике срабатывает

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

Обработчик не вызывается — проверяйте имя команды и контекст

Состояние объекта после команды
Норма

Реквизиты и проведённость соответствуют ожиданию

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

Данные не изменились — ищите ранний выход из обработчика

Сообщения пользователю
Норма

Нет ошибок в панели сообщений

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

Есть отказы проведения или ошибки прав доступа

Типичные ошибки и ограничения

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

Вторая ошибка — передача произвольного значения вместо объекта команды. Если обработчик обращается к свойствам параметра (например, Команда.Имя), передача строки или Неопределено вызовет ошибку. Третья — попытка выполнить команду закрытой или ещё не созданной формы: при обращении извне всегда проверяйте, что форма открыта, либо используйте оповещения, которые просто не сработают при отсутствии подписчика, не ломая код.

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

FAQ

Можно ли выполнить команду формы по её имени одной строкой?

Универсального метода «выполнить по имени» нет. Можно найти объект команды через ЭтаФорма.Команды.Найти("Имя"), но само действие выполняется вызовом обработчика. Если команд много и они однотипные, делают единый обработчик Подключаемый_ВыполнитьКоманду и анализируют в нём имя команды.

Как выполнить команду нажатия кнопки в обычной форме (не управляемой)?

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

Почему программный вызов команды работает, а кнопка — нет?

Проверьте, что кнопка связана именно с этой командой (свойство «ИмяКоманды» у элемента формы), что кнопка доступна и видима, и что у пользователя есть права на действие. Также убедитесь, что обработчик не зависит от контекста, который отличается при интерактивном вызове.

Как выполнить команду формы из внешней обработки?

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

Можно ли программно нажать стандартную кнопку «Провести и закрыть»?

Напрямую эту кнопку не нажать, но результат воспроизводится кодом: вызовите Записать с режимом проведения, а затем Закрыть() формы. Это надёжнее, чем попытка имитировать нажатие.

Итог

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

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