Почему при сохранении табличного документа 1С в PDF наслаивается текст с выравниванием по ширине и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При формировании печатных форм и отчетов разработчики часто сталкиваются с неприятным поведением платформы: в экранной форме ТабличныйДокумент отображается идеально, но при сохранении в файл формата PDF текст в ячейках с выравниванием «По ширине» начинает «плыть» — символы съезжают, а слова накладываются друг на друга. Особенно ярко эта ошибка проявляется в ячейках, где одновременно присутствуют кириллица, латиница (например, артикулы, наименования брендов, серийные номера), цифры или спецсимволы.

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

В чем причина некорректного рендеринга текста в PDF

Проанализируем механизм формирования результирующего файла. При сохранении табличного документа методом ТабличныйДокумент.Записать() с типом ТипФайлаТабличногоДокумента.PDF платформа 1С задействует собственный внутренний движок экспорта. В отличие от экранного отображения в операционной системе Windows (где отрисовкой занимается системная подсистема GDI/DirectWrite), встроенный генератор PDF рассчитывает координаты каждого глифа самостоятельно.

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

Рассмотрим основные способы решения и обхода этой ошибки.

Способ 1. Печать через виртуальный PDF-принтер

Разберем наиболее стабильный способ формирования качественного документа без изменения макета. Если стандартный экспорт 1С дает искажения, мы можем переложить задачу верстки и растеризации на системный драйвер печати.

Вместо программной записи в файл вызываем печать на установленный в системе виртуальный PDF-принтер с помощью метода ТабличныйДокумент.Напечатать(). При этом подсистема печати операционной системы корректно обрабатывает шрифтовые метрики и правила выравнивания.

Посмотрим на пример программной настройки параметров печати:


ТабДок = Новый ТабличныйДокумент;
// Заполнение табличного документа данными
// ...
ТабДок.ИмяПринтера = "Microsoft Print to PDF";
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.АвтоМасштаб = Истина;

// Отправка на печать в фоновом режиме без вывода диалога
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

Способ 2. Конвертация табличного документа через сторонние утилиты (LibreOffice)

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

Разберем по шагам реализацию данного подхода:

  1. Сохраняем ТабличныйДокумент во временный файл формата XLSX.
  2. Вызываем утилиту LibreOffice в фоновом режиме (ключ --headless) через системную команду.
  3. Считываем готовый корректный PDF-файл и удаляем временные файлы.

Посмотрим на пример программной реализации:


ИмяФайлаXLSX = ПолучитьИмяВременногоФайла("xlsx");
ИмяКаталога  = КаталогВременныхФайлов();

// Сохраняем табличный документ в Excel
ТабДок.Записать(ИмяФайлаXLSX, ТипФайлаТабличногоДокумента.XLSX);

// Формируем команду для LibreOffice
ПутьКLibreOffice = "C:\Program Files\LibreOffice\program\soffice.exe";
Команда = СтрШаблон("""%1"" --headless --convert-to pdf ""%2"" --outdir ""%3""", 
    ПутьКLibreOffice, 
    ИмяФайлаXLSX, 
    ИмяКаталога
);

ЗапуститьПриложение(Команда, , Истина);

Способ 3. Генерация через HTML и headless-браузеры

Рассмотрим вариант, когда печатная форма содержит сложные правила верстки. Платформа 1С позволяет сохранить табличный документ в формате HTML с сохранением структуры стилей.

После получения HTML-файла мы можем сконвертировать его в PDF с помощью любого современного браузера (Chromium, Chrome, Edge) в headless-режиме, используя встроенный параметр --print-to-pdf. Движок браузера безупречно обрабатывает выравнивание текста по ширине со свойством CSS text-align: justify;.

Способ 4. Корректировка макета и шрифтов в 1С

Если нет возможности подключать внешние утилиты и принтеры, проанализируем параметры самого макета в конфигурации:

  1. Изменение горизонтального выравнивания: если строгих типографических требований к документу нет, переключите свойство ячейки ГоризонтальноеПоложение с По ширине на По левому краю. Это полностью устраняет эффект наложения текста.
  2. Использование моноширинных шрифтов: при использовании шрифтов с фиксированной шириной знаков (например, Courier New) внутренний алгоритм платформы рассчитывает координаты без фатальных смещений.
  3. Разделение ячеек: выносите фрагменты с латиницей, артикулами и номерами в отдельные колонки или смежные ячейки, не объединяя их в общий сплошной абзац со смешанным текстом.

Комплексное применение этих методов позволяет получить корректный и читаемый PDF-документ независимо от используемой версии платформы 1С.

← На главную