При разработке или доработке конфигураций на базе обычных форм, таких как «Штрих-М: Кассир», программисты часто сталкиваются с неприятной ситуацией: новая форма открывается, она видна на экране, но любые нажатия клавиш (будь то клавиатура или сканер штрихкодов) продолжают обрабатываться «подложкой» — основной формой кассира. Даже использование метода ОткрытьМодально() не всегда исправляет ситуацию. В этой статье мы подробно разберем причины такого поведения и рассмотрим пошаговые инструкции по исправлению этой ошибки.
Прежде всего, нам необходимо понять, почему стандартный механизм модальности 1С может давать сбой в данной конфигурации. В решениях от «Штрих-М» активно используются внешние компоненты для работы с торговым оборудованием. Эти компоненты часто устанавливают так называемые «хуки» (hooks) — глобальные перехватчики клавиатурного ввода. Если драйвер сканера настроен на работу в режиме «разрыва клавиатуры», он может транслировать события строго в ту форму, которая была инициатором подключения. Проанализируем основные факторы, влияющие на этот процесс.
Одной из наиболее вероятных причин является установленное свойство РежимРабочегоСтола у основной формы. Если форма открыта в этом режиме, она ведет себя как оболочка операционной системы. В этом случае обычное открытие других окон может приводить к тому, что фокус ввода визуально переходит на новую форму, но логически остается на основной.
Рассмотрим, как это можно проверить и исправить:
Независимый.Это заставит систему Windows рассматривать новую форму как отдельное окно, не подчиняющееся напрямую логике «рабочего стола» основной формы.
В «Штрих-М: Кассир» практически всегда запущен фоновый процесс через метод ПодключитьОбработчикОжидания(). Этот механизм используется для постоянного опроса состояния оборудования или автоматического возврата фокуса в поле ввода штрихкода. Если обработчик продолжает работать после открытия новой формы, он будет принудительно возвращать фокус на элемент родительской формы каждые несколько миллисекунд.
Выясним, как правильно управлять этим процессом при вызове новой формы:
// Перед открытием новой формы отключаем мешающие процессы
ОтключитьОбработчикОжидания("ИмяПроцедурыОбработкиСобытий");
НовФорма = ПолучитьФорму("ОбщаяФорма.МояНоваяФорма");
НовФорма.ОткрытьМодально();
// После закрытия формы возвращаем всё как было
ПодключитьОбработчикОжидания("ИмяПроцедурыОбработкиСобытий", 0.1);
Методы Открыть() или ОткрытьМодально() в обычных формах 1С 8.x гарантируют только отображение окна, но не всегда фокусировку на конкретном поле ввода. Если на вашей новой форме нет ни одного активного элемента (например, все поля только для чтения), фокус «провалится» сквозь форму на предыдущее активное окно.
Разберем, как принудительно передать управление элементу формы. В модуле новой формы в процедуре ПриОткрытии() следует прописать явный захват фокуса:
Процедура ПриОткрытии()
// Указываем системе, какой элемент должен принять ввод первым
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ПолеВводаШтрихкода;
КонецПроцедуры
Важно помнить, что элемент должен быть доступен и виден, иначе установка ТекущийЭлемент не даст результата.
Посмотрим на ситуацию со стороны оборудования. Если в системе подключен драйвер, который монопольно захватывает клавиатуру, он может не знать о появлении новой формы. В конфигурациях «Штрих-М» часто реализованы свои функции для вызова диалогов, которые учитывают состояние драйверов.
Вместо прямого вызова Открыть(), поищем в глобальном модуле или общих модулях специализированные функции, такие как глОткрытьФорму() или аналоги. Они могут содержать логику временной деактивации сканера или переподключения клавиатурного фильтра на новое активное окно.
Иногда странное поведение фокуса лечится очисткой свойства «Ключ сохранения положения окна» (WindowPlacementKey). Если пользователь ранее закрыл форму в некорректном состоянии или свернутой, система может запомнить это, и при последующих открытиях форма будет считаться «мнимо» активной. Попробуйте изменить этот ключ в конфигураторе или очистить настройки пользователя (кеш), чтобы сбросить состояние окна.
Для надежного решения проблемы перехвата нажатий клавиш мы рекомендуем придерживаться следующего алгоритма:
ОткрытьМодально() для блокировки родительской формы.ПриОткрытии.Соблюдение этих правил позволит вам корректно обрабатывать ввод пользователя и избежать конфликтов между окнами в специализированных торговых решениях.