При работе в 1С:Предприятие пользователи и разработчики часто сталкиваются с загадочным поведением платформы при экспорте печатных форм в формат PDF. Типичная ситуация: один и тот же отчет или документ (например, Акт сверки или Счет на оплату) у одного пользователя выгружается в PDF идеально, а у другого — страницы начинают странным образом дублироваться, накладываться друг на друга или второй экземпляр документа неожиданно «вклинивается» прямо посередине первого. При этом аналогичный экспорт в формат Excel (XLSX) проходит абсолютно нормально.
В этой статье мы подробно разберем, почему возникает этот сбой, как он связан с правами доступа на редактирование таблиц и как решить проблему раз и навсегда как интерактивным путем, так и с помощью небольшой доработки кода.
Для того чтобы понять природу этой ошибки, нам необходимо заглянуть под капот механизмов печати платформы 1С. Когда мы вызываем метод Записать с типом файла ТипФайлаТабличногоДокумента.PDF, платформа осуществляет виртуальный рендеринг документа. В отличие от сохранения в Excel, конвертация в PDF жестко привязана к параметрам страницы и принтера.
Главным виновником «двоения» документа является параметр «Количество экземпляров» (число копий), сохраненный в системных настройках конкретного пользователя. Если пользователь ранее хотя бы один раз отправлял этот документ на печать и указал в диалоговом окне принтера количество копий больше одной (например, 2), платформа запоминает эту настройку в базе данных в привязке к его учетной записи.
При последующем программном или интерактивном сохранении в PDF платформа считывает сохраненную настройку и генерирует в файл ровно столько копий, сколько указано в параметрах печати пользователя. Но почему же копия вставляется «посреди» документа?
Здесь вступает в силу второй параметр печати — «Разбор по копиям» (Collate):
Многих разработчиков сбивает с толку тот факт, что баг проявляется только у пользователей с определенным набором прав. Если у пользователя забрать роль, разрешающую редактирование табличных документов, PDF начинает сохраняться корректно. Как только роль возвращают — баг возвращается. При необходимости можно воспользоваться инструкцией по редактированию печатных форм в 1С.
Давайте проанализируем эту взаимосвязь. Когда у пользователя нет прав на редактирование таблиц, любой сформированный табличный документ принудительно открывается в режиме «Только просмотр» (свойство ТолькоПросмотр устанавливается в значение Истина). В этом режиме платформа защищает документ от любых изменений и часто игнорирует индивидуальные сохраненные настройки макета пользователя, сбрасывая параметры печати к системным значениям по умолчанию (где количество копий всегда равно 1).
Когда пользователю дают права на редактирование таблиц, свойство ТолькоПросмотр переходит в значение Ложь. Платформа активирует полноценный режим работы с табличным документом, обращается к кэшу сохраненных параметров страницы (хранилищу системных настроек) конкретного пользователя, считывает оттуда старую настройку с двумя копиями и честно применяет ее при формировании PDF-файла.
Если проблема носит единичный характер и наблюдается у конкретного сотрудника, мы можем исправить ее без изменения конфигурации 1С. Для этого нам потребуется сбросить сохраненные настройки печати в пользовательском сеансе.
Выполним следующие шаги:
Ctrl + P).Чтобы раз и навсегда застраховать систему от подобных инцидентов со стороны пользователей, мы можем принудительно управлять количеством копий непосредственно перед выгрузкой документа в PDF.
Рассмотрим пример кода, который решает эту задачу. Нам необходимо принудительно устанавливать свойство табличного документа КоличествоЭкземпляров в значение 1 перед вызовом метода Записать.
Посмотрим на пример реализации:
// Получаем печатную форму табличного документа
тАбдСчет = ЭтотОбъект.ПечатьАктаСверки(Истина);
тАбдСчет.Автомасштаб = Истина;
// ПРИНУДИТЕЛЬНЫЙ СБРОС КОЛИЧЕСТВА КОПИЙ:
// Этот шаг гарантирует, что даже если у пользователя в настройках принтера
// сохранено другое число копий, при программном сохранении в PDF всегда запишется 1 экземпляр.
тАбдСчет.КоличествоЭкземпляров = 1;
// Сохраняем табличный документ в PDF
тАбдСчет.Записать(иМяТМП_Счет_pdf, ТипФайлаТабличногоДокумента.PDF);
Такой подход полностью нивелирует влияние сохраненных настроек пользователя на результаты экспорта. Документ в PDF гарантированно будет содержать только один экземпляр, страницы перестанут двоиться, а верстка не будет нарушена.
Если интерактивный сброс настроек не помог или у вас нет физического доступа к рабочему месту пользователя, мы можем прибегнуть к очистке кэша настроек через Хранилище Системных Настроек. В платформе 1С параметры печати табличных документов сохраняются в системных таблицах информационной базы.
Проанализируем программный способ очистки настроек печати для конкретного пользователя. Для этого разработчик может выполнить обработку со следующим кодом:
// Очистка настроек параметров страниц для конкретного отчета/документа
КлючОбъекта = "Общее/ПараметрыСтраницы/ИмяВашейПечатнойФормы";
ПользовательНастроек = "ИмяПользователяСПроблемой";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, Неопределено, ПользовательНастроек);
После удаления этих записей при следующем открытии печатной формы платформа применит стандартные настройки по умолчанию, что также устранит дублирование страниц в PDF-файлах.
Используя приведенные методики, вы сможете быстро диагностировать и устранить эту неприятную особенность платформы 1С, обеспечив стабильную и корректную выгрузку документов в формат PDF для всех пользователей вашей компании.