При разработке интерфейсов на платформе 1С:Предприятие нередко возникает задача изменить масштаб отображения табличного документа на экране (выполнить так называемый ZOOM, аналогичный сочетанию клавиш Ctrl + прокрутка колесика мыши). Если в управляемых формах для этих целей предусмотрены механизмы масштабирования формы и свойства просмотра, то в обычных формах разработчики сталкиваются с жесткими платформенными ограничениями.
Разберем подробно, почему штатные свойства табличного документа не меняют экранный масштаб, как работает эмуляция горячих клавиш через скрипты Windows и какие существуют альтернативные способы решения этой задачи.
Проанализируем стандартные свойства элемента управления ПолеТабличногоДокумента и самого объекта ТабличныйДокумент. Начинающие разработчики часто пытаются использовать свойства МасштабПечати или АвтоМасштаб:
Важно понимать: данные свойства относятся исключительно к подсистеме печати. Они определяют, как документ будет смасштабирован при выводе на принтер или при формировании предварительного просмотра страницы, но совершенно не влияют на интерактивный масштаб отображения ячеек внутри обычной формы.
В обычных формах свойство РежимМасштабированияПросмотра отсутствует, а свойство формы Масштаб появилось только для управляемого интерфейса (начиная с платформы 8.3.10). Поэтому управлять экранным зумом стандартными методами встроенного языка 1С в толстом клиенте обычного приложения невозможно.
На форумах часто встречается обходной путь с использованием COM-объекта Wscript.Shell и метода SendKeys. Посмотрим на исходный пример кода:
Процедура Кнопка1Нажатие(Элемент)
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличныйДокумент;
WshShell = Новый COMОбъект("Wscript.Shell");
WshShell.SendKeys("%");
WshShell.SendKeys("{DOWN 4}{RIGHT 2}{UP}{RIGHT}{DOWN}{ENTER}");
КонецПроцедуры
Выясним причину, почему данный код срабатывает именно так, и разберем его по шагам:
% в синтаксисе SendKeys означает нажатие системной клавиши Alt. Это активирует главное командное меню программы 1С:Предприятие.DOWN, RIGHT, UP) осуществляет пошаговую навигацию по выпадающим спискам главного меню вплоть до подменю: Таблица → Вид → Масштаб.ENTER выбирает определенный процент из этого списка.Теперь становится понятно, почему масштаб изменяется только один раз: скрипт не выполняет относительное уменьшение («сделать на 10% меньше текущего»), а выбирает фиксированную строчку в меню. При повторном нажатии кнопки алгоритм снова открывает то же меню и повторно выбирает тот же самый процент.
Кроме того, объект Wscript.Shell умеет имитировать исключительно события клавиатуры. Сгенерировать аппаратное событие прокрутки колесика мыши (сообщение Windows WM_MOUSEWHEEL) через него технически невозможно.
Если интерфейс вашей конфигурации стабилен и структура главного меню не переопределена, мы можем скорректировать навигацию по меню для выбора большего масштаба (например, 150% или 200%).
Пункты в стандартном подменю «Масштаб» расположены сверху вниз: от максимального к минимальному (200%, 150%, 100%, 75%, 50%). Чтобы гарантированно спозиционироваться на нужном значении независимо от текущей отметки, рекомендуется после входа в подменю переместиться в самый верх списка клавишей {HOME}, а затем отсчитать нужный пункт:
Процедура УвеличитьМасштаб()
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличныйДокумент;
WshShell = Новый COMОбъект("Wscript.Shell");
// Вход в главное меню через Alt
WshShell.SendKeys("%");
// Навигация к меню Таблица -> Вид -> Масштаб, переход в начало списка и выбор 150%
WshShell.SendKeys("{DOWN 4}{RIGHT 2}{UP}{RIGHT}{HOME}{DOWN}{ENTER}");
КонецПроцедуры
Недостатки метода SendKeys:
Если требуется надежное и предсказуемое поведение системы, рассмотрим другие инженерные подходы к изменению масштаба:
Для честной имитации сочетания Ctrl + колесо мыши необходимо отправить операционной системе сообщение с зажатой виртуальной клавишей VK_CONTROL (код 0x11) и событием прокрутки мыши. Это можно реализовать с помощью внешней компоненты или вызова функций WinAPI (mouse_event с параметром MOUSEEVENTF_WHEEL или функции SendInput). Положительное значение дельты прокрутки увеличивает масштаб поля, а отрицательное — уменьшает.
Если цель масштабирования — повысить читаемость отчета на экранах с высоким разрешением, наиболее стабильным решением является программное изменение оформления ячеек на этапе формирования документа:
Шрифт у ячеек (например, с 9 до 12 пунктов).Если документ используется исключительно для интерактивного просмотра без необходимости сложного табличного редактирования ячеек со стороны пользователя, табличный документ можно сохранить во временный файл в формате HTML (метод Записать с типом ТипФайлаТабличногоДокумента.HTML) и загрузить в элемент управления ПолеHTMLДокумента.
В HTML-документе масштаб легко и полностью штатно регулируется через свойство стилей CSS zoom или transform: scale(...), которым можно управлять напрямую из встроенного языка 1С через обращение к DOM-модели страницы.