При формировании печатных форм и отчетов разработчики часто сталкиваются с неприятным поведением платформы: в экранной форме ТабличныйДокумент отображается идеально, но при сохранении в файл формата PDF текст в ячейках с выравниванием «По ширине» начинает «плыть» — символы съезжают, а слова накладываются друг на друга. Особенно ярко эта ошибка проявляется в ячейках, где одновременно присутствуют кириллица, латиница (например, артикулы, наименования брендов, серийные номера), цифры или спецсимволы.
Выясним причину такого поведения и подробно разберем практические способы обхода этой проблемы.
Проанализируем механизм формирования результирующего файла. При сохранении табличного документа методом ТабличныйДокумент.Записать() с типом ТипФайлаТабличногоДокумента.PDF платформа 1С задействует собственный внутренний движок экспорта. В отличие от экранного отображения в операционной системе Windows (где отрисовкой занимается системная подсистема GDI/DirectWrite), встроенный генератор PDF рассчитывает координаты каждого глифа самостоятельно.
Когда в ячейке включено выравнивание по ширине, алгоритм платформы рассчитывает межсловные и межсимвольные интервалы (кернинг). В момент перехода между различными диапазонами символов Unicode (с кириллицы на латиницу или спецсимволы) парсер некорректно применяет ширину глифов. В результате базовая координата следующей буквы рассчитывается со сдвигом влево, что приводит к эффекту наложения букв и слов друг на друга.
Рассмотрим основные способы решения и обхода этой ошибки.
Разберем наиболее стабильный способ формирования качественного документа без изменения макета. Если стандартный экспорт 1С дает искажения, мы можем переложить задачу верстки и растеризации на системный драйвер печати.
Вместо программной записи в файл вызываем печать на установленный в системе виртуальный PDF-принтер с помощью метода ТабличныйДокумент.Напечатать(). При этом подсистема печати операционной системы корректно обрабатывает шрифтовые метрики и правила выравнивания.
Посмотрим на пример программной настройки параметров печати:
ТабДок = Новый ТабличныйДокумент;
// Заполнение табличного документа данными
// ...
ТабДок.ИмяПринтера = "Microsoft Print to PDF";
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.АвтоМасштаб = Истина;
// Отправка на печать в фоновом режиме без вывода диалога
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Если формирование PDF происходит на стороне сервера в регламентном задании или без участия пользователя, отличным решением является промежуточный экспорт в формат таблиц (XLSX) с последующей конвертацией через офисный пакет в консольном режиме.
Разберем по шагам реализацию данного подхода:
ТабличныйДокумент во временный файл формата XLSX.--headless) через системную команду.Посмотрим на пример программной реализации:
ИмяФайлаXLSX = ПолучитьИмяВременногоФайла("xlsx");
ИмяКаталога = КаталогВременныхФайлов();
// Сохраняем табличный документ в Excel
ТабДок.Записать(ИмяФайлаXLSX, ТипФайлаТабличногоДокумента.XLSX);
// Формируем команду для LibreOffice
ПутьКLibreOffice = "C:\Program Files\LibreOffice\program\soffice.exe";
Команда = СтрШаблон("""%1"" --headless --convert-to pdf ""%2"" --outdir ""%3""",
ПутьКLibreOffice,
ИмяФайлаXLSX,
ИмяКаталога
);
ЗапуститьПриложение(Команда, , Истина);
Рассмотрим вариант, когда печатная форма содержит сложные правила верстки. Платформа 1С позволяет сохранить табличный документ в формате HTML с сохранением структуры стилей.
После получения HTML-файла мы можем сконвертировать его в PDF с помощью любого современного браузера (Chromium, Chrome, Edge) в headless-режиме, используя встроенный параметр --print-to-pdf. Движок браузера безупречно обрабатывает выравнивание текста по ширине со свойством CSS text-align: justify;.
Если нет возможности подключать внешние утилиты и принтеры, проанализируем параметры самого макета в конфигурации:
ГоризонтальноеПоложение с По ширине на По левому краю. Это полностью устраняет эффект наложения текста.Courier New) внутренний алгоритм платформы рассчитывает координаты без фатальных смещений.Комплексное применение этих методов позволяет получить корректный и читаемый PDF-документ независимо от используемой версии платформы 1С.