Как вызвать действие или экранную клавиатуру при щелчке по полю ввода в обычных формах 1С?

Программист 1С v8.3 (Обычные формы)
← На главную

При разработке интерфейсов для киосков, терминалов или планшетов на базе обычных форм 1С программисты часто сталкиваются с проблемой: стандартное ПолеВвода не имеет прямого события "Нажатие" или "Click". В условиях отсутствия физической клавиатуры нам необходимо, чтобы при касании поля пальцем или щелчке мышью открывалась экранная клавиатура. Простое использование события ПриПолученииФокуса не всегда спасает, так как оно срабатывает только один раз при переходе на элемент, а повторный клик по уже активному полю не вызывает никаких действий.

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

Способ 1. Использование кнопки выбора и события НачалоВыбора

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

Разберем по шагам, как это настроить:

  1. Выделим нужное ПолеВвода в конфигураторе.
  2. В палитре свойств установим флаг КнопкаВыбора в значение Истина (Да).
  3. Найдем событие НачалоВыбора и создадим обработчик на клиенте.

Проанализируем пример кода для этого события:


Процедура ИмяПоляВводаНачалоВыбора(Элемент, СтандартнаяОбработка)
    // Отменяем стандартное окно выбора 1С (например, календарь или справочник)
    СтандартнаяОбработка = Ложь;
    
    // Вызываем нашу функцию открытия клавиатуры
    ВызватьЭкраннуюКлавиатуру();
КонецПроцедуры

Преимущества: Этот метод работает стабильно, так как кнопка выбора специально предназначена для обработки взаимодействия пользователя с полем. Пользователю интуитивно понятно, что на кнопку внутри поля можно нажать.

Способ 2. Обработка табличных частей через ПриАктивизацииЯчейки

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

Рассмотрим ситуацию: при активации любой ячейки в колонке "Комментарий" нам нужно вызвать действие. Выясним, как это реализовать программно:


Процедура ТабличнаяЧастьПриАктивизацииЯчейки(Элемент)
    // Проверяем, какая именно колонка сейчас активна
    ТекущаяКолонка = Элемент.ТекущаяКолонка;
    
    Если ТекущаяКолонка.Имя = "Комментарий" Тогда
        // Проверяем тип данных, если нужно
        ВызватьЭкраннуюКлавиатуру();
    КонецЕсли;
КонецПроцедуры

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

Способ 3. Глобальный мониторинг через обработчик ожидания

Когда на форме 15 и более полей ввода, прописывать события для каждого — трудозатратно. Мы можем реализовать механизм "наблюдения" за фокусом формы. Разберем, как это работает через ПодключитьОбработчикОжидания.

В процедуре ПриОткрытии формы пропишем:


Процедура ПриОткрытии()
    // Проверяем состояние фокуса каждые 0.3 секунды
    ПодключитьОбработчикОжидания("ПроверитьФокусПоля", 0.3);
КонецПроцедуры

Процедура ПроверитьФокусПоля()
    ТекущийЭлемент = ЭтаФорма.ТекущийЭлемент;
    
    // Проверяем, является ли текущий элемент полем ввода нужного нам типа
    Если ТипЗнч(ТекущийЭлемент) = Тип("ПолеВвода") Тогда
        // Чтобы клавиатура не открывалась бесконечно, пока поле активно,
        // нужно хранить имя последнего активного элемента в переменной модуля
        Если ТекущийЭлемент.Имя <> ПоследнийЭлементСФокусом Тогда
             ПоследнийЭлементСФокусом = ТекущийЭлемент.Имя;
             ВызватьЭкраннуюКлавиатуру();
        КонецЕсли;
    Иначе
        ПоследнийЭлементСФокусом = "";
    КонецЕсли;
КонецПроцедуры

Способ 4. Вызов системной экранной клавиатуры Windows

Теперь разберем, как технически вызвать саму клавиатуру из кода 1С. Для этого мы будем использовать объект WScript.Shell, который позволяет запускать внешние приложения ОС Windows.

Посмотрим на пример универсальной процедуры:


Процедура ВызватьЭкраннуюКлавиатуру()
    Попытка
        // Запуск стандартной экранной клавиатуры Windows (osk.exe)
        ЗапуститьПриложение("osk.exe");
    Исключение
        Сообщить("Не удалось запустить экранную клавиатуру: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Если вы работаете на современных планшетах с Windows 10/11, стандартная osk.exe может выглядеть устаревшей. В таких случаях часто пытаются вызвать сенсорную панель TabTip.exe. Однако стоит учесть, что Microsoft ограничивает прямой запуск этого процесса из приложений с правами пользователя. Потребуется либо использование COM-объектов, либо специфические настройки реестра.

Способ 5. Метод "Прозрачной надписи"

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

Алгоритм настройки:

  1. Размещаем надпись точно поверх поля ввода.
  2. Устанавливаем свойство ПрозрачныйФон в значение Истина.
  3. Удаляем текст заголовка.
  4. В событии Нажатие этой надписи прописываем код:

Процедура ПрозрачнаяНадписьНажатие(Элемент)
    // Сначала передаем фокус на поле, которое находится под надписью
    ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.НужноеПолеВвода;
    
    // Затем вызываем клавиатуру
    ВызватьЭкраннуюКлавиатуру();
КонецПроцедуры

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

Важные рекомендации для сенсорных интерфейсов

Работая с обычными формами 1С на тач-скринах, помните о следующих нюансах:

  1. Размер элементов: Делайте поля ввода и кнопки выбора крупными. Стандартные 20 пикселей высоты очень трудно нажать пальцем.
  2. СтандартнаяОбработка: Всегда устанавливайте этот параметр в Ложь в событиях выбора, иначе 1С будет пытаться открыть свои встроенные диалоги, что перекроет вашу клавиатуру.
  3. Очистка фокуса: После того как пользователь завершил ввод и нажал "ОК" на экранной клавиатуре, желательно программно перевести фокус на какой-то нейтральный элемент (например, на кнопку "Записать" или декоративную рамку), чтобы следующее нажатие на это же поле снова корректно инициировало события фокуса.

Мы рассмотрели все основные способы имитации нажатия на поле в обычных формах 1С. Выбор конкретного метода зависит от количества полей на вашей форме и ваших требований к интерфейсу. Наиболее сбалансированным решением для большинства задач остается Способ 1 (Кнопка выбора).

← На главную