В практике разработки на платформе 1С:Предприятие 8.2 и 8.3 (Обычные формы) программисты иногда сталкиваются с парадоксальной ситуацией: одна и та же процедура выполняется значительно быстрее при клике мышью по кнопке, чем при использовании назначенной этой кнопке "горячей клавиши" (например, F12 или Alt+S). Особенно часто это проявляется в старых, многократно переписанных конфигурациях, таких как Управление торговлей 10.3 или УПП.
В этой статье мы подробно проанализируем, почему так происходит, разберем внутренние механизмы платформы и выясним, как оптимизировать производительность интерфейса.
Рассмотрим первый и самый важный фактор — изменение фокуса ввода. Когда пользователь кликает мышью по кнопке, фокус принудительно и мгновенно переходит с текущего элемента управления (например, ПолеВвода) на кнопку. В этот момент платформа 1С инициирует стандартную цепочку событий для поля, которое потеряло фокус:
ПриИзмененииОкончаниеРедактированияПроанализируем ситуацию с горячими клавишами. При нажатии сочетания клавиш (например, F1...F12) фокус часто остается в активном поле ввода. Платформа пытается одновременно запустить выполнение кода кнопки и продолжать поддерживать состояние редактирования в поле. Если на форме много элементов или включено автоматическое ОбновлениеОтображения, это создает микрозадержки в очереди сообщений операционной системы. Система вынуждена обрабатывать события клавиатуры KeyDown, KeyUp и одновременно инициировать серверный вызов команды.
Выясним причину, связанную с внешними компонентами. В конфигурациях типа УТ 10.3 часто используются драйверы сканеров штрихкодов или ридеров магнитных карт. Многие из них работают в режиме "эмуляции клавиатуры".
Разберем, как это влияет на скорость:
F1–F12 часто зарезервированы в настройках торгового оборудования как спецсимволы.Проанализируем ситуацию, когда в форме присутствует множество пустых процедур-обработчиков. Часто при разработке программисты создают события для элементов формы (например, ПриИзменении), а затем просто удаляют код внутри, оставляя саму оболочку процедуры в модуле.
Посмотрим на пример такого кода:
Процедура ПолеВвода21ПриИзменении(Элемент)
// Код был удален, но обработчик остался привязан к элементу
КонецПроцедуры
Кажется, что пустая процедура не должна влиять на скорость. Однако это не так. При активации команды через горячую клавишу платформа может выполнять "обход" элементов формы для проверки их состояния. Каждый вызов даже пустой процедуры в 1С — это полноценная операция, требующая:
Если таких "пустышек" на форме десятки, суммарная задержка становится ощутимой для пользователя.
В "Обычных формах" при нажатии любой клавиши платформа часто инициирует автоматический пересчет состояния элементов интерфейса (свойства Доступность, Видимость, Пометка) для всех кнопок командной панели. Если кнопок много и их состояние зависит от сложных функций, то перед выполнением самого действия кнопки система тратит время на "опрос" всей формы.
Мышь вызывает действие более адресно: клик по конкретному объекту имеет приоритет в очереди сообщений Windows и часто игнорирует некоторые этапы предварительного обновления интерфейса, которые обязательны для событий клавиатуры.
Если ваша база 1С развернута на терминальном сервере, работа с клавиатурой может замедляться из-за протокола передачи данных. Нажатия функциональных клавиш (особенно с Alt или Ctrl) упаковываются в отдельные пакеты TCP. Клик мышью передается как координата, что в ряде случаев обрабатывается графическим подсистемами быстрее, чем последовательность нажатия и отпускания управляющей клавиши, требующая подтверждения от сервера.
Чтобы устранить "тормоза" при использовании горячих клавиш, выполним следующие шаги:
ОбновлениеОтображения.ЭтаФорма.ТекущийЭлемент = ....Действие50. Это затрудняет отладку и анализ замера производительности. Используйте осмысленные названия, чтобы при замере сразу видеть, какая процедура "отъедает" время.Соблюдение этих правил позволит сделать интерфейс в 1С:Предприятии отзывчивым, а работу пользователей — комфортной, независимо от способа вызова команд.