Решение проблемы пустого PDF. БСП
В 1С у клиентов иногда встречается проблема «пустого» PDF. Вот как выглядит форма документа, сохраненного в PDF:
Проблема возникает только при сохранении по синей дискетке:
Когда вызывается диалог вида:
Штатное сохранение через «Файл — Сохранить» отрабатывает корректно.
Дело в том, что PDF сохраняется на сервере. Иногда на сервере происходят какие-то сбои и PDF начинает сохраняться криво, до перезагрузки сервера. Речь идет именно о сервере 1С.
Возможно, поможет перезапуск службы принтера SPOOL. Возможно, в каком-то из релизов эту ошибку починят или уже починили, но пока еще такая проблема встречается.
Проблема ошибка в ее сложной диагностике. Можно обновить платформу и думать что всё хорошо, но через некоторое время работы сервера опять начать получать пустые PDF.
1С не раскрывает секретов, каким образом происходит сохранение в PDF. Приходится, как обычно искать обходные пути.
В данном случае героический путь обхода заключается в том, что документ конвертируется в PDF на клиенте, а не на сервере.
Будем расширять форму ПечатьДокументов. Не совсем красиво, в режиме контроля изменений, иначе в такой длинный модуль, к сожалению, не подступиться:
&НаСервере Функция дор_ПрочитатьТабличныйДокумент(ДД) ИмяДД = ПолучитьИмяВременногоФайла(); ДД.Записать(ИмяДД); ТабличныйДокумент = Новый ТабличныйДокумент(); ТабличныйДокумент.Прочитать(ИмяДД); Возврат ТабличныйДокумент; КонецФункции &НаКлиенте &ИзменениеИКонтроль("ПриПодготовкеИменФайлов") Процедура дор_ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога) СохраняемыеФайлы = Новый Массив; Для Каждого ФайлДляЗаписи Из СписокФайловВоВременномХранилище Цикл ИмяФайла = ФайлДляЗаписи.Представление; #Удаление СохраняемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, ФайлДляЗаписи.АдресВоВременномХранилище)); #КонецУдаления #Вставка //На сервере конвертирование в PDF иногда сбоит, поэтому сохраняем на сервер PDF в MXL //А конвертировать будем уже на клиенте (тут) Если ВРЕГ(Прав(ИмяФайла,4)) = ".PDF" Тогда ДД = ПолучитьИзВременногоХранилища(ФайлДляЗаписи.АдресВоВременномХранилище); ТабличныйДокумент = дор_ПрочитатьТабличныйДокумент(ДД); ТабличныйДокумент.Записать(ИмяКаталога + "\" + ИмяФайла, ТипФайлаТабличногоДокумента.PDF_A_3); Иначе СохраняемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, ФайлДляЗаписи.АдресВоВременномХранилище)); КонецЕсли; #КонецВставки КонецЦикла; #Вставка Если СохраняемыеФайлы.Количество() = 0 Тогда Перейти ~ПропуститьСохранение; КонецЕсли; #КонецВставки ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов(); ПараметрыСохранения.Диалог.Каталог = ИмяКаталога; ПараметрыСохранения.Интерактивно = Не ЗначениеЗаполнено(ИмяКаталога); ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения); #Вставка ~ПропуститьСохранение: #КонецВставки #Если Не ВебКлиент Тогда Если ЗначениеЗаполнено(ИмяКаталога) Тогда ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение успешно завершено'"), "file:///" + ИмяКаталога, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в папку %1'"), ИмяКаталога), БиблиотекаКартинок.Информация32); КонецЕсли; #КонецЕсли КонецПроцедуры &НаСервере &ИзменениеИКонтроль("ПоместитьТабличныеДокументыВоВременноеХранилище") Функция дор_ПоместитьТабличныеДокументыВоВременноеХранилище(ПереданныеНастройки) .... ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ПолноеИмяФайла); #Удаление ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла); #КонецУдаления #Вставка //На сервере конвертирование в PDF иногда сбоит, поэтому сохраняем на сервер PDF в MXL //А конвертировать будем уже на клиенте Если ВРЕГ(Прав(ПолноеИмяФайла,4)) = ".PDF" Тогда ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.MXL); Иначе ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла); КонецЕсли; #КонецВставки .... КонецФункции
Обратите внимание — тут оператор GOTO очень уместен.
Аналогично поменял и в БП, потому что БСП везде одинаковая.
ВАЖНО: есть еще одно место, где PDF конвертируется на сервере — это ЭДО. В случае проблем с ЭДО проще перезапустить сервер 1С, потому что там вся работа происходит на сервере, включая формирование печатных форм и их конвертацию. И этот метод «проброски на клиента» не подойдёт.
КРАЙНЕ ВАЖНО: почта тоже будет отправляться в формате MXL, а не PDF. Для отправки почтой нужно дополнительно дорабатывать решение.
Среда: УТ 11.5.7.402. БП Корп 3.0.122.97. Платформа: 8.3.18.1741. Объем: 1.5 час.
UPD 2022-11-25: исправил ошибку небольшую, из-за которой другие файлы, кроме PDF не сохранялись.
Свежие комментарии