Разработка механизмов печати в 1С часто преподносит сюрпризы, когда идеально отлаженный на одном рабочем месте алгоритм начинает вести себя непредсказуемо на другом. Типичная ситуация: программист использует метод ПроверитьВывод, чтобы определить, поместятся ли два документа на одном листе или их нужно разделить. На одном компьютере система подтверждает вывод на одной странице, а на другом — при тех же данных — принудительно переносит часть документа на второй лист. Разберемся подробно, почему так происходит и как добиться стабильного результата.
Прежде всего, проанализируем, как платформа 1С выполняет расчет. Метод ПроверитьВывод не является абстрактным математическим действием. Он выполняет имитацию рендеринга табличного документа на конкретном устройстве вывода. Для этого система запрашивает параметры у принтера, который установлен в сессии 1С «по умолчанию». Если на одном компьютере это локальный лазерный принтер, а на другом — виртуальный PDF-принтер, расчеты неизбежно разойдутся из-за разницы в разрешающей способности (DPI).
Выясним основную причину различий: индивидуальные настройки пользователя. Платформа 1С сохраняет параметры печати (поля, масштаб, ориентацию) для каждого пользователя и каждой печатной формы отдельно в специальном системном хранилище. Рассмотрим, как это влияет на ситуацию:
Чтобы проверить это, выполним следующие действия: зайдем в систему под «проблемным» пользователем, сформируем табличный документ, перейдем в меню «Файл» — «Параметры страницы» и внимательно изучим установленные отступы и масштаб. Часто простое обнуление этих настроек до стандартных решает проблему.
Проанализируем более глубокую техническую причину, которая часто ускользает от внимания. Современные мониторы высокого разрешения заставляют пользователей устанавливать масштаб интерфейса Windows на уровне 125% или 150%. Рассмотрим, как это ломает логику 1С:
Платформа 1С использует графическую подсистему Windows для расчета размеров текста. При разном DPI (точек на дюйм) шрифты отрисовываются с небольшими погрешностями. Текст, который при 100% масштабе экрана занимает 100 пикселей в высоту, при 125% может занять условные 126 пикселей из-за особенностей сглаживания. Для метода ПроверитьВывод этот лишний пиксель становится критическим сигналом к тому, что область не помещается на страницу.
Для того чтобы минимизировать влияние человеческого фактора и настроек Windows, разберем самый надежный способ решения задачи — принудительную установку параметров страницы в коде перед вызовом проверки. Посмотрим на пример реализации:
// Создаем табличный документ
ТабДок = Новый ТабличныйДокумент;
// Жестко задаем параметры страницы, чтобы они были одинаковыми у всех
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
// Выводим первый документ
ТабДок.Вывести(ОбластьПервогоДокумента);
// Проверяем, поместится ли второй документ вместе с первым
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьВторогоДокумента);
Если ТабДок.ПроверитьВывод(МассивОбластей) Тогда
// Помещается — просто выводим
ТабДок.Вывести(ОбластьВторогоДокумента);
Иначе
// Не помещается — вставляем разделитель и выводим на новую страницу
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
ТабДок.Вывести(ОбластьВторогоДокумента);
КонецЕсли;
Использование свойства АвтоМасштаб со значением Истина критически важно. Это заставляет 1С пытаться «втиснуть» документ в границы печатной области, что делает метод ПроверитьВывод более лояльным к небольшим отклонениям в размерах.
Выясним, почему даже при одинаковом принтере результат может отличаться. Разные версии драйверов (например, PCL6 против PostScript) могут передавать операционной системе разные значения «непечатаемых областей». Это физические ограничения принтера (края бумаги, за которые не может зайти печатающая головка или лазер). Если на одном ПК драйвер сообщает, что нижнее непечатаемое поле — 5 мм, а на другом — 6 мм, то область доступного пространства для 1С сокращается. Проанализируем ситуацию: всегда старайтесь устанавливать одинаковые версии драйверов на рабочих местах пользователей, работающих с одними и теми же формами.
Иногда причина кроется в самом макете ТабличныйДокумент. Проверим следующие моменты:
Подводя итог, для корректной работы метода ПроверитьВывод на разных компьютерах, мы рекомендуем придерживаться следующего алгоритма:
1. Перед вызовом метода всегда явно прописывайте Поля и АвтоМасштаб в объекте ТабличныйДокумент. Это перекроет сохраненные настройки пользователя в кэше.
2. Проверьте настройки масштабирования экрана (DPI) в Windows. Желательно, чтобы они были идентичны на всех рабочих местах, где важна точность компоновки печатных форм.
3. Используйте метод Очистить() для настроек печати, если подозреваете, что старые сохраненные параметры мешают работе:
// Очистка настроек печати конкретного пользователя для данного отчета
ХранилищеОбщихНастроек.Удалить("Печать", "ИмяНастройкиПечатнойФормы", ИмяПользователя());
Соблюдение этих правил обеспечит единообразие печатных форм независимо от того, за каким компьютером работает пользователь.