Просмотр файлов PDF

20.08.19

Разработка - Работа с интерфейсом

Еще один пример просмотра файлов PDF. В обработке реализован пример просмотра локальных файлов PDF. Дополнительно добавлен тестовый режим (один из вариантов для использования на сервере), в котором можно увидеть ограничение платформы 1С при попытке просмотра больших файлов PDF (~более 20Мб), при этом (не смотря на предупреждение об ошибке) будет сформирован валидный тестовый файл html, который можно будет протестировать в разных браузерах. П.С. Тестировалось в тонком, толстом и web клиентах на 8.3.13.1690

Скачать исходный код

Наименование Файл Версия Размер
PDFViewer
.epf 8,97Kb
25
.epf 8,97Kb 25 Скачать
// Процедуры и функции
&НаКлиенте
Процедура ОбновитьТекстБраузера(ТекАдресФайлаВХранилище)
	
	Если ЭтоТест Тогда 
		// {{ Для теста
		ОбновитьТекстБраузера_Тест(ТекАдресФайлаВХранилище);
		// }} Для теста
	Иначе 
		Браузер = ?(ЭтоВебКлиент, ТекАдресФайлаВХранилище, "file:///" + СтрЗаменить(ПутьКФайлуPDF, "\", "/"));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СозданиеДвоичныхДанныхИзФайлаЗавершение(ДвоичныеДанные, ДополнительныеПараметры) Экспорт
	
	ТекАдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
	ОбновитьТекстБраузера(ТекАдресФайлаВХранилище);
	
	Если ЭтоТест Тогда 
		Если Не ЭтоВебКлиент Тогда 
			// {{ Для теста
			ПутьКФайлу_HTML = "" + ПутьКФайлуPDF + ".html";
			ПараметрыЗаписиТекстовогоДокумента = Новый Структура;
			ПараметрыЗаписиТекстовогоДокумента.Вставить("ПутьКФайлу", ПутьКФайлу_HTML);
			ТекстовыйДокумент = Новый ТекстовыйДокумент;
			ТекстовыйДокумент.УстановитьТекст(Браузер);
			ТекстовыйДокумент.НачатьЗапись(Новый ОписаниеОповещения("ПослеНачалаЗаписиТекстовогоДокумента", ЭтотОбъект, ПараметрыЗаписиТекстовогоДокумента), ПутьКФайлу_HTML);
			// }} Для теста
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры


// {{ Для теста
#Область Тест

&НаКлиенте
Процедура ОбновитьТекстБраузера_Тест(ТекАдресФайлаВХранилище)
	
	// Формирование может быть вынесено на сервер (при необходимости использования в регламентных и фоновых заданиях)
	
	ТекУникальныйИдентификатор = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
	
	Если ЭтоВебКлиент Тогда 
		Браузер = "<!DOCTYPE html>
		|<html>
		|<head>
		|<meta charset='utf-8'>
		|<meta name='viewport' content='width=device-width, initial-scale=1.0'>
		|<meta http-equiv='X-UA-Compatible' content='IE=edge'>
		|<style>html,body{margin:0;padding:0;} iframe{width:100%;height:99.4vh;border:none;}</style>
		|</head>
		|<body id='" + ТекУникальныйИдентификатор + "'>
		|<iframe src='" + ТекАдресФайлаВХранилище + "'></iframe>
		|</body>
		|</html>
		|";
	Иначе
		Браузер = "<!DOCTYPE html>
		|<html>
		|<head>
		|<meta charset='utf-8'>
		|<meta name='viewport' content='width=device-width, initial-scale=1.0'>
		|<meta http-equiv='X-UA-Compatible' content='IE=edge'>
		|<style>html,body{margin:0;padding:0;} embed, iframe{width:100%;height:99.4vh;border:none;} button {display: inline-block;border-radius: 2px;color: #4b4b4b;font-family: Arial;font-size: 10pt;position: relative;margin: 0;vertical-align: top;word-spacing: normal;box-sizing: border-box;border: 1px solid rgba(0,0,0,0.3);border-bottom-color: rgba(0, 0, 0, 0.3);border-bottom-color: rgba(0,0,0,0.4);background-color: #fff;box-shadow: 0 1px 0 0 rgba(0,0,0,0.2);height: 27px;}</style>
		|<script>
		|var fileName = '" + ?(ЗначениеЗаполнено(ИмяФайлаPDF), ИмяФайлаPDF, "document.pdf") + "';
		|var data='" + СтрЗаменить(Base64Строка(ПолучитьИзВременногоХранилища(ТекАдресФайлаВХранилище)), Символы.ВК + Символы.ПС, "") + "';
		|var byteCharacters = atob(data);
		|var byteNumbers = new Array(byteCharacters.length);
		|for (var i = 0; i < byteCharacters.length; i++) {
		|    byteNumbers[i] = byteCharacters.charCodeAt(i);
		|}
		|var byteArray = new Uint8Array(byteNumbers);
		|var blob = new Blob([byteArray], {type: 'application/pdf'});
		|function openPDF(blob, fileName) {
		|    window.navigator.msSaveOrOpenBlob(blob, fileName);
		|}
		|window.onload = function() {
		|if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE workaround
		|    document.body.innerHTML = ""<br><br><br><center><button fileName)'>Просмотреть - "" + fileName + ""</button></center>"";
		|}
		|else { // much easier if not IE
		|    document.body.innerHTML = ""<iframe src='"" + window.URL.createObjectURL(blob) + ""'></iframe>"";
		|}
		|}
		|</script>
		|</head>
		|<body id='" + ТекУникальныйИдентификатор + "'>
		|</body>
		|</html>
		|";
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеНачалаЗаписиТекстовогоДокумента(Результат, ДополнительныеПараметры) Экспорт 
	
	Если Результат Тогда
		Если ДополнительныеПараметры.Свойство("ПутьКФайлу") Тогда 
			ТекПутьКФайлу = ДополнительныеПараметры.ПутьКФайлу;
			#Если ВебКлиент Тогда
				ТекПутьКФайлу_НавигационнаяСсылка = "";
			#Иначе
				ТекПутьКФайлу_НавигационнаяСсылка = "file:///" + ТекПутьКФайлу;
			#КонецЕсли
			Попытка
				ПоказатьОповещениеПользователя("Save", ТекПутьКФайлу_НавигационнаяСсылка, ТекПутьКФайлу, БиблиотекаКартинок.Информация32);
			Исключение
				ПоказатьОповещениеПользователя("Save", , ТекПутьКФайлу);
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти
// }} Для теста


&НаКлиенте
Процедура ОбновитьТекстБраузераКлиент(ПутьКФайлу, АдресФайла = "")
	
	Если ЗначениеЗаполнено(АдресФайла) Тогда 
		ОбновитьТекстБраузера(АдресФайла);
	Иначе	
		Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
			// {{ Для теста
			ФайлНаДиске = Новый Файл(ПутьКФайлу);
			ИмяФайлаPDF = ФайлНаДиске.Имя;
			ФайлНаДиске = Неопределено;
			// }} Для теста
			НачатьСозданиеДвоичныхДанныхИзФайла(Новый ОписаниеОповещения("СозданиеДвоичныхДанныхИзФайлаЗавершение", ЭтотОбъект, Параметры), ПутьКФайлу);		
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры


&НаКлиенте
Процедура ПомещениеФайловЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	
	ПутьКФайлуPDF = ВыбранноеИмяФайла;
	АдресФайлаPDF = Адрес;
	ОбновитьТекстБраузераКлиент(ПутьКФайлуPDF, АдресФайлаPDF);
	
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФайлуПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если Не ВыбранныеФайлы = Неопределено Тогда 
		ПутьКФайлуPDF = ВыбранныеФайлы[0];
		ОбновитьТекстБраузераКлиент(ПутьКФайлуPDF);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбораЗавершение(Результат) Экспорт
	
	АдресФайлаPDF = "";
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Заголовок = "Укажите имя файла";
	ДиалогВыбораФайла.Фильтр = "Документ PDF (*.pdf)|*.pdf";
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;
	ДиалогВыбораФайла.МножественныйВыбор = Ложь;
	ДиалогВыбораФайла.ПолноеИмяФайла = ПутьКФайлуPDF;
	#Если ВебКлиент Тогда
		Если ПодключитьРасширениеРаботыСФайлами() Тогда
			ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("ПутьКФайлуПослеВыбораФайла", ЭтотОбъект));
		Иначе
			НачатьПомещениеФайла(Новый ОписаниеОповещения("ПомещениеФайловЗавершение", ЭтотОбъект), , ДиалогВыбораФайла, Истина, УникальныйИдентификатор);
		КонецЕсли;
	#Иначе
		ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("ПутьКФайлуПослеВыбораФайла", ЭтотОбъект));
	#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбораЗавершениеВебКлиент(Подключено, ДополнительныеПараметры) Экспорт
	
	Если Не Подключено Тогда
		НачатьУстановкуРасширенияРаботыСФайлами(Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершение", ЭтотОбъект));
	Иначе
		ПутьКФайлуНачалоВыбораЗавершение(Неопределено);	
	КонецЕсли;
	
КонецПроцедуры



// Обработчики событий
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	#Если ВебКлиент Тогда 
		ЭтоВебКлиент = Истина;
	#Иначе
		ЭтоВебКлиент = Ложь;
	#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	#Если ВебКлиент Тогда 
		НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершениеВебКлиент", ЭтотОбъект));
	#Иначе
		ПутьКФайлуНачалоВыбораЗавершение(Неопределено);	
	#КонецЕсли
	
КонецПроцедуры



// Обработчики команд
&НаКлиенте
Процедура КомандаОбновить(Команда)
	
	ОбновитьТекстБраузераКлиент(ПутьКФайлуPDF, АдресФайлаPDF);
	
КонецПроцедуры

Просмотр файлов PDF

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61936    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54566    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16819    21    4    

35

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2196    24    progmaster    7    

3

Просмотр документов, используя Google Docs (PDF, MS Office и не только). Без регистрации и смс

WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

С версии 8.3.22 в 1С:Предприятие реализован просмотр документов PDF. И это прекрасно. Но просмотр офисных документов (Word, Excel, Power point) возможен только путем некоторых "костылей". Вот, один из таких костылей я и предлагаю рассмотреть ниже.

2 стартмани

27.10.2022    4075    10    vandalsvq    13    

18

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3841    kalyaka    4    

29

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12200    1    5    

10
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. maikl007 91 04.09.19 12:26 Сейчас в теме
Спасибо все работает.
2. KHoroshulinAV 171 20.03.20 16:17 Сейчас в теме
!!! Братан ты мастер!! Круто. Мне кода хватило но я таки скачаю чтоб тебе денежка пришла
3. Доня 284 21.03.20 14:31 Сейчас в теме
Жаль! а у меня черный экран висит и база закрывается,
что делаю не так ?
4. Pim 180 06.01.21 00:21 Сейчас в теме
У меня то же не работает.
Мне помогло это: https://forum.infostart.ru/forum15/topic217090/
5. Дмитрий74Чел 234 08.09.21 19:28 Сейчас в теме
Похоже написано для IE. А сейчас в платформе WebKit.
maikl007; +1 Ответить
6. DO_WHILE_LOOP 358 10.09.21 09:08 Сейчас в теме
(5) да, в примере реализована работа (в том числе и с IE)
Прикрепленные файлы:
Оставьте свое сообщение