Как программно имитировать нажатие кнопки ОК в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Способ 1: Прямой вызов предопределенных процедур

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

Проанализируем типичную ситуацию в модуле формы:


Процедура ПриОткрытии()
    // Проверяем наличие специального параметра, переданного при открытии
    Если Форма.Параметр = "АвтоЗапись" Тогда
        // Выполняем необходимые изменения в реквизитах
        Реквизит1 = "Новое значение";
        
        // Вызываем логику проверки и подготовки
        ПриЗаписи();
        
        // Записываем объект
        Записать();
        
        // Закрываем форму
        Форма.Закрыть();
    КонецЕсли;
КонецПроцедуры

Однако стоит помнить, что в ПриЗаписи() часто используется СтатусВозврата(0) для отмены записи при невыполнении условий. При программном вызове вам придется самостоятельно обрабатывать этот статус, так как выполнение кода просто продолжится дальше. Выясним, как сделать это правильно: вынесите основную логику сохранения в отдельную функцию, которая возвращает результат (истина/ложь), и вызывайте её как из ПриЗаписи(), так и из своего программного алгоритма.

Способ 2: Использование штатного метода ЗаписатьВФорме()

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

Алгоритм действий будет выглядеть следующим образом:

  1. Программно открываем форму с передачей контекста или параметра.
  2. В процедуре ПриОткрытии() или через внешнее управление вызываем ЗаписатьВФорме().
  3. Если запись прошла успешно, вызываем Форма.Закрыть().

Пример реализации в модуле формы:


Если ЗаписатьВФорме() = 1 Тогда
    Форма.Закрыть(0);
КонецЕсли;

Преимущество этого метода в том, что он автоматически вызывает процедуру ПриЗаписи() и выполняет все системные проверки платформы.

Способ 3: Командная строка формы и системные формулы

В 1С 7.7 существует возможность управления формой через специальные строковые команды. Одной из самых известных является связка #Записать Закрыть. Эту команду можно назначить кнопке в поле "Формула". Посмотрим, как вызвать её программно.

Разберем вариант использования свойства СтрокаДействийФормы (при работе с контекстом формы):


Конт.СтрокаДействийФормы = "#Записать Закрыть";
Конт.Закрыть();

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

Способ 4: Эмуляция нажатия клавиш через WScript.Shell

Если нам необходимо именно "эмулировать" физическое нажатие, как если бы пользователь нажал Ctrl+Enter (стандартное сочетание для кнопки ОК), мы можем прибегнуть к возможностям Windows Script Host. Рассмотрим пример кода:


WSHShell = СоздатьОбъект("WScript.Shell");
// Активируем окно (желательно по заголовку, чтобы фокус не ушел)
WSHShell.AppActivate("Заголовок окна 1С");
// Посылаем комбинацию клавиш Ctrl + Enter
WSHShell.SendKeys("^{ENTER}");

Важный нюанс: метод SendKeys сильно зависит от текущей раскладки клавиатуры и фокуса ввода. Если в момент выполнения кода пользователь переключит окно, команда может уйти в другое приложение. Поэтому данный метод считается "крайним средством".

Способ 5: Использование внешней компоненты FormEx

Для профессиональной разработки под 1С 7.7 использование компоненты FormEx является стандартом. Она позволяет более тонко управлять окнами. Проанализируем метод ЭмуляцияКлавиатуры(), который упоминался в обсуждении.

С помощью FormEx можно отправить конкретное сообщение Windows в очередь сообщений окна. Это гораздо надежнее, чем SendKeys, так как сообщение доставляется адресно конкретному объекту. Выясним примерную логику:

Способ 6: "Тихая" запись через СтатусВозврата(0)

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

  1. Вызываем ОткрытьФорму(), передавая в параметре признак автоматического режима.
  2. В процедуре ПриОткрытии() выполняем все нужные действия и вызываем Записать().
  3. В конце процедуры ПриОткрытии() пишем СтатусВозврата(0).

Посмотрим на пример кода:


Процедура ПриОткрытии()
    Если Форма.Параметр = "ТихийРежим" Тогда
        // Логика заполнения
        Товар = ВыбТовар;
        Количество = 10;
        
        // Сохраняем объект напрямую
        Записать();
        
        // Отменяем само открытие формы, так как работа уже сделана
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

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

Общие рекомендации и нюансы

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

Чтобы избежать этой проблемы, выполните следующие шаги перед записью:

  1. Используйте метод Активизировать(), чтобы перевести фокус на другой элемент (например, на кнопку или пустой текст). Это принудительно вызовет событие завершения редактирования предыдущего поля.
  2. Убедитесь, что все необходимые реквизиты заполнены корректно, чтобы ПриЗаписи() не выдала интерактивное окно с ошибкой, которое остановит ваш автоматический процесс.

Подводя итог, мы проанализировали основные технические решения для платформы 1С 7.7. Выбор метода зависит от ваших задач: для фоновых обновлений идеально подойдет СтатусВозврата(0) в ПриОткрытии, а для сложной логики, завязанной на интерфейс, — ЗаписатьВФорме() или возможности FormEx.

← На главную