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