При разработке интерфейсов в 1С часто возникает задача: необходимо сделать так, чтобы в одном поле ввода (например, "Код" или "Артикул") по умолчанию набирались символы на латинице, а в другом поле (например, "Наименование" или "Примечание") — на кириллице. Постоянное ручное переключение языка ввода замедляет работу пользователя и приводит к опечаткам. Давайте разберем по шагам, как можно автоматизировать этот процесс и переключать раскладку клавиатуры программно.
Самый простой способ "в лоб", который не требует установки дополнительных библиотек — это эмуляция нажатия горячих клавиш Windows для переключения языка. Для этого мы воспользуемся COM-объектом WScript.Shell.
Рассмотрим пример кода, который можно поместить, например, в обработчик события при активизации нужного поля ввода:
// Создаем COM-объект WScript.Shell
Ws = CreateObject("WScript.Shell");
// Если в системе настроено переключение по Ctrl+Shift:
Ws.SendKeys("^+");
// Если в системе настроено переключение по Alt+Shift:
// Ws.SendKeys("%+");
Особенности метода: Данный подход эмулирует нажатие пользователем комбинации клавиш. Однако у него есть существенный минус: программист заранее не знает, какая именно комбинация (Ctrl+Shift или Alt+Shift) настроена на конкретном компьютере пользователя. Кроме того, этот метод переключает язык циклично, и мы не можем быть уверены на 100%, какая раскладка установится после выполнения команды.
Проанализируем более надежный метод, который применялся разработчиками 1С версии 7.7 — использование популярной внешней компоненты FormEx. Она позволяет получить полный контроль над интерфейсом, в том числе напрямую считывать и задавать язык ввода.
Для управления клавиатурой используется объект Сервис и его метод РаскладкаКлавиатуры(). Посмотрим на синтаксис:
// Получение текущей раскладки
ТекущаяРаскладка = Сервис.РаскладкаКлавиатуры();
Сообщить(ТекущаяРаскладка); // вернет "Russian", "English (United States)" и т.д.
// Установка нужной раскладки
Сервис.РаскладкаКлавиатуры("English (United States)");
Преимущества: Этот способ работает четко, устанавливая именно ту раскладку, которую вы запросили, независимо от текущих настроек горячих клавиш в Windows.
Если вы не хотите использовать специализированные ВК для 1С, выясним альтернативный путь — обращение напрямую к функциям Windows API. Это универсальное решение, которое реализуется с помощью библиотеки dynwrap.dll (Dynamic Wrapper).
С помощью этой библиотеки мы можем объявить вызовы системных функций и точно передавать шестнадцатеричные идентификаторы нужных нам языков. Например, код 00000409 соответствует английскому языку (США), а 00000419 — русскому.
Для реализации нам потребуются следующие функции WinAPI:
GetKeyboardLayoutName — для получения текущей раскладки.LoadKeyboardLayout — для загрузки нужного идентификатора языка в память.ActivateKeyboardLayout — для ее непосредственной активации в активном окне.Используя этот подход, мы гарантированно включаем нужную клавиатуру без циклических переключений и "угадываний" настроек пользователя.
Рассмотрим ситуацию, с которой часто сталкиваются системные администраторы. Если пользователи работают в 1С через сервер терминалов (RDP), переключение языка часто начинает "залипать" — язык не меняется, пока пользователь не кликнет мышкой в языковую панель на панели задач.
Эта проблема носит системный характер и связана с синхронизацией локальных и удаленных раскладок клавиатуры. Решается она правкой системного реестра на самом сервере терминалов:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout].IgnoreRemoteKeyboardLayout.1.После применения этой настройки (и перезагрузки сервера/сессий) автоопределение и синхронизация удаленных раскладок отключается, устраняя конфликты при вводе текста и переключении языка внутри 1С.
Если постоянное переключение раскладки является проблемой для самого разработчика при написании кода (постоянный ввод спецсимволов, кириллицы и латиницы вперемешку), обратим внимание на современные решения для платформ 1С:Предприятие 8.x.
Существуют сторонние расширения для Конфигуратора, которые перехватывают ввод и позволяют набирать спецсимволы (например: амперсанд, "собачку", квадратные и угловые скобки) без переключения раскладки на английскую. Кроме того, они предоставляют умную контекстную подсказку (T9), которая автоматически адаптируется под набранный текст. Даже если разработчик начал набирать код, забыв переключить язык на кириллицу (например, Сообщить как Cjj,obnm), программа сама поймет контекст и предложит правильный вариант.