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

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

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

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

Выясняем причину: почему двоится PDF и ломается верстка

Для того чтобы понять природу этой ошибки, нам необходимо заглянуть под капот механизмов печати платформы 1С. Когда мы вызываем метод Записать с типом файла ТипФайлаТабличногоДокумента.PDF, платформа осуществляет виртуальный рендеринг документа. В отличие от сохранения в Excel, конвертация в PDF жестко привязана к параметрам страницы и принтера.

Главным виновником «двоения» документа является параметр «Количество экземпляров» (число копий), сохраненный в системных настройках конкретного пользователя. Если пользователь ранее хотя бы один раз отправлял этот документ на печать и указал в диалоговом окне принтера количество копий больше одной (например, 2), платформа запоминает эту настройку в базе данных в привязке к его учетной записи.

При последующем программном или интерактивном сохранении в PDF платформа считывает сохраненную настройку и генерирует в файл ровно столько копий, сколько указано в параметрах печати пользователя. Но почему же копия вставляется «посреди» документа?

Здесь вступает в силу второй параметр печати — «Разбор по копиям» (Collate):

  1. Если флаг «Разбор по копиям» включен: принтер (и конвертер PDF) сначала выведет полностью первый экземпляр (Страница 1, Страница 2), а затем полностью второй экземпляр (Страница 1, Страница 2). В итоговом PDF-файле вы просто получите сдвоенный по длине документ.
  2. Если флаг «Разбор по копиям» выключен: алгоритм печати группирует одинаковые страницы вместе. Он выведет: Страницу 1 (первый экземпляр), затем сразу же Страницу 1 (второй экземпляр), а после этого перейдет к Странице 2. Именно из-за этого у пользователя создается ощущение хаоса — копия первой страницы вклинивается посреди готового документа, нарушая всю логику визуального отображения.

Парадокс прав доступа: как связано «Редактирование таблиц» и экспорт в PDF

Многих разработчиков сбивает с толку тот факт, что баг проявляется только у пользователей с определенным набором прав. Если у пользователя забрать роль, разрешающую редактирование табличных документов, PDF начинает сохраняться корректно. Как только роль возвращают — баг возвращается. При необходимости можно воспользоваться инструкцией по редактированию печатных форм в 1С.

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

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

Способ 1. Интерактивное решение проблемы для пользователя

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

Выполним следующие шаги:

  1. Зайдем в базу данных под пользователем, у которого возникает проблема при сохранении PDF.
  2. Сформируем проблемный документ (например, Акт сверки взаиморасчетов) и выведем его печатную форму на экран.
  3. В главном меню программы выберем пункт Файл — Печать... (или воспользуемся горячими клавишами Ctrl + P).
  4. В появившемся стандартном системном окне настройки печати найдем поле «Количество копий» (или «Число экземпляров»).
  5. Увидим, что там установлена цифра 2 (или больше). Нам необходимо вручную изменить это значение на 1.
  6. Обязательно нажмем кнопку «Печать» (можно отправить документ на печать или выбрать виртуальный принтер). Это действие необходимо для того, чтобы платформа перезаписала сохраненные настройки в базе данных.
  7. Попробуем снова выполнить сохранение в PDF. Проблема должна исчезнуть.

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

Чтобы раз и навсегда застраховать систему от подобных инцидентов со стороны пользователей, мы можем принудительно управлять количеством копий непосредственно перед выгрузкой документа в PDF.

Рассмотрим пример кода, который решает эту задачу. Нам необходимо принудительно устанавливать свойство табличного документа КоличествоЭкземпляров в значение 1 перед вызовом метода Записать.

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


// Получаем печатную форму табличного документа
тАбдСчет = ЭтотОбъект.ПечатьАктаСверки(Истина);
тАбдСчет.Автомасштаб = Истина;

// ПРИНУДИТЕЛЬНЫЙ СБРОС КОЛИЧЕСТВА КОПИЙ:
// Этот шаг гарантирует, что даже если у пользователя в настройках принтера 
// сохранено другое число копий, при программном сохранении в PDF всегда запишется 1 экземпляр.
тАбдСчет.КоличествоЭкземпляров = 1;

// Сохраняем табличный документ в PDF
тАбдСчет.Записать(иМяТМП_Счет_pdf, ТипФайлаТабличногоДокумента.PDF);

Такой подход полностью нивелирует влияние сохраненных настроек пользователя на результаты экспорта. Документ в PDF гарантированно будет содержать только один экземпляр, страницы перестанут двоиться, а верстка не будет нарушена.

Способ 3. Очистка системных настроек печати в базе данных

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

Проанализируем программный способ очистки настроек печати для конкретного пользователя. Для этого разработчик может выполнить обработку со следующим кодом:


// Очистка настроек параметров страниц для конкретного отчета/документа
КлючОбъекта = "Общее/ПараметрыСтраницы/ИмяВашейПечатнойФормы";
ПользовательНастроек = "ИмяПользователяСПроблемой";

ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, Неопределено, ПользовательНастроек);

После удаления этих записей при следующем открытии печатной формы платформа применит стандартные настройки по умолчанию, что также устранит дублирование страниц в PDF-файлах.

Используя приведенные методики, вы сможете быстро диагностировать и устранить эту неприятную особенность платформы 1С, обеспечив стабильную и корректную выгрузку документов в формат PDF для всех пользователей вашей компании.

← На главную