Разработка печатных форм в 1С часто преподносит сюрпризы: на компьютере разработчика макет выглядит идеально и умещается на три страницы, а у клиента тот же самый документ внезапно «разваливается» на шесть или более листов. При этом визуально текст кажется таким же, но появляются пустые области, а важные пункты договора переносятся на новые страницы без видимых причин. Разберем по шагам, почему это происходит и как привести печатную форму к единообразию на всех рабочих местах.
Многие начинающие разработчики полагают, что предпросмотр в 1С — это чисто внутренняя визуализация платформы. Однако это не так. При формировании ТабличногоДокумента 1С обращается к метрикам принтера по умолчанию, установленного в операционной системе. Разные принтеры имеют разные «непечатные зоны» (поля отступа), разные разрешения (DPI) и по-разному интерпретируют межсимвольные интервалы шрифтов.
Проанализируем ситуацию: если у вас установлен виртуальный принтер (например, «Microsoft Print to PDF»), а у клиента стоит физический лазерный принтер старой модели, 1С рассчитает ширину колонок и высоту строк по-разному. Даже разница в 1-2 пикселя в ширине буквы может привести к тому, что последнее слово в строке не поместится и перенесется на новую строку, увеличив общую высоту абзаца. Это, в свою очередь, вытолкнет нижнюю часть текста на следующую страницу.
Что сделать: попробуйте установить у клиента виртуальный PDF-принтер в качестве устройства по умолчанию и проверьте предпросмотр. Если проблема исчезла — дело в драйвере конкретного физического принтера.
Часто проблема скрывается в пользовательских настройках, которые 1С запоминает для каждой конкретной печатной формы. Рассмотрим важный нюанс: в меню «Файл — Параметры страницы» есть пункт «Экземпляров на страницу». Если там по какой-то причине установлено значение, отличное от «1», или некорректно задан масштаб, платформа будет принудительно разбивать документ.
Выясним, как это лечится программно. Чтобы игнорировать старые «запомненные» настройки пользователя и навязать свои, в коде формирования печатной формы следует явно прописать параметры:
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ТРУДОВОЙ_ДОГОВОР";
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДокумент.РазмерСтраницы = "A4";
Если вы хотите полностью сбросить настройки, чтобы 1С не брала их из системного хранилища, можно временно очистить ИмяПараметровПечати (установить пустую строку), тогда платформа применит стандартные настройки макета.
В тексте трудовых договоров часто используются длинные абзацы, вставленные в объединенные по горизонтали ячейки. В свойствах таких ячеек обычно устанавливают РазмещениеТекста = Переносить и АвтоВысотаСтроки = Истина.
Посмотрим на проблему: механизм расчета автоматической высоты строки в 1С при использовании объединенных ячеек работает нестабильно. Если суммарная высота строк в блоке (например, в пункте 6 договора) оказывается чуть больше, чем оставшееся место на странице, 1С не всегда может «разрезать» этот блок. Вместо этого платформа переносит весь объединенный блок на следующую страницу. Это объясняет, почему на предыдущей странице остается огромное пустое пространство, а пункт 6 начинается с нового листа.
Решение:
1. Попробуйте отказаться от объединения ячеек там, где это возможно. Вместо этого используйте одну широкую колонку.
2. Проверьте свойство строки ВместеССледующим (Keep with next). Если оно включено для группы строк, 1С будет пытаться уместить их все на одной странице, что неминуемо приведет к преждевременному разрыву.
Современные мониторы и ноутбуки часто используют масштаб интерфейса 125% или 150%. 1С чувствительна к этим настройкам. При масштабировании шрифты могут отрисовываться чуть крупнее, чем заложено в макете. В итоге текст, который при 100% масштабе занимал 10 строк, при 125% занимает 11 строк.
Проанализируем пример: если макет создавался на мониторе с 100% масштабом, а клиент открывает его на ноутбуке с 150%, 1С пересчитает высоту каждой строки. В масштабах всего документа (например, на 500 строк) эти микро-отклонения накопятся в несколько дополнительных сантиметров, что и даст лишние страницы.
Чтобы минимизировать этот эффект, старайтесь оставлять небольшие «запасы» по ширине колонок в макете и не заполнять ячейки текстом «впритык».
Если вы формируете документ построчно в цикле или выводите большие секции, обязательно используйте метод ПроверитьВывод(). Это позволит вам заранее узнать, поместится ли следующая секция на текущую страницу.
Рассмотрим пример правильного вывода секций макета:
// Создаем массив областей, которые хотим вывести вместе
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьПункт6);
МассивОбластей.Добавить(ОбластьПодпункт6_1);
// Проверяем, поместятся ли они на страницу
Если Не ТабДокумент.ПроверитьВывод(МассивОбластей) Тогда
// Если не помещаются, вставляем разрыв страницы принудительно
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДокумент.Вывести(ОбластьПункт6);
Важный момент: метод ПроверитьВывод() также ориентируется на настройки принтера клиента. Если у клиента установлены огромные поля в настройках страницы, этот метод будет возвращать Ложь гораздо раньше, чем на вашем компьютере.
ТабДокумент.ИмяПараметровПечати = "";, чтобы сбросить индивидуальные настройки пользователя.ТабДокумент.АвтоМасштаб = Истина; помогает платформе самостоятельно «ужать» документ под область печати конкретного принтера.Соблюдение этих рекомендаций позволит вам создавать стабильные печатные формы, которые будут выглядеть одинаково профессионально на любом оборудовании.