В процессе разработки часто возникает задача сделать интерфейс максимально удобным для пользователя. Одной из таких задач является программная установка масштаба просмотра Табличного документа. Проблема заключается в том, что в платформе «1С:Предприятие 8.3» отсутствует прямое свойство вроде МасштабПросмотраПроцент. Свойства МасштабПечати и АвтоМасштаб отвечают только за вывод на бумагу и не меняют отображение на экране. В этой статье мы подробно разберем, как обойти это ограничение, используя различные подходы: от имитации действий пользователя до манипуляций со свойствами формы.
Проанализируем самый популярный, хоть и «костыльный» метод — имитацию нажатия горячих клавиш. Этот способ позволяет программно вызвать стандартное меню 1С и выбрать нужный масштаб, как если бы это делал пользователь с клавиатуры. Для реализации нам понадобится COM-объект WScript.Shell.
Для обычных форм и классического интерфейса код будет выглядеть следующим образом:
WshShell = Новый COMОбъект("Wscript.Shell");
// Активируем меню (Alt), переходим в Таблица -> Вид -> Масштаб
WshShell.SendKeys("%A{RIGHT 3}{UP}{RIGHT}{ENTER}");
В управляемых формах структура меню отличается, и нам нужно предварительно убедиться, что фокус установлен на элементе формы, содержащем табличный документ. Рассмотрим пример для управляемого интерфейса:
// Устанавливаем фокус на поле табличного документа
ЭтаФорма.ТекущийЭлемент = Элементы.Результат;
WshShell = Новый COMОбъект("Wscript.Shell");
// Имитируем нажатие клавиши Alt и навигацию по системному меню
WshShell.SendKeys("%");
WshShell.SendKeys("{DOWN 4}{RIGHT 2}{UP}{RIGHT}{DOWN}{ENTER}");
Важный нюанс: метод SendKeys крайне чувствителен к текущему фокусу окна. Если в момент выполнения кода пользователь переключится на другую программу, команды уйдут в «никуда» или в активное окно. Рекомендуется добавлять небольшую паузу перед выполнением этих команд.
Выясним, какие штатные средства все же доступны в платформе. В версии 8.3 у элемента формы типа «Поле табличного документа» появилось свойство РежимМасштабированияПросмотра (в англоязычном варианте ViewScalingMode). Рассмотрим его возможности.
Это свойство принимает значения системного перечисления РежимМасштабированияПросмотра:
Проанализируем ситуацию: если нам нужно, чтобы отчет всегда помещался по ширине экрана (что часто и требуется вместо установки точного процента), использование значения Авто будет самым правильным и стабильным решением:
// Для управляемой формы
Элементы.Результат.РежимМасштабированияПросмотра = РежимМасштабированияПросмотра.Авто;
Этот способ лишен недостатков имитации нажатия клавиш и работает даже в режиме «Киоск» или через веб-клиент.
Если задача стоит именно в визуальном увеличении текста для удобства работы пользователя (например, при использовании мониторов с высоким разрешением), мы можем рассмотреть вариант изменения шрифтов во всем документе. Это не является масштабированием в чистом виде, но дает похожий визуальный эффект.
Разберем по шагам, как это реализовать:
Область() для всего заполненного диапазона.АвтоВысотаСтроки, чтобы текст не обрезался.Пример кода для массового изменения шрифта:
// Получаем всю заполненную область
ВсеЯчейки = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
ШрифтОригинал = ВсеЯчейки.Шрифт;
// Устанавливаем новый размер шрифта на основе текущего
ВсеЯчейки.Шрифт = Новый Шрифт(ШрифтОригинал, ШрифтОригинал.Имя, ШрифтОригинал.Размер * 1.2);
// Корректируем высоту строк, чтобы текст влез
ТабДок.АвтоВысотаСтроки = Истина;
Важное замечание: этот метод изменяет сам документ, а не способ его отображения. Если пользователь решит распечатать такой документ, он также будет напечатан увеличенным шрифтом, что может нарушить верстку на листах А4.
Для продвинутых разработчиков существует способ имитации стандартного жеста масштабирования. Этот метод наиболее универсален, так как работает даже в тех случаях, когда меню скрыто (режим киоска). Рассмотрим теоретическую схему реализации, так как она требует использования внешних компонент или вызовов через user32.dll.
Суть заключается в отправке сообщения WM_MOUSEWHEEL окну табличного документа. При этом необходимо программно «зажать» клавишу CTRL. На языке системных сообщений это выглядит как отправка флага MK_CONTROL вместе с дельтой поворота колеса.
Такой подход позволяет добиться плавного изменения масштаба именно просмотра, не затрагивая настройки печати и не меняя структуру самого документа 1С.
Подводя итог, можно выделить следующие рекомендации по выбору метода:
РежимМасштабированияПросмотра.Авто.SendKeys.Не забывайте, что при использовании SendKeys в управляемом приложении, особенно в тонком клиенте через интернет, задержки сети могут привести к тому, что команды будут выполнены не вовремя. Всегда тестируйте такие решения на реальных каналах связи.