Как решить проблему перехвата нажатий клавиш основной формой при открытии нового окна в «Штрих-М: Кассир»

Программист Торговля и дистрибуция
← На главную

При разработке или доработке конфигураций на базе обычных форм, таких как «Штрих-М: Кассир», программисты часто сталкиваются с неприятной ситуацией: новая форма открывается, она видна на экране, но любые нажатия клавиш (будь то клавиатура или сканер штрихкодов) продолжают обрабатываться «подложкой» — основной формой кассира. Даже использование метода ОткрытьМодально() не всегда исправляет ситуацию. В этой статье мы подробно разберем причины такого поведения и рассмотрим пошаговые инструкции по исправлению этой ошибки.

Анализируем механизмы перехвата событий

Прежде всего, нам необходимо понять, почему стандартный механизм модальности 1С может давать сбой в данной конфигурации. В решениях от «Штрих-М» активно используются внешние компоненты для работы с торговым оборудованием. Эти компоненты часто устанавливают так называемые «хуки» (hooks) — глобальные перехватчики клавиатурного ввода. Если драйвер сканера настроен на работу в режиме «разрыва клавиатуры», он может транслировать события строго в ту форму, которая была инициатором подключения. Проанализируем основные факторы, влияющие на этот процесс.

Причина 1: Режим рабочего стола основной формы

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

Рассмотрим, как это можно проверить и исправить:

  1. Откроем свойства основной формы в конфигураторе.
  2. Найдем параметр «Способ отображения окна».
  3. Для новой (открываемой) формы попробуем установить значение «Вариант управления окном» в положение Независимый.

Это заставит систему Windows рассматривать новую форму как отдельное окно, не подчиняющееся напрямую логике «рабочего стола» основной формы.

Причина 2: Работа обработчиков ожидания

В «Штрих-М: Кассир» практически всегда запущен фоновый процесс через метод ПодключитьОбработчикОжидания(). Этот механизм используется для постоянного опроса состояния оборудования или автоматического возврата фокуса в поле ввода штрихкода. Если обработчик продолжает работать после открытия новой формы, он будет принудительно возвращать фокус на элемент родительской формы каждые несколько миллисекунд.

Выясним, как правильно управлять этим процессом при вызове новой формы:


// Перед открытием новой формы отключаем мешающие процессы
ОтключитьОбработчикОжидания("ИмяПроцедурыОбработкиСобытий");

НовФорма = ПолучитьФорму("ОбщаяФорма.МояНоваяФорма");
НовФорма.ОткрытьМодально();

// После закрытия формы возвращаем всё как было
ПодключитьОбработчикОжидания("ИмяПроцедурыОбработкиСобытий", 0.1);

Причина 3: Явная установка фокуса на элемент

Методы Открыть() или ОткрытьМодально() в обычных формах 1С 8.x гарантируют только отображение окна, но не всегда фокусировку на конкретном поле ввода. Если на вашей новой форме нет ни одного активного элемента (например, все поля только для чтения), фокус «провалится» сквозь форму на предыдущее активное окно.

Разберем, как принудительно передать управление элементу формы. В модуле новой формы в процедуре ПриОткрытии() следует прописать явный захват фокуса:


Процедура ПриОткрытии()
    // Указываем системе, какой элемент должен принять ввод первым
    ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ПолеВводаШтрихкода;
КонецПроцедуры

Важно помнить, что элемент должен быть доступен и виден, иначе установка ТекущийЭлемент не даст результата.

Причина 4: Специфика драйверов торгового оборудования

Посмотрим на ситуацию со стороны оборудования. Если в системе подключен драйвер, который монопольно захватывает клавиатуру, он может не знать о появлении новой формы. В конфигурациях «Штрих-М» часто реализованы свои функции для вызова диалогов, которые учитывают состояние драйверов.

Вместо прямого вызова Открыть(), поищем в глобальном модуле или общих модулях специализированные функции, такие как глОткрытьФорму() или аналоги. Они могут содержать логику временной деактивации сканера или переподключения клавиатурного фильтра на новое активное окно.

Причина 5: Ключ сохранения положения окна

Иногда странное поведение фокуса лечится очисткой свойства «Ключ сохранения положения окна» (WindowPlacementKey). Если пользователь ранее закрыл форму в некорректном состоянии или свернутой, система может запомнить это, и при последующих открытиях форма будет считаться «мнимо» активной. Попробуйте изменить этот ключ в конфигураторе или очистить настройки пользователя (кеш), чтобы сбросить состояние окна.

Подведем итоги

Для надежного решения проблемы перехвата нажатий клавиш мы рекомендуем придерживаться следующего алгоритма:

  1. Используйте ОткрытьМодально() для блокировки родительской формы.
  2. Всегда проверяйте наличие активного элемента на новой форме и устанавливайте фокус на него в обработчике ПриОткрытии.
  3. Временно отключайте глобальные обработчики ожидания основной формы на время работы с новым окном.
  4. Проверьте, не блокирует ли ввод внешняя компонента сканера, и при необходимости вызовите методы переподключения оборудования в новой форме.

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

← На главную