Конвертация экселя в картику
На листе екселя есть картинки, надписи в произвольной форме. Как это чудище с конвертировать в картинку. Нашел процедуру
ФайлПрограммы = НовыйФайл("C:\Program Files\Bullzip\PDF Printer\gs\gswin32c.exe");
Если Не ФайлПрограммы.Существует() Тогда ТекстСообщения = "Не установлена программа - Bullzip"; ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
Возврат "";
КонецЕсли;
ИмяКартинки = "Проба";
ПринтерPDF.SetValue("output", "D:\" +ИмяКартинки + ".jpg");
ПринтерPDF.SetValue("ShowSaveAS", "never");
ПринтерPDF.SetValue("ShowProgress", "no");
ПринтерPDF.SetValue("ShowProgressFinished", "no");
ПринтерPDF.SetValue("ShowSettings", "never");
ПринтерPDF.SetValue("ShowPDF", "no");
ПринтерPDF.SetValue("ConfirmOverwrite","no");
ПринтерPDF.SetValue("Device","jpeg");
ПринтерPDF.WriteSettings();
НастройкиПечатиОриентация= 1;// 1 - портерт, 2 - ландшафт.
НастройкиПечатиМасштаб= 100;// масштаб в процентах.
НастройкиПечатиРазложитьПоКопиям = 1;// 0 - не разбирать по копиям, 1 - разобрать по копиям.
НастройкиПечатиПолеЛев= 10;
НастройкиПечатиПолеПрав= 10;
НастройкиПечатиПолеВерх= 10;
НастройкиПечатиПолеНиз= 10;
НастройкиПечатиКолонтитулВерх= 0;
НастройкиПечатиКолонтитулНиз= 0;
НастройкиПечатиАвтомасштабПоШирине = 1;// 1 - включить, 0 - выключить.
НастройкиПечатиЧерноБелаяПечать = 0;// 1 - включить, 0 - выключить.
НастройкиПечатиИмяПринтера = "Bullzip PDF Printer";// Имя принтера в ОС
Таб.ПараметрыСтраницы(НастройкиПечатиОриентация, НастройкиПечатиМасштаб, НастройкиПечатиРазложитьПоКопиям,
НастройкиПечатиПолеЛев, НастройкиПечатиПолеПрав, НастройкиПечатиПолеВерх, НастройкиПечатиПолеНиз,
НастройкиПечатиКолонтитулВерх, НастройкиПечатиКолонтитулНиз, НастройкиПечатиАвтомасштабПоШирине,
НастройкиПечатиЧерноБелаяПечать, НастройкиПечатиИмяПринтера);
Таб.КоличествоЭкземпляров(1);
Таб.Напечатать(0);
Но есть вопрос? Как перетащить лист экселя в Таб? Нашел много способов и на этом форуме но перетаскиваются только текстовые данные, а мне нужно все.
Категория:
Работа с Microsoft Office и OpenOffice Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
ТекЗнч = СокрЛП(Лев(Стр,Поз-1));
Если ЗначениеЗаполнено(ТекЗнч) Тогда
МассивСтрок.Добавить(ТекЗнч);
КонецЕсли;
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Ищем Файлы
тч.Очистить();
НайденныеФайлы = НайтиФайлы(ПутьКPDF,"*.pdf",ложь);
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ.Добавить();
Нстр.ФайлPDF = стр.Имя;
КонецЦикла;
ЭтаФорма.Обновить();
//Преобразуем PDF в TXT
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП(ПутьКPDF+"\"+стр.ФайлPDF);
txt = СтрЗаменить(pdf,"pdf","txt");
Команд = ПутьКPDF2TXT+"\pdf2txt.exe "+pdf+" "+txt;
ЗапуститьПриложение(Команд,ПутьКPDF,Истина);
стр.ФайлTXT = txt;
Исключение
стр.ФайлTXT = "!!!_ОШИБКА";
КонецПопытки;
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
КонецЦикла;
мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");
мСкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойСклад");
мОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеПодразделение");
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов");
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам");
мВидНоменклатурыПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойВидНоменклатуры");
мОтражатьВРеглУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете");
мОтражатьВБухУчета = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете");
мОтражатьВНалУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете");
//Создаем Документ
Для каждого стр Из ТЧ Цикл
Состояние("Загружаю: "+стр.ФайлTXT);
текдок=Новый ТекстовыйДокумент;
текдок.Прочитать(стр.ФайлTXT,"UTF-8");
ЗагрузкаТЧ=Ложь;
ДокВозвратТоваровОтПокупателя = Документы.ВозвратТоваровОтПокупателя.СоздатьДокумент();
ДокВозвратТоваровОтПокупателя.Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя.Дата = ОбщегоНазначения.ПолучитьРабочуюДату();
ДокВозвратТоваровОтПокупателя.УстановитьНовыйНомер();
ДокВозвратТоваровОтПокупателя.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
ДокВозвратТоваровОтПокупателя.СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя.Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ДокВозвратТоваровОтПокупателя.УчитыватьНДС = ИСТИНА;
ДокВозвратТоваровОтПокупателя.СуммаВключаетНДС = ИСТИНА;
Для Ном=1 по текдок.КоличествоСтрок() цикл
ТСтр = текдок.ПолучитьСтроку(Ном);
ТекСтр = СокрЛП(ТСтр);
Если Найти(ТекСтр, "Всего по накладной")>0 Тогда
ЗагрузкаТЧ=Ложь;
//делаем пересчеты сумм, количества мест и НДС по строкам
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя.Товары Цикл
ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
КонецЦикла;
Попытка
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
стр.Документ = ДокВозвратТоваровОтПокупателя.Ссылка;
стр.Инфо = "Все ОК";
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
//ВСЕ
Прервать;
КонецЕсли;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить(ТекСтр, "подложке ","подложке");
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>2 Тогда
//Сообщить(СтрМ);
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СтрМ[2]);
//НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицы.ХарактеристикаНоменклатуры;
//УстановитьСтавкуНДСВТабЧасти(НоваяСтрока, СтрокаТаблицы);
//ПроверитьНаличиеСерииНоменклатуры(НоваяСтрока, СтрокаТаблицы);
//УстановитьПризнакВеденияПоСериямНоменклатуры(НоваяСтрока);
НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
НоваяСтрока.Коэффициент = 1;
НоваяСтрока.Количество = Число(СтрМ[6]);
НоваяСтрока.Цена = Число(СтрМ[7]);
НоваяСтрока.Сумма = Число(СтрМ[8]);
НоваяСтрока.СуммаНДС = Число(СтрМ[11]);
НоваяСтрока.Качество = Справочники.Качество.Новый;
Попытка
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС["НДС"+Лев(СокрЛП(СтрМ[9]),2)];
Исключение
НоваяСтрока.СтавкаНДС = НоваяСтрока.Номенклатура.СтавкаНДС;
КонецПопытки;
Исключение
Сообщить("Не загружено: "+ТекСтр);
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;
Иначе
// Возможно что-то будет
КонецЕсли;
//Сообщить(ТекСтр);
Если Найти(ТекСтр, "Товарная накладная")>0 Тогда
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>1 Тогда
//Сообщить(СтрМ);
ДокВозвратТоваровОтПокупателя.НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1];
ТекДата = СтрМ[2];
ДокВозвратТоваровОтПокупателя.ДатаВходящегоДокументаЭлектронногоОбмена = Дата(Прав(ТекДата,4)+Сред(ТекДата,4,2)+Лев(ТекДата,2));
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Грузополучатель:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН",текИНН);
Если ТекОрганизация=Справочники.Организации.ПустаяСсылка() Тогда
ДокВозвратТоваровОтПокупателя.Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя.Организация = ТекОрганизация;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Поставщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПоставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
ДокВозвратТоваровОтПокупателя.Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя.ДоговорКонтрагента = ТекПоставщик.ОсновнойДоговорКонтрагента;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Плательщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПлательщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
КонецЕсли;
КонецЕсли;
Если текстр="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ=Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF2TXT = ДиалогОткрытия.Каталог;
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Категория:
Загрузка данных в 1С Отдаем PDF файл через Web-сервис В инфраструктурах, активно использующих возможности web-сервисов 1С, нередко возникает потребность получения не только массивов данных из базы, но и различных файлов. Сам файл через веб-сервис так просто не передашь, но на его основе можно создать объект ДвоичныеДанные, который, в свою очередь, уже сериализуется в base64Binary. После такой операции наш веб-сервис без проблем передает данные и получателю остается только выполнить на своей стороне обратное преобразование и сохранить файл.
В качестве примера такого механизма я буду создавать в 1С счет на оплату на основании переданных через сервис ИНН контрагента и суммы, и возвращать PDF печатной формы. На этот раз, кроме примеров кода, дополнительно был записан скринкаст разработки.
Для начала создадим в пустой конфигурации справочник "Контрагенты" с реквизитом "ИНН" и документ "Счет" с реквизитами "Контрагент" и "СуммаДокумента".
Теперь добавим пакет XDTO "test_ws"с пространством имен "http://www.test-ws.org", в котором опишем тип объекта "File". Он будет содержать свойства:
binaryData - (base64Binary (http://www.w3.org/2001/XMLSchema));
ext - string (http://www.w3.org/2001/XMLSchema);
message - string (http://www.w3.org/2001/XMLSchema).
Создаем web-сервис "DocWork", пространство имен "http://www.test-ws.org", выбираем пакет "http://www.test-ws.org". Добавляем в сервис операцию "CreateBill", возвращаемый тип File (http://www.test-ws.org), входные параметры:
INN - string (http://www.w3.org/2001/XMLSchema);
Summ - decimal (http://www.w3.org/2001/XMLSchema).
Код web-сервиса:
Код 1C v 8.3 Функция CreateBill(INN, Summ)
typeFile = ФабрикаXDTO.Тип("<a href="http://www.test-ws.org" ,"="">http://www.test-ws.org",</a> "File");
текФайл = ФабрикаXDTO.Создать(typeFile);
текФайл.binaryData = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("<a href="http://www.w3.org/2001/XMLSchema" ,"="">http://www.w3.org/2001/XMLSchema",</a> "base64Binary"));
текФайл.ext = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("<a href="http://www.w3.org/2001/XMLSchema" ,"="">http://www.w3.org/2001/XMLSchema",</a> "string"));
Если ПустаяСтрока(INN) ИЛИ Summ = 0 Тогда
текФайл.message = "empty data";
Возврат текФайл;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", INN);
Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() = 0 Тогда
текФайл.message = "client not found";
Возврат текФайл;
КонецЕсли;
СчетДок = Документы.Счет.СоздатьДокумент();
СчетДок.Дата = ТекущаяДата();
СчетДок.Контрагент = Результат[0].Ссылка;
СчетДок.СуммаДокумента = Summ;
СчетДок.Записать();
ТабДок = Новый ТабличныйДокумент;
Документы.Счет.Печать(ТабДок, СчетДок.Ссылка);
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
текФайл.binaryData = ДанныеФайла;
текФайл.message = "ok";
текФайл.ext = "pdf";
Возврат текФайл;
КонецФункции<br>
Тестовая обработка
Код 1C v 8.3 &НаСервере
Функция ПолучитьПДФ()
ОпределениеВС = Новый WSОпределения("<a href="http://localhost/testWS/ws/ws1.1cws?wsdl" )"="">http://localhost/testWS/ws/ws1.1cws?wsdl")</a>;
СсылкаВС = Новый WSПрокси(ОпределениеВС, "<a href="http://www.test-ws.org" ,"="">http://www.test-ws.org",</a> "DocWork", "DocWorkSoap");
ФайлСервис = СсылкаВС.CreateBill(ИНН, Сумма);
Возврат ФайлСервис.binaryData;
КонецФункции// ПолучитьПДФ()
&НаКлиенте
Процедура СоздатьСчет(Команда)
мДанные = ПолучитьПДФ();
Если мДанные = Неопределено Тогда
Возврат;
КонецЕсли;
мДанные.Записать("c:\temp_bil.pdf");
КонецПроцедуры<br>
А так же обещанное видео, как есть, без купюр
Источник
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Выгрузка в PDF из 1С (Средствами OpenOffice) Возникла задача отправлять счета почтой. PDFcreator не подошёл поскольку не удалось вместить счёт на одну страницу по ширине. Решил попробовать OpenOffice. Как сохранять в PDF нашёл быстро, а вот как уместить счёт на одну страницу вширь искал долго.
В версии 1С 8.2.232 появилась возможность сохранять табличный документ в xls файл на сервера под линуксом. А вот работать с Опеном офисом из-под линукса пока не получается. Собственно комментари ненужны. Вот весь код. Самое интересное это бодание со стилями страниц в Опене Офисе. Жаль что этот фрагмент работает только на клиенте. На сервере вопрос не решается *08
Код 1C v 8.2 УП Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Письмо.Основание.Пустая() Тогда
Возврат
КонецЕсли;
// Открыть OpenOffice
Попытка
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Исключение
Возврат // опен офис не установлен :-(
КонецПопытки;
// получим печатную форму и запишем её во временный XLS файл
Заказ = Письмо.Основание.ПолучитьОбъект();
//Получим печатную форму
Расшифровка=Новый Структура;
Расшифровка.Вставить("СсылкаНаВнешнююОбработку",Константы.ПФСчетаДляКлиента.Получить());
Расшифровка.Вставить("ВидПечатнойФормы",Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма);
Расшифровка.Вставить("НомерСтроки",1);
тд = УниверсальныеМеханизмы.НапечататьВнешнююФорму(Заказ, Расшифровка);
ВременныйФайл =ПолучитьИмяВременногоФайла();
ВременныйФайлXLS =ВременныйФайл + ".xls";
ВременныйФайлPDF =ВременныйФайл + ".pdf";
тд.Записать(ВременныйФайлXLS, ТипФайлаТабличногоДокумента.XLS97);
// Преобразовываем временный xls файл В PDF
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
НастройкиОткрытия = Новый COMSafeArray("VT_VARIANT", 1);
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
PropertyValue.Name = "Hidden";
PropertyValue.Value = Истина;
НастройкиОткрытия.SetValue(0, PropertyValue);
ВременныйФайлXLS_какУРЛ = "file:///" + СтрЗаменить(ВременныйФайлXLS, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный
// Откроем файл в опене офисе
ОпенОфис = Desktop.LoadComponentFromURL(ВременныйФайлXLS_какУРЛ, "_blank", 0, НастройкиОткрытия);
//ПараметрыСтраницы = ОпенОфис.createInstance("com.sun.star.style.PageStyle");
//ПараметрыСтраницы.ScaleToPagesX = 1;
//
// Установим масштаб, чтобы счёт помещался на одной странице вширь
// страниц почему-то много, поэтому устанавливаем масштаб для всех
Стили = ОпенОфис.StyleFamilies.getByName("PageStyles");
Для поз = 0 по Стили.count - 1 Цикл
МойСтиль = Стили.getByIndex(поз);
МойСтиль.ScaleToPagesX = 1; // уместить на одной странице вширь
//МойСтиль.PageScale = 50; // масштаб 50%
КонецЦикла;
НастройкиСохранения = Новый COMSafeArray("VT_VARIANT", 1);
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
PropertyValue.Name = "FilterName";
PropertyValue.Value = "calc_pdf_Export";
НастройкиСохранения.SetValue(0, PropertyValue);
ВременныйФайлPDF_какУРЛ = "file:///" + СтрЗаменить(ВременныйФайлPDF, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный
ОпенОфис.storeToURL(ВременныйФайлPDF_какУРЛ, НастройкиСохранения); // сохранили PDF файл
ОпенОфис.close(-1);
ОпенОфис = Неопределено;
// С опеном офисом разобрались. Прикрепляем вложение к письму и удаляем временные файлы.
//Файл = Новый Файл(ВременныйФайлPDF);
объектПисьмо = Письмо.ПолучитьОбъект();
стрВложение = объектПисьмо.Вложения.Добавить();
стрВложение.ИмяФайла = "Счёт " + Строка(Заказ.Номер) + ".pdf";
стрВложение.Файл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ВременныйФайлPDF));
объектПисьмо.Записать();
Попытка
УдалитьФайлы(ВременныйФайлXLS);
УдалитьФайлы(ВременныйФайлPDF);
Исключение
КонецПопытки;
КонецПроцедуры
Автор:
Трактор
Функция позволяющая выполнить выгрузку табличного документа в PDF средствами OpenOffice
Код 1C v 8.х // Функция превращает табличный документ в PDF документ
// Возвращаемое значение: тип "Строка" - имя созданного PDF файла, 0 - в случае ошибки
// Параметры: ДанныеВыгрузки - Табличный или текстовый документ, который нужно выгрузить в PDF
// ПутьВыгрузки - тип "Строка", путь для сохраниения PDF файла (без имени и расширения файла)
// ИмяФайлаБезРасширения - тип "Строка", имя для вновь сформированного PDF файла
// Тестировалось на OpenOffice 3.x
Функция ВыгрузитьТабличныйДокументВPDF(ДанныеВыгрузки, ПутьВыгрузки, ИмяФайлаБезРасширения)
Если НЕ ЗначениеЗаполнено(ПутьВыгрузки) Тогда
ПутьВыгрузки = КаталогВременныхФайлов();
КонецЕсли;
ПутьВыгрузки = ?(Прав(ПутьВыгрузки, 1) = "\", ПутьВыгрузки, ПутьВыгрузки + "\");
РасширениеXSL = ".xls";
РасширениеPDF = ".pdf";
ПолноеИмяФайлаXLS = ПутьВыгрузки + ИмяФайлаБезРасширения + РасширениеXSL;
//Выгрузка данных печати в файл XLS
#Если Клиент Тогда
Состояние("Создание временного файла...");
#КонецЕсли
Попытка
Если ТипЗнч(ДанныеВыгрузки) = Тип("ТабличныйДокумент") Тогда
ДанныеВыгрузки.Записать(ПолноеИмяФайлаXLS, "XLS");
ИначеЕсли ТипЗнч(ДанныеВыгрузки) = Тип("ТекстовыйДокумент") Тогда
ДанныеВыгрузки.Записать(ПолноеИмяФайлаXLS, "XLS");
Иначе
#Если Клиент Тогда
Сообщить("Данные для выгрузки переданы в неподдерживаемом формате. Дальнейшее выполнение невозможно." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
Возврат 0;
КонецЕсли;
Исключение
#Если Клиент Тогда
Сообщить("Произошла ошибка при выгрузке временного файла. Возможно ошибка доступа к папке, в которую происходит запись." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
Возврат 0;
КонецПопытки;
Попытка
#Если Клиент Тогда
Состояние("Открытие компоненты OpenOffice...");
#КонецЕсли
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("OpenOffice", ServiceManager);
//Открытие временного файла без отображения его окна
#Если Клиент Тогда
Состояние("Открытие временного файла...");
#КонецЕсли
Скрипт.eval("Массив=new Array()");
Массив = Скрипт.eval("Массив");
Скрипт.eval("Массив[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
Скрипт.eval("Массив[0].Name = 'Hidden'");
Скрипт.eval("Массив[0].Value = true");
Скрипт.AddCode("function SetItem(ind,val){Массив[ind]=val}");
Скрипт.AddObject("ServiceManager",ServiceManager);
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
Document = Desktop.LoadComponentFromURL("file:///" + ПолноеИмяФайлаXLS, "_blank", 0, Массив);
//Сохранение в PDF встроенными средствами OpenOffice
#Если Клиент Тогда
Состояние("Запись в PDF...");
#КонецЕсли
Скрипт.eval("Массив2=new Array()");
Массив2 = Скрипт.eval("Массив2");
Скрипт.eval("Массив2[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
Скрипт.eval("Массив2[0].Name = 'FilterName'");
Скрипт.eval("Массив2[0].Value = 'writer_pdf_Export'");
ПолноеИмяФайлаPDF = "file:///" + СтрЗаменить(ПолноеИмяФайлаXLS, РасширениеXSL, РасширениеPDF);
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, ВРег(РасширениеXSL), РасширениеPDF);
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "\", "/");
Document.storeToURL(ПолноеИмяФайлаPDF, Массив2);
Document.close(-1); //Закрыть документ
//Контрольная очистка переменных
Document = Неопределено;
Desktop = Неопределено;
//Удаление временного файла
#Если Клиент Тогда
Состояние("Удаление временного файла...");
#КонецЕсли
Попытка
УдалитьФайлы(ПолноеИмяФайлаXLS);
Исключение
#Если Клиент Тогда
Сообщить("Произошла ошибка при удалении временного файла. Возможно, потребуется удалить его вручную." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
КонецПопытки;
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "file:///", "");
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "/", "\");
#Если Клиент Тогда
Состояние("Выгрузка выполнена.");
Предупреждение("Выгрузка выполнена." + Символы.ПС + ПолноеИмяФайлаPDF);
#КонецЕсли
Возврат ПолноеИмяФайлаPDF;
Исключение
Document.close(-1);
#Если Клиент Тогда
Предупреждение(ОписаниеОшибки());
#КонецЕсли
Возврат 0;
КонецПопытки
КонецФункции
Автор:
doom_2001 Категория:
Работа с Microsoft Office и OpenOffice Экспорт печатных форм и любых данных из 1С в BMP, JPEG, PCX, PDF, PNG и TIFF. Оптимальным решением является установка
Bullzip PDF Printer . После установки в системе появляется виртуальный принтер, с помощью которого можно "печатать" в файл pdf из любого приложения. Программа бесплатная, работает в терминале и имеет поддержку русского языка.
После установки, можно печатать напрямую используя код:
Код 1C v 8.х
//Таб - ТабличныйДокумент
//ИмяФайла – путь для сохранения файла PDF (например «D:\Torg12.pdf»)
Процедура СоздатьФайлПДФ(Таб, ИмяФайла)
Попытка
ПДФПринтер = Новый ComObject(«Bullzip.PDFPrinterSettings»);
ПДФПринтер.SetValue(«output», ИмяФайла);
ПДФПринтер.SetValue(«ShowSaveAS», «never»);
ПДФПринтер.SetValue(«ShowProgress», «no»);
ПДФПринтер.SetValue(«ShowProgressFinished», «no»);
ПДФПринтер.SetValue(«ShowSettings», «never»);
ПДФПринтер.SetValue(«ShowPDF», «no»);
ПДФПринтер.SetValue(«ConfirmOverwrite»,»no»);
ПДФПринтер.WriteSettings();
Таб.Автомасштаб = Истина;
Таб.ИмяПринтера = «Bullzip PDF Printer»;Таб.Напечатать(Истина);
PDFФайл = Новый Файл(ИмяФайла);
Пока НЕ PDFФайл.Существует() Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
Сообщить(«Скорее всего необходимо установить или переустановить «»Bullzip PDF Printer»);
КонецПопытки;
//устанавливаем принтер по умолчанию
Таб.ИмяПринтера = ПолучитьПринтерПоУмолчанию();
КонецПроцедуры
Здесь функция
ПолучитьПринтерПоУмолчанию() нужна для того чтобы вернуть печатной форме принтер по умолчанию, т.к. если напечатать без предварительного просмотра то печать пойдет на виртуальный PDF принтер BullzipPDFPrinter.
Код 1C v 8.х //получаем принтер по умолчанию
Функция ПолучитьПринтерПоУмолчанию()
Скрипт = Новый ComObject(«MSScriptControl.ScriptControl»);
Скрипт.Language = «vbscript»;
Скрипт.AddCode(»
|Function GetDefaultPrinter()
|GetDefaultPrinter=vbNullString
|Set objWMIService=GetObject(«»winmgmts:»" _
|& «»{impersonationLevel=impersonate}!\\.\root\cimv2″»)
|Set colInstalledPrinters=objWMIService.ExecQuery _
|(«»S_elect * from Win32_Printer»")
|For Each objPrinter in colInstalledPrinters
|If objPrinter.Attributes and 4 Then
|GetDefaultPrinter=objPrinter.Name
|Exit For
|End If
|Next
|End Function»);
Возврат СокрЛП(Скрипт.run(«GetDefaultPrinter»));
КонецФункции
Печать в PDF используя bioPDF Категория:
Администрирование