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

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

Как программно нажать на кнопку в 1С

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

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

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

Как устроена кнопка в управляемой форме

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

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

Вызов команды из той же формы

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

&НаКлиенте

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

// Программно "нажимаем" кнопку "ЗагрузитьДанные"

ЗагрузитьДанные(Неопределено);

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

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

Для стандартных команд формы есть отдельный метод — ВыполнитьКоманду. Он принимает идентификатор стандартной команды, например:

ЭтаФорма.ВыполнитьКоманду(КомандаФормы.Записать);

Этот способ корректно выполняет всю встроенную логику платформы, включая проверки заполнения и вопросы пользователю.

Порядок действий для вызова из своей формы
  1. 1
    Откройте модуль формы и найдите процедуру-обработчик нужной команды
  2. 2
    Убедитесь, что обработчик не зависит от параметра Команда, или подготовьте объект команды через ЭтаФорма.Команды.Найти()
  3. 3
    Вызовите процедуру напрямую из нужного места клиентского кода
  4. 4
    Проверьте, что все проверки и вопросы пользователю отрабатывают так же, как при ручном нажатии

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

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

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

// В модуле вызываемой формы

&НаКлиенте

Процедура ВыполнитьЗагрузку() Экспорт

ЗагрузитьДанные(Неопределено);

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

// В вызывающем коде

Форма = ПолучитьФорму("Обработка.ОбменДанными.Форма.Форма");

Форма.Открыть();

Форма.ВыполнитьЗагрузку();

Второй подход — передать параметр при открытии формы и обработать его в ПриСозданииНаСервере или ПриОткрытии. Это безопаснее: форма сама решает, как отреагировать, и не требует экспортных процедур.

Как «нажать» кнопку на форме, которую нельзя дорабатывать

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

  • Подключить обработчик ожидания и вызвать стандартную команду. Если кнопка связана со стандартной командой (Записать, Провести), её можно вызвать через ВыполнитьКоманду из расширения формы.
  • Расширение конфигурации. Через расширение добавьте в форму свою процедуру, которая вызывает нужный обработчик, — основная конфигурация при этом не меняется.
  • Оповещения. Если форма реагирует на оповещения (ОбработкаОповещения), можно отправить Оповестить("ИмяСобытия") и заставить форму выполнить нужную логику.

Обращение к элементам формы напрямую (Элементы.КнопкаЗаписать) не даёт метода нажатия — у элемента «КнопкаФормы» нет метода «Нажать». Можно только управлять видимостью, доступностью и заголовком.

Программное нажатие на сервере и внешние сценарии

На сервере понятия «кнопка» не существует — там выполняется только бизнес-логика. Если цель — выполнить действие, которое делает кнопка (например, провести документ), правильно вызывать не интерфейс, а объектный метод:

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

Для автоматизации действий пользователя без доработки конфигурации существуют внешние средства: механизм автоматизированного тестирования, встроенный в платформу (менеджер тестирования и клиент тестирования), и инструменты вроде Vanessa Automation. Клиент тестирования умеет буквально нажимать кнопки по их именам:

ОкноПриложения = КонтекстТестирования.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения"), "Документ");

Кнопка = ОкноПриложения.НайтиОбъект(Тип("ТестируемаяКнопкаФормы"), "Записать и закрыть");

Кнопка.Нажать();

Сравнение способов

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

Подходит, когда код в той же форме; ограничение — нужен доступ к модулю формы

Экспортная процедура + ПолучитьФорму

Подходит для вызова из других форм; требует доработки вызываемой формы

Вызов объектных методов на сервере

Подходит для фоновых и регламентных задач; не воспроизводит клиентские проверки

Клиент тестирования

Подходит для автотестов и автоматизации без изменения конфигурации; требует запуска в режиме тестирования

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

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

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

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

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

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

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

Процедура выполняется без исключений, действие видно в интерфейсе

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

Ошибка «Процедура или функция не обнаружена» — неверное имя или область видимости

Запись/проведение объекта
Норма

У ссылки реквизит Проведен = Истина, движения присутствуют

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

Объект записан, но не проведён — сработала отмена в проверках

Поведение формы
Норма

Форма реагирует так же, как при ручном нажатии

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

Пропущены вопросы и проверки — вызван не тот обработчик

FAQ

Можно ли нажать кнопку по имени элемента формы?

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

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

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

Можно ли программно нажать кнопку в чужой открытой форме без доработки?

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

Чем отличается ВыполнитьКоманду от прямого вызова обработчика?

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

Как автоматически «нажимать» кнопку по расписанию?

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

Итог

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

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