Рассмотрим достаточно интересную задачу, с которой часто сталкиваются разработчики при работе с мультимедиа в 1С. Допустим, на управляемой форме есть изображение (чертеж, скан документа или схема), и мы хотим добавить удобные кнопки для его приближения, отдаления и перемещения (прокрутки) по увеличенной области. Разберем по шагам, почему классический подход с эмуляцией клавиатуры вызывает проблемы и как их грамотно решить.
Часто программисты пытаются реализовать перемещение по увеличенной картинке с помощью эмуляции нажатия стрелок на клавиатуре. Проанализируем типичный код, который используется для этих целей:
&НаКлиенте
Процедура ЧертежВверх(Команда)
Скрипт = Новый COMОбъект("WScript.Shell");
ЭтаФорма.ТекущийЭлемент = Элементы.ТекКартинка;
Скрипт.SendKeys("{UP}");
КонецПроцедуры
При выполнении этого кода ожидается, что картинка сдвинется на один шаг вверх. Однако на практике происходит следующее: имитация стрелки делает шаг в нужную сторону, но затем изображение сразу же возвращается обратно в центр. Эмуляция клавиши {PGUP} может сработать, но кидает прокрутку до упора, не позволяя передвигаться мелкими шагами.
Выясним причину такого поведения. Проблема кроется в рассинхронизации внутренних механизмов фокуса управляемых форм 1С и системного фокуса операционной системы Windows.
ЭтаФорма.ТекущийЭлемент, платформа 1С регистрирует смену фокуса.SendKeys срабатывает моментально. В эту миллисекунду системный фокус всё ещё находится на нажатой кнопке, а не на картинке.Посмотрим на самое простое решение проблемы, найденное опытным путем. Если кнопка расположена «свободно» прямо на форме, при клике по ней она неизбежно перехватывает системный фокус на себя.
Чтобы избежать этого, выполним следующие шаги:
ЭтаФорма.ТекущийЭлемент = Элементы.ТекКартинка;).Когда кнопки находятся на панели, клик по ним не сбивает основной фокус формы, и эмуляция нажатия стрелки корректно отрабатывает по активному изображению. Если вы кликнули по картинке мышкой, она останется активной даже при нажатии на кнопку внутри панели.
Рассмотрим более надежный и правильный с точки зрения архитектуры 1С метод. Объект WScript.Shell работает исключительно в Windows, что делает ваш код неработоспособным в веб-клиенте или на Linux. Вместо эмуляции кнопок мы можем использовать встроенные возможности платформы.
Поместим Поле картинки в обычную Группу формы. В свойствах этой группы жестко установим параметры ВертикальнаяПрокрутка и ГоризонтальнаяПрокрутка в значение «Использовать».
Теперь, если программно увеличить размер самой картинки (изменяя ширину и высоту), 1С автоматически сформирует стандартные ползунки прокрутки для группы. Пользователь сможет прокручивать изображение мышкой без всяких COM-объектов.
Проанализируем самый современный и кроссплатформенный подход. Картинка выводится не через стандартный элемент 1С, а помещается внутрь Поле HTML-документа. В этом случае для управления отображением используются веб-технологии:
img.transform: scale.overflow: auto и методы JavaScript (например, window.scrollBy).Вы можете повесить на кнопки 1С вызов JS-функций внутри HTML-документа, которые будут плавно и пошагово двигать изображение. Это полностью исключает проблему потери фокуса и стабильно работает во всех видах клиентов 1С.
Если отказаться от WScript.Shell в текущей задаче невозможно, разберем обходные маневры. Синтаксис команды поддерживает множественные нажатия. Вы можете передать скрипту команду вида SendKeys("{UP 5}"), чтобы нажать «Вверх» 5 раз подряд.
Также иногда помогает добавление Обработчика ожидания с минимальной задержкой. Мы кликаем на кнопку, кнопка запускает обработчик ожидания (например, на 0.1 секунды), и только внутри обработчика выполняется SendKeys. За это время системный фокус успевает корректно переключиться на картинку.
Применяя описанные методы, вы сможете настроить удобный и стабильный интерфейс для просмотра изображений, избежав неприятных дерганий фокуса.