Как программно изменить масштаб поля табличного документа в обычных формах 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на платформе 1С:Предприятие нередко возникает задача изменить масштаб отображения табличного документа на экране (выполнить так называемый ZOOM, аналогичный сочетанию клавиш Ctrl + прокрутка колесика мыши). Если в управляемых формах для этих целей предусмотрены механизмы масштабирования формы и свойства просмотра, то в обычных формах разработчики сталкиваются с жесткими платформенными ограничениями.

Разберем подробно, почему штатные свойства табличного документа не меняют экранный масштаб, как работает эмуляция горячих клавиш через скрипты Windows и какие существуют альтернативные способы решения этой задачи.

Ограничения платформы в обычных формах

Проанализируем стандартные свойства элемента управления ПолеТабличногоДокумента и самого объекта ТабличныйДокумент. Начинающие разработчики часто пытаются использовать свойства МасштабПечати или АвтоМасштаб:

Важно понимать: данные свойства относятся исключительно к подсистеме печати. Они определяют, как документ будет смасштабирован при выводе на принтер или при формировании предварительного просмотра страницы, но совершенно не влияют на интерактивный масштаб отображения ячеек внутри обычной формы.

В обычных формах свойство РежимМасштабированияПросмотра отсутствует, а свойство формы Масштаб появилось только для управляемого интерфейса (начиная с платформы 8.3.10). Поэтому управлять экранным зумом стандартными методами встроенного языка 1С в толстом клиенте обычного приложения невозможно.

Разбор работы скрипта эмуляции нажатия клавиш через Wscript.Shell

На форумах часто встречается обходной путь с использованием COM-объекта Wscript.Shell и метода SendKeys. Посмотрим на исходный пример кода:


Процедура Кнопка1Нажатие(Элемент)
    ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличныйДокумент;
    WshShell = Новый COMОбъект("Wscript.Shell"); 
    WshShell.SendKeys("%");
    WshShell.SendKeys("{DOWN 4}{RIGHT 2}{UP}{RIGHT}{DOWN}{ENTER}");
КонецПроцедуры

Выясним причину, почему данный код срабатывает именно так, и разберем его по шагам:

  1. Символ % в синтаксисе SendKeys означает нажатие системной клавиши Alt. Это активирует главное командное меню программы 1С:Предприятие.
  2. Последовательность клавиш со стрелками (DOWN, RIGHT, UP) осуществляет пошаговую навигацию по выпадающим спискам главного меню вплоть до подменю: Таблица → Вид → Масштаб.
  3. В подменю «Масштаб» находится жестко заданный список значений: 200%, 150%, 100%, 75%, 50%. Нажатие стрелки вниз и 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:

  1. Неуниверсальность: порядок пунктов меню зависит от конфигурации, прав пользователя, наличия других открытых окон и настроек интерфейса.
  2. Нестабильность: если пользователь переключит окно, нажмет клавишу во время выполнения скрипта или изменится языковая раскладка, последовательность клавиш уйдет в пустоту или вызовет непредвиденную команду.

Альтернативные способы решения задачи

Если требуется надежное и предсказуемое поведение системы, рассмотрим другие инженерные подходы к изменению масштаба:

1. Эмуляция реального сообщения колеса мыши через Windows API

Для честной имитации сочетания Ctrl + колесо мыши необходимо отправить операционной системе сообщение с зажатой виртуальной клавишей VK_CONTROL (код 0x11) и событием прокрутки мыши. Это можно реализовать с помощью внешней компоненты или вызова функций WinAPI (mouse_event с параметром MOUSEEVENTF_WHEEL или функции SendInput). Положительное значение дельты прокрутки увеличивает масштаб поля, а отрицательное — уменьшает.

2. Программная корректировка макета перед выводом

Если цель масштабирования — повысить читаемость отчета на экранах с высоким разрешением, наиболее стабильным решением является программное изменение оформления ячеек на этапе формирования документа:

  1. Перед выводом данных программно обходим области макета или готового табличного документа.
  2. Увеличиваем размер свойства Шрифт у ячеек (например, с 9 до 12 пунктов).
  3. Пропорционально корректируем ширину колонок и высоту строк табличного документа.

3. Вывод через Поле HTML-документа

Если документ используется исключительно для интерактивного просмотра без необходимости сложного табличного редактирования ячеек со стороны пользователя, табличный документ можно сохранить во временный файл в формате HTML (метод Записать с типом ТипФайлаТабличногоДокумента.HTML) и загрузить в элемент управления ПолеHTMLДокумента.

В HTML-документе масштаб легко и полностью штатно регулируется через свойство стилей CSS zoom или transform: scale(...), которым можно управлять напрямую из встроенного языка 1С через обращение к DOM-модели страницы.

← На главную