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

20.08.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
PDFViewer
.epf 8,97Kb
25
25 Скачать (1 SM) Купить за 1 850 руб.
// Процедуры и функции
&НаКлиенте
Процедура ОбновитьТекстБраузера(ТекАдресФайлаВХранилище)
	
	Если ЭтоТест Тогда 
		// {{ Для теста
		ОбновитьТекстБраузера_Тест(ТекАдресФайлаВХранилище);
		// }} Для теста
	Иначе 
		Браузер = ?(ЭтоВебКлиент, ТекАдресФайлаВХранилище, "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 Платные (руб)

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

6000 руб.

16.01.2015    62985    44    59    

82

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

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

2400 руб.

29.06.2020    18855    26    6    

41

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

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

1500 руб.

06.10.2020    10224    7    7    

10

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14730    YA_418728146    7    

166

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

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

2 стартмани

22.08.2023    3580    56    progmaster    8    

4

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

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

2 стартмани

27.10.2022    4425    10    vandalsvq    13    

18

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

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

1 стартмани

05.07.2022    5749    kalyaka    6    

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