Печать документа PDF из 1С без блокировки файла процессом 1cv8c

04.06.25

Разработка - Механизмы платформы 1С

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

Начиная с версии 8.3.21 нам стала доступна работа с PDF документами через новый объект ДокументPDF, однако, при использовании этого объекта, я столкнулся с проблемой блокировки PDF-файлов после печати, что не позволяло, например, удалить их из каталога.

 


Возможно кто-то заметил что в списке методов ДокументPDF есть метод .Прочитать() но нет метода .Закрыть().

 

 

Я решил проблему так, вместо:

пДокументPDF = Новый ДокументPDF(); 
Попытка 
	пДокументPDF.Прочитать("Строка путь к файлу");
	пДокументPDF.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Исключение
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ошибка при работе с PDF: " + ОписаниеОшибки());
КонецПопытки;

Заменил на:

пДокументPDF = Новый ДокументPDF(); 
Попытка 
	рПоток = Новый ФайловыйПоток("Строка путь к файлу",РежимОткрытияФайла.Открыть);
	пДокументPDF.Прочитать(рПоток);
	пДокументPDF.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
	рПоток.Закрыть();
Исключение
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ошибка при работе с PDF: " + ОписаниеОшибки());
КонецПопытки;
пДокументPDF = Неопределено;

"пДокументPDF = Неопределено" обнуляю переменную на всякий случай освобождая память, ФайловыйПоток имеет метод Закрыть() который позволяет явно закрыть поток и освободить файл после завершения работы с ним.

Проблема, вероятно, заключается в том, что метод .Прочитать() может удерживать файл открытым после печати, на практике файлы более не блокировались процессом 1С.

Вступайте в нашу телеграмм-группу Инфостарт

Печать PDF Поток

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    23889    TitanLuchs    106    

142

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    13268    bayselonarrend    127    

67

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    24228    dsdred    77    

140

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

23.06.2024    22669    bayselonarrend    22    

172

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    12607    dsdred    22    

85

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    45416    YA_418728146    35    

78
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 993 04.06.25 10:56 Сейчас в теме
обнуляю переменную на всякий случай освобождая память
Не обязательно это делать, после выхода из функции переменные обнулятся.
Yellow_Cube; Светлый ум; VyacheslavShilov; +3 Ответить
2. umberto_nobile 5 25.06.25 09:49 Сейчас в теме
а как программно можно ли задать количество экземпляров на печать если передать параметр РежимИспользованияДиалогаПечати.Неиспользовать?
3. 4esz 20.11.25 09:31 Сейчас в теме
Добрый день. Тоже столкнулся с проблемой блокировки файлов. Попробовал сделать на основании вашего решения, но постоянно получаю ошибку "Ошибка обращения к закрытому потоку" после чего сеанс 1Ски закрывается.
вот код:
Для Каждого Эл Из МассивДляПечатиСПолнымиИменамиФайлов Цикл
		////печатаем все файлы которые есть в массиве
		//ПолноеИмяФайла = Эл;
		//Попытка
		//	ДокПДФ = Новый ДокументPDF();
		//	ДокПДФ.Прочитать(ПолноеИмяФайла);
		//	Если Флаг_ТолькоПросмотр Тогда
		//		ДокПДФ.Показать();
		//	Иначе
		//		ДокПДФ.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
		//	КонецЕсли;	
		//Исключение
		//КонецПопытки;
		//ДокПДФ = Неопределено;
		
		//печать через "Поток" не должна блокировать файл после выполнения печати
		ПолноеИмяФайла = Эл;
		пДокументPDF = Новый ДокументPDF();
		рПоток = Неопределено;
		Попытка 
			рПоток = Новый ФайловыйПоток(ПолноеИмяФайла,РежимОткрытияФайла.Открыть);
			пДокументPDF.Прочитать(рПоток); 
			Если Флаг_ТолькоПросмотр Тогда
				пДокументPDF.Показать();
			Иначе
				пДокументPDF.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
			КонецЕсли;	
		Исключение
			ОбщегоНазначенияКлиент.СообщитьПользователю("Ошибка при работе с PDF: " + ОписаниеОшибки());
		КонецПопытки;
		Если ТипЗнч(рПоток)=Тип("ФайловыйПоток") Тогда
			рПоток.ЗакрытьАсинх();
		КонецЕсли;	
   	КонецЦикла; 
Показать


подскажите что делаю не так.
Для отправки сообщения требуется регистрация/авторизация