При разработке печатных форм в системе «1С:Предприятие 8.3» программисты часто сталкиваются с задачей оптимизации интерфейса под конкретные нужды пользователей. Типичный пример — печать малоформатных документов, таких как этикетки, ценники, штрихкоды или кассовые чеки. По умолчанию метод Показать() открывает окно табличного документа в стандартном системном размере (часто на пол-экрана или даже во весь экран). Для маленькой этикетки размером 58х40 мм такое гигантское окно выглядит неэстетично и затрудняет работу пользователя, которому приходится каждый раз вручную уменьшать границы формы.
В этой статье мы подробно разберем, как заставить платформу 1С открывать окно макета строго определенного размера, как управлять этим поведением из кода, а также рассмотрим современные альтернативные подходы с использованием управляемых форм и особенности настройки макетов под принтеры этикеток.
Проанализируем базовый механизм платформы 1С для работы с окнами табличных документов. Когда мы вызываем стандартный метод Показать(), система генерирует стандартное окно просмотра. Напрямую передать в метод координаты в пикселях или символах невозможно. Однако разработчики платформы предусмотрели механизм сохранения пользовательских настроек геометрии окон.
Для реализации этой возможности у объекта ТабличныйДокумент существует специальное свойство — КлючСохраненияПоложенияОкна. Рассмотрим, как это работает на практике.
Когда мы присваиваем этому свойству уникальную строку, платформа связывает геометрические размеры окна (ширину, высоту, положение на экране), которые установит пользователь вручную, с этим уникальным ключом. Настройки записываются в системное хранилище настроек базы данных под учетной записью текущего пользователя. При следующем открытии макета с этим же ключом платформа автоматически восстановит размеры окна.
Разберем пример кода для реализации этого механизма:
// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... Здесь происходит заполнение макета данными (вывод секций, областей) ...
// Устанавливаем уникальный ключ для сохранения размеров окна
ТабДок.КлючСохраненияПоложенияОкна = "УникальныйКлюч_ПечатьЭтикеток_Номенклатура";
// Выводим документ на экран
ТабДок.Показать("Печать этикетки");
Важная деталь: многие путают это свойство со свойством КлючПараметровПечати. Выясним разницу между ними. Свойство КлючПараметровПечати отвечает исключительно за параметры самого листа при отправке на принтер (ориентация страницы, масштаб, поля, имя принтера). Оно никак не влияет на геометрические размеры самого интерактивного окна на экране монитора. Для управления окном необходимо использовать именно КлючСохраненияПоложенияОкна.
Также стоит упомянуть историческую эволюцию платформы. В старых версиях (1С 8.2 и ранних релизах 8.3) использовалось свойство ИмяСохраненияПоложенияОкна. В современных версиях платформы 8.3 оно переименовано в КлючСохраненияПоложенияОкна для соответствия стандартам управляемых форм, хотя старое свойство все еще поддерживается для обратной совместимости.
Использование статического ключа сохранения положения имеет один существенный недостаток. Если пользователь случайно сожмет окно до микроскопического размера или перетащит его за пределы видимости экрана (например, при отключении второго монитора), платформа запомнит это «сломанное» положение. При последующих открытиях окно будет открываться невидимым или искаженным, что вызовет лавину обращений в техническую поддержку.
Как обойти эту проблему? Рассмотрим два практических метода решения:
ТабДок.КлючСохраненияПоложенияОкна = Строка(Новый УникальныйИдентификатор());
В этом случае платформа каждый раз будет считать, что открывается абсолютно новое окно, параметры которого еще никогда не сохранялись, и выведет его в стандартном системном масштабе.
В современной разработке на управляемом интерфейсе вызов метода ТабДок.Показать() часто считается устаревшим решением. Он ограничивает разработчика стандартным платформенным функционалом. Более гибкий и профессиональный подход — создание вспомогательной управляемой формы для просмотра табличного документа.
Посмотрим на этот процесс по шагам:
ФормаПросмотраПечатныхФорм).ТабличныйДокумент и выносим его на форму как элемент управления «Поле табличного документа».ПриСозданииНаСервере, чтобы принимать переданный макет и настраивать геометрию окна.Разберем пример программного вызова такой формы из вашей обработки или документа:
// Формируем табличный документ
ТабДок = Новый ТабличныйДокумент;
// Заполняем данными...
// Подготавливаем параметры для открытия формы
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ТабличныйДокумент", ТабДок);
// Открываем нашу кастомную форму в режиме диалога
ОткрытьФорму("ОбщаяФорма.ФормаПросмотраПечатныхФорм", ПараметрыОткрытия, , , , , Новый ОписаниеОповещения("ПослеЗакрытияПечати", ЭтотОбъект));
Теперь проанализируем код внутри самой управляемой формы просмотра:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем переданный документ из параметров
Если Параметры.Свойство("ТабличныйДокумент") Тогда
// Копируем содержимое в реквизит формы (Поле табличного документа)
ЗначениеВРеквизитФормы(Параметры.ТабличныйДокумент, "РеквизитТабличныйДокумент");
КонецЕсли;
// Явно задаем размеры окна формы при открытии
ЭтаФорма.Ширина = 60; // Ширина в символах
ЭтаФорма.Высота = 25; // Высота в символах
// Настраиваем режим открытия окна
ЭтаФорма.ВариантСпособаОтображенияОкна = ВариантСпособаОтображенияОкна.Нормальное;
КонецПроцедуры
Использование управляемой формы дает колоссальные преимущества перед стандартным Показать():
МинимальнаяШирина, МаксимальнаяВысота и т.д.Поскольку в исходном обсуждении упоминалась печать этикеток, важно понимать, что управление размером физического окна — это лишь часть задачи. Чтобы этикетка корректно распечаталась на специализированном принтере (например, Zebra, TSC или Godex) и не уходила за границы ленты, необходимо правильно настроить свойства самого ТабличногоДокумента в коде формирования макета.
Рассмотрим обязательные настройки табличного документа для мелкоформатной печати:
ТабДок = Новый ТабличныйДокумент;
// 1. Указываем принтеру, что размер страницы будет нестандартным (пользовательским)
ТабДок.РазмерСтраницы = "Custom";
// 2. Указываем физические размеры этикетки в миллиметрах (например, 58мм на 40мм)
ТабДок.ШиринаСтраницы = 58;
ТабДок.ВысотаСтраницы = 40;
// 3. Зануляем все поля страницы. На принтерах этикеток любые дефолтные поля 1С (по 10 мм)
// приведут к тому, что изображение сместится и напечатается на стыке этикеток
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;
// 4. Зануляем колонтитулы, чтобы они случайно не перекрыли полезную информацию
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;
// 5. Включаем автомасштабирование. Платформа сожмет или растянет макет точно под размеры бумаги
ТабДок.Автомасштаб = Истина;
// 6. Задаем уникальные ключи для запоминания настроек печати и положения окна
ТабДок.КлючПараметровПечати = "ПараметрыПечати_Этикетка_58х40";
ТабДок.КлючСохраненияПоложенияОкна = "ПоложениеОкна_Этикетка_58х40";
ТабДок.Показать("Печать этикетки 58х40");
Комбинация правильной настройки геометрических параметров печати самого макета и привязка к свойству КлючСохраненияПоложенияОкна гарантирует идеальный результат: пользователь увидит аккуратное маленькое окошко предварительного просмотра, соответствующее пропорциям этикетки, а при отправке на печать принтер выдаст ровное изображение без смещений и пропусков пустых лент.