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