Решение проблемы пустого 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 не сохранялись.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *