Как программно изменить размер окна печатной формы в 1С 7.7?

Программист 1С v7.7
← На главную

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

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

Причина ограничения платформы

Разберем ситуацию с технической точки зрения. В 1С 7.7 окна печатных форм являются дочерними окнами MDI-интерфейса. Платформа сохраняет параметры этих окон в реестре Windows по пути HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<ИмяБазы>\V7Default\Windows. Особенность заключается в том, что 1С использует один и тот же шаблон настроек для большинства табличных документов. Если пользователь вручную изменил размер окна для одного отчета, следующее окно (например, накладная) может открыться с теми же размерами.

Поскольку встроенный язык 1С 7.7 не имеет объектов для управления MDI-окнами, нам придется прибегнуть к помощи внешних компонент или системных вызовов.

Решение 1: Использование внешней компоненты FormEx

Проанализируем возможности популярной компоненты FormEx. Она позволяет расширить возможности работы с интерфейсом 1С, включая доступ к оконным дескрипторам (HWND).

Для того чтобы изменить размер окна, мы можем использовать объект Окна, который предоставляет FormEx. Основная идея заключается в том, чтобы найти нужное окно по его заголовку сразу после его открытия. Рассмотрим примерный алгоритм действий:

  1. Присвоим таблице уникальный заголовок в методе Показать("УникальныйЗаголовок").
  2. Используем средства FormEx для поиска окна с этим заголовком.
  3. Принудительно установим новые координаты и размеры окна.

Хотя в штатных методах FormEx нет прямой команды "УстановитьРазмерПечатнойФормы", мы можем реализовать это через перехват событий в глобальном модуле, используя процедуру ПослеОткрытияОкна. Это позволит автоматически подстраивать размер окна в момент его появления на экране.

Решение 2: Переход на компоненту Йоксель (Yoksel)

Выясним, почему многие опытные разработчики предпочитают использовать Йоксель для решения подобных задач. Йоксель — это мощный инструмент для работы с табличными документами, который может функционировать как замена штатному мокселю (таблице 1С).

Главное преимущество Йокселя заключается в возможности внедрения табличного документа непосредственно на обычную форму 1С как элемент управления (ActiveX или через специальный загрузчик). Рассмотрим преимущества этого подхода:

  1. Полный контроль над размерами: Поскольку таблица находится на форме, вы можете программно управлять размерами самой формы через штатные средства или FormEx. Таблица будет автоматически растягиваться вслед за формой.
  2. Отсутствие "серой зоны": Вы можете жестко задать границы, чтобы правый край таблицы всегда совпадал с краем окна, избавляя пользователя от необходимости ручного сужения.
  3. Расширенные свойства: Йоксель позволяет управлять масштабом отображения гораздо гибче, чем стандартный метод Опции().

Решение 3: Прямое управление через Windows API

Если вы не хотите внедрять тяжелые компоненты, можно воспользоваться вызовами функций Windows API через небольшие скрипты (например, с помощью объекта WScript.Shell) или специализированные ВК для работы с API. Разберем, какие функции нам понадобятся:

FindWindowEx — используется для поиска дескриптора (HWND) дочернего окна 1С по его заголовку.
MoveWindow или SetWindowPos — позволяют программно переместить окно и изменить его ширину и высоту.

Пример логики работы (псевдокод):


Таб.Показать("МойОтчет");
// После вывода на экран вызываем внешнюю функцию
Сервис = СоздатьОбъект("СервисAPI"); // Условная компонента для API
Хендл = Сервис.НайтиОкноПоЗаголовку("МойОтчет");
Если Хендл <> 0 Тогда
    Сервис.УстановитьРазмер(Хендл, 0, 0, 800, 600); // Координаты и размеры в пикселях
КонецЕсли;

Важно помнить, что размеры в Windows API задаются в пикселях, в то время как в 1С 7.7 используются свои единицы измерения для колонок и строк. Для идеального совмещения границ потребуется предварительный расчет ширины всех видимых колонок с учетом коэффициента пересчета.

Решение 4: Использование метода Опции и управления масштабом

Рассмотрим вспомогательный метод, который часто путают с решением проблемы размера окна, но который может быть полезен в дополнение к вышеуказанным способам. Метод Опции() позволяет настроить параметры отображения самой сетки таблицы.

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


Таб.Опции(0, 0, 0, 0, "ПараметрыПечати", "ИмяОкна");
Таб.ПараметрыСтраницы(,,,,,,,,,, "ПоШиринеСтраницы");
Таб.Показать("Печать документа");

Хотя это не меняет физический размер окна (рамки окна), это меняет масштаб содержимого, что визуально приближает нас к цели — отсутствию лишнего пространства справа от документа.

Рекомендации и итоги

Проанализировав все доступные варианты, мы можем сделать следующие выводы:

Помните, что комфорт пользователя при работе с печатными формами напрямую зависит от того, насколько аккуратно они представлены на экране. Использование внешних компонент в 1С 7.7 остается единственным надежным способом преодолеть ограничения старой платформы и сделать интерфейс по-настоящему современным и удобным.

← На главную