Имя: Пароль:
IT
 
Конвертировать MXL в PDF (XLS...)
0 Dmitriy_
Kolesnikov
 
13.02.13
08:16
Доброе утро!
Есть такая задача: подключаюсь к 8.1 через ВнешнееСоединение, формирую ТабличныйДокумент (счёт, акт, сф...) и выгружаю. Выгрузить из 8.1 можно только в txt и mxl, другие форматы для ТабличныйДокумент.Записать() в режиме внешнего соединения недоступны.
Вопрос в том, как дальше этот полученный MXL преобразовать в другой формат (в идеале pdf, но пойдёт любой другой).

Что уже обсуждалось и не подошло:
ТабличныйДокумент.Напечатать() - не работает в режиме внешнего соединения
Йоксель - не понимает на входе MXL, сохранённый из 8.1 с помощью ТабличныйДокумент.Записать(<Имя файла>, ТипФайлаТабличногоДокумента.MXL или MXL7)

Какие ещё есть варианты?
Исходим из того, что есть готовый ТабличныйДокумент.
1 Wobland
 
13.02.13
08:18
обработка для "в хтмл" подойдёт?
2 Balabass
 
13.02.13
08:19
пачать в ПДФ не предлагать?
3 Dmitriy_
Kolesnikov
 
13.02.13
08:20
(1) как MXL конвертировать в HTML?
Напрямую выгрузить в HTML нельзя:


ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)
Параметры:
<Имя файла> (обязательный)
Тип: Строка. Имя файла, в котором сохраняется табличный документ.
<Тип файла таблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента. Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL
Описание:
Записывает табличный документ в файл.
Примечание:
При работе на сервере или через com-соединение использует только файлы форматов mxl и txt.
4 Dmitriy_
Kolesnikov
 
13.02.13
08:20
(2) см. (0) - метод Напечатать() недоступен в режиме внешнегоСоединения.
5 Wobland
 
13.02.13
08:21
(3) обработкой
6 Balabass
 
13.02.13
08:21
Передать разве нельзя табличный документ дальше?
7 Wobland
 
13.02.13
08:22
(6) у меня была похожая беда (регзадание на сервере). куда передать, когда результат должен сам лежать готовый? ;)
8 Dmitriy_
Kolesnikov
 
13.02.13
08:23
(5) обработкой - это интересно. Поделитесь обработкой?
(6) куда передать?
9 Wobland
 
13.02.13
08:25
(8) "распарсивание" формата mxl. куда тебе? //её ещё в бардачке найти надо
10 Dmitriy_
Kolesnikov
 
13.02.13
08:27
11 rphosts
 
13.02.13
08:35
(9) нашёл?
12 Wobland
 
13.02.13
08:38
плин, извините, коллеги, не вижу. есть ещё одно место, но в него попасть сложно - материнка померла ;)
13 Dmitriy_
Kolesnikov
 
13.02.13
08:45
:(
14 Dmitriy_
Kolesnikov
 
13.02.13
08:47
Wobland, общую идею не помните? Может намекнёте, а дальше сам напишу и поделюсь со всеми.
15 Нуф-Нуф
 
13.02.13
08:52
Подключиться к базе. Сохранить в мхл. Из текущей базы открыть сохраненный мхл. Передам мать в нужном формате
16 Wobland
 
13.02.13
08:53
(14) там был жестокий разбор формата. я б не рискнул
17 Wobland
 
13.02.13
08:55
+(16) вроде б mxl читался как текстовый документ
18 Dmitriy_
Kolesnikov
 
13.02.13
09:32
(17) если открыть MXL блокнотом, то текстовый файл это напоминает слабо.
19 Wobland
 
13.02.13
09:35
(18) хм.. попробовал. на 8.1 вроде по-человечьи было
20 Wobland
 
13.02.13
09:35
(19) ага

MOXCEL
{"#","",1,1,"#","Язык по умолчанию","Язык по умолчанию"},
{128,72},
{1,1,
{4,0,
{0},1,1,3,f527dc88-1d39-40b3-bcbb-d98b690ead68,0},0},0,
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},0,2,24,0,0,10,0,
{16,1,
{1,1,
{"#","Метаданные"}
}
},1,
{16,1,
{1,1,
21 ДенисЧ
 
13.02.13
09:36
переходи на 8.2...
22 smitru
 
13.02.13
09:48
(0)
1. Устанавливаешь "виртуальный принтер в PDF"
2. Под 1Ской направляешь на печать свой XML-файл на этот виртуальнй принтер.

Далее наслаждаешься жизнью :-)
23 Dmitriy_
Kolesnikov
 
13.02.13
09:54
(21) низззя. Конфигурация слишком доработанная, риск некорректной работы на новой платформе велик. Простои недопустимы.
(22) см. (4)
24 smitru
 
13.02.13
10:05
(23) ну ё-ё-ё...
Этот метод отсутствует а контексте ТабличныйДокумент.Напечатать()


А тебе говорят "поставь драйвер", сохраняешь выгрузку через ТабличныйДокумент.Записать() и затем уже на него посылай напечатать.. общей функцией, а не через контекст
25 Dmitriy_
Kolesnikov
 
13.02.13
10:43
(24) извини, не догоняю.
Что за "общая функция"?
8.1 не знает общей функции Напечатать. Только как метод объектов ТабличныйДокумент, ГеографическаяСхема.
26 Галахад
 
гуру
13.02.13
10:46
(0) Подключение не из 1С?
27 Dmitriy_
Kolesnikov
 
13.02.13
10:57
(26) подключение из javascript
28 Галахад
 
гуру
13.02.13
11:33
(27) Если конфигурацию можно править, то добавить процедуру в общий модуль:

Процедура СохранитьВЭксель(ТабДок, ИмяФайлаЭксель) Экспорт

ТабДок.Записать(ИмяФайлаЭксель, "xls");

КонецПроцедуры
29 Dmitriy_
Kolesnikov
 
13.02.13
11:52
(28) а разве в общем модуле не действуют ограничения, описанные в справке?
см. (3):
При работе на сервере или через com-соединение использует только файлы форматов mxl и txt.
30 Dmitriy_
Kolesnikov
 
13.02.13
16:30
Короче, решил задачу очень некрасиво.
1. Поставил платформу 8.3.
2. В ней создал чистую конфу с единственной функцией для конвертации MXL в PDF:


Функция СохранитьМХЛвПДФ(ПутьККаталогу) Экспорт
   Если ПутьККаталогу = "" или ПутьККаталогу = Неопределено Тогда
       Возврат ложь;
   КонецЕсли;
   
   ИмяZIPФайла = ПолучитьИмяВременногоФайла(".zip");
   ФайлАрхива = Новый ЗаписьZipФайла(ИмяZIPФайла, , ,
                                 МетодСжатияZIP.Сжатие,
                                 УровеньСжатияZIP.Максимальный);

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


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

КонецФункции



===
Одно плохо: файлы PDF получаются по 2-4 мегабайта каждый. Как бы это пофиксить?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший