При разработке интерфейсов для киосков, терминалов или планшетов на базе обычных форм 1С программисты часто сталкиваются с проблемой: стандартное ПолеВвода не имеет прямого события "Нажатие" или "Click". В условиях отсутствия физической клавиатуры нам необходимо, чтобы при касании поля пальцем или щелчке мышью открывалась экранная клавиатура. Простое использование события ПриПолученииФокуса не всегда спасает, так как оно срабатывает только один раз при переходе на элемент, а повторный клик по уже активному полю не вызывает никаких действий.
В этой статье мы подробно разберем несколько проверенных способов решения этой задачи, проанализируем их плюсы и минусы, а также напишем код для вызова системных утилит Windows.
Это самый надежный и визуально понятный способ для обычных форм. Мы превратим стандартное текстовое поле в поле с кнопкой, которая будет служить триггером для нашего действия.
Разберем по шагам, как это настроить:
ПолеВвода в конфигураторе.КнопкаВыбора в значение Истина (Да).НачалоВыбора и создадим обработчик на клиенте.Проанализируем пример кода для этого события:
Процедура ИмяПоляВводаНачалоВыбора(Элемент, СтандартнаяОбработка)
// Отменяем стандартное окно выбора 1С (например, календарь или справочник)
СтандартнаяОбработка = Ложь;
// Вызываем нашу функцию открытия клавиатуры
ВызватьЭкраннуюКлавиатуру();
КонецПроцедуры
Преимущества: Этот метод работает стабильно, так как кнопка выбора специально предназначена для обработки взаимодействия пользователя с полем. Пользователю интуитивно понятно, что на кнопку внутри поля можно нажать.
Если у вас на форме расположена табличная часть с множеством строк и колонок, создавать кнопки выбора для каждой ячейки может быть неудобно. В этом случае мы воспользуемся событием самой таблицы.
Рассмотрим ситуацию: при активации любой ячейки в колонке "Комментарий" нам нужно вызвать действие. Выясним, как это реализовать программно:
Процедура ТабличнаяЧастьПриАктивизацииЯчейки(Элемент)
// Проверяем, какая именно колонка сейчас активна
ТекущаяКолонка = Элемент.ТекущаяКолонка;
Если ТекущаяКолонка.Имя = "Комментарий" Тогда
// Проверяем тип данных, если нужно
ВызватьЭкраннуюКлавиатуру();
КонецЕсли;
КонецПроцедуры
Важный момент: ПриАктивизацииЯчейки срабатывает и при перемещении по таблице с помощью стрелок. Если это нежелательно, можно добавить проверку на текущее значение или использовать дополнительные флаги состояния формы.
Когда на форме 15 и более полей ввода, прописывать события для каждого — трудозатратно. Мы можем реализовать механизм "наблюдения" за фокусом формы. Разберем, как это работает через ПодключитьОбработчикОжидания.
В процедуре ПриОткрытии формы пропишем:
Процедура ПриОткрытии()
// Проверяем состояние фокуса каждые 0.3 секунды
ПодключитьОбработчикОжидания("ПроверитьФокусПоля", 0.3);
КонецПроцедуры
Процедура ПроверитьФокусПоля()
ТекущийЭлемент = ЭтаФорма.ТекущийЭлемент;
// Проверяем, является ли текущий элемент полем ввода нужного нам типа
Если ТипЗнч(ТекущийЭлемент) = Тип("ПолеВвода") Тогда
// Чтобы клавиатура не открывалась бесконечно, пока поле активно,
// нужно хранить имя последнего активного элемента в переменной модуля
Если ТекущийЭлемент.Имя <> ПоследнийЭлементСФокусом Тогда
ПоследнийЭлементСФокусом = ТекущийЭлемент.Имя;
ВызватьЭкраннуюКлавиатуру();
КонецЕсли;
Иначе
ПоследнийЭлементСФокусом = "";
КонецЕсли;
КонецПроцедуры
Теперь разберем, как технически вызвать саму клавиатуру из кода 1С. Для этого мы будем использовать объект WScript.Shell, который позволяет запускать внешние приложения ОС Windows.
Посмотрим на пример универсальной процедуры:
Процедура ВызватьЭкраннуюКлавиатуру()
Попытка
// Запуск стандартной экранной клавиатуры Windows (osk.exe)
ЗапуститьПриложение("osk.exe");
Исключение
Сообщить("Не удалось запустить экранную клавиатуру: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если вы работаете на современных планшетах с Windows 10/11, стандартная osk.exe может выглядеть устаревшей. В таких случаях часто пытаются вызвать сенсорную панель TabTip.exe. Однако стоит учесть, что Microsoft ограничивает прямой запуск этого процесса из приложений с правами пользователя. Потребуется либо использование COM-объектов, либо специфические настройки реестра.
Проанализируем необычный, но эффективный метод для старых конфигураций. Если ПолеВвода упорно не хочет отрабатывать клики так, как вам нужно, можно наложить поверх него декоративный элемент Надпись (Label).
Алгоритм настройки:
ПрозрачныйФон в значение Истина.Нажатие этой надписи прописываем код:
Процедура ПрозрачнаяНадписьНажатие(Элемент)
// Сначала передаем фокус на поле, которое находится под надписью
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.НужноеПолеВвода;
// Затем вызываем клавиатуру
ВызватьЭкраннуюКлавиатуру();
КонецПроцедуры
Этот "хакерский" метод гарантирует срабатывание именно по физическому клику в область поля, обходя ограничения событий фокуса.
Работая с обычными формами 1С на тач-скринах, помните о следующих нюансах:
Ложь в событиях выбора, иначе 1С будет пытаться открыть свои встроенные диалоги, что перекроет вашу клавиатуру.Мы рассмотрели все основные способы имитации нажатия на поле в обычных формах 1С. Выбор конкретного метода зависит от количества полей на вашей форме и ваших требований к интерфейсу. Наиболее сбалансированным решением для большинства задач остается Способ 1 (Кнопка выбора).