Имя: Пароль:
1C
1С v8
Выгрузка в xls без установленного MSOffice.
,
0 dmrjan
 
06.08.15
14:15
Народ, кто подскажет. Прислали обработку для доработки.
Используется выгрузка в xls.
При запуске отчета вылазит ошибка -
{Форма.Форма.Форма(31)}: Ошибка при вызове конструктора (COMОбъект)
    Excel = Новый COMОбъект("Excel.Application");
по причине:
Недопустимая строка с указанием класса

Обязательна ли для работы обработки наличие MSOffice (использую LibreOffice)?
Можно ли обойтись встроенной функцией выгрузки 1с в xls?
1 Dmitry1c
 
06.08.15
14:17
Обязательна.

Нельзя.
2 shuhard_серый
 
06.08.15
14:18
(0) [Можно ли обойтись встроенной функцией выгрузки 1с в xls?]
это нельзя определить не видя кода обработки
3 ДенисЧ
 
06.08.15
14:18
Сформируй печатную форму и сохрани её как ексель...
4 vicof
 
06.08.15
14:18
ТабличныйДокумент.Записать (SpreadsheetDocument.Write)
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:

Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
Параметры:

<ИмяФайла> (обязательный)

Тип: Строка.
Имя файла, в котором сохраняется табличный документ.
<ТипФайлаТаблицы> (необязательный)

Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание:

Записывает табличный документ в файл.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:

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

ТабДок.Записать("C:\My Documents\Таблица2.mxl");


--------------------------------------------------------------------------------

     Методическая информация
5 dmrjan
 
06.08.15
14:21
Неужто все так плохо? Как же 1С тогда позволяет выгружать отчеты в xls без предустановленного офиса?
6 pavig
 
06.08.15
14:21
(5)
прочитай (4)
7 Гёдза
 
06.08.15
14:22
1с просто понимает формат xls
8 stix2010
 
06.08.15
14:22
>=8.3.5.1999 ТабДок.Записать(имяфайла, Тип)
9 dmrjan
 
06.08.15
14:23
(6) понял, попробую
10 Поpyчик-4
 
06.08.15
14:24
(5) на инфостарте есть набор процедур для чтения/записи в xlsx без установленного MSOffice. Поиск
11 Гёдза
 
06.08.15
14:25
(10) уже не актуально. 8.3.6 уже умеет и читать
12 dmrjan
 
06.08.15
14:26
(11) На 8.2 еще сидим.
13 dmrjan
 
06.08.15
14:27
(10) Заказчику нужен именно xls.
14 Гёдза
 
06.08.15
14:30
(13) Раз нужен - тогда ставь Excel
15 vicof
 
06.08.15
14:36
(14) Заказчик не хочет платить за эксель)
16 stix2010
 
06.08.15
16:35
есть еще конвертация c помощью yoksel.exe  - вход mxl выход xls
17 GenV
 
06.08.15
16:41
10+1
Можно сохранять данные в xml в правильном формате, затем запаковать в zip, затем переименовать архив в Эксель - будет Эксель файл. На инфостарте по-моему был пример такой обработки.
18 Serginio1
 
06.08.15
16:54
19 Serginio1
 
06.08.15
16:56
Типа такого
Процедура ЗаписатьТзВЭксель(тз)
    
    // Допустимые типы
    // adDouble = 5 Значение с плавающей точкой двойной точности
    // adDAte = 7 Дата
    // adCurrency = 6 Денежная сумма
    // adBoolean = 11 Булево
    // adVarWChar = 202 Символьная строка Unicode, заканчивающаяся NULL
    // adLongVarWChar = 203 Длинное строковое значение
    
    
    
    ИмяФайлаЭксель = "D:\Export.xlsx"; // Имя создаваемого файла
    
    Файл=Новый Файл(ИмяФайлаЭксель);
    Если файл.Существует() Тогда
        УдалитьФайлы(ИмяФайлаЭксель);
    КонецЕсли;    
    // Собираем строку подключения
    //СтрокаПодключения = "
    //|Provider=Microsoft.Jet.OLEDB.4.0;
    //|Data Source="+ИмяФайлаЭксель+";
    //|Extended Properties=""Excel 8.0;HDR=Yes;"";";
    
    СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = "+ИмяФайлаЭксель;
    СтрокаПодключения = СтрокаПодключения + ";Mode=Share Deny Write; Extended Properties = "+"""Excel 12.0"+";HDR=Yes;IMEX=1"";";
    ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ИмяФайлаЭксель+";Extended Properties=Excel 12.0 Xml;";
    Connection = Новый COMОбъект("ADODB.Connection");
    
    
    //Catalog = Новый COMОбъект("ADOX.Catalog");
    //Catalog.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ИмяФайлаЭксель+";Extended Properties=Excel 12.0 Xml;";
    
    //Table = New COMОбъект("ADOX.Table");
    //    Table.Name = "TestTable";
    //    Catalog.Tables.Append(Table);
    //    Catalog="";
    
    // Создаем соединение
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(ActiveConnection);
    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = Connection;
    Command.CommandType = 1;
    
    СоздатьТаблицуИКоманд(Тз,Connection,Command);
    
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(СтрокаПодключения);
    Command.ActiveConnection = Connection;
    Command.CommandType = 1;
    
    Параметры= Command.Parameters;    
    ТекстВопросов=" VALUES(";
    ТекстКоманды= "INSERT INTO [Лист1](";
    Для каждого парам из Параметры Цикл
        ТекстКоманды=ТекстКоманды+парам.Name+",";
        ТекстВопросов=ТекстВопросов+"?,"
    КонецЦикла;    
    ТекстКоманды=Лев(ТекстКоманды,стрДлина(ТекстКоманды)-1)+") "+Лев(ТекстВопросов,стрДлина(ТекстВопросов)-1)+")";
    Сообщить(ТекстКоманды);
    Command.CommandText=ТекстКоманды;
    
    //     Command.CommandText="INSERT INTO [Лист1$](Марка,Номер,Количество,Цена,Название)  VALUES('Марка','Номер',1,2.2,'Название')";
    //     Command.Execute();
    //возврат;
    
    Command.prepared=истина;
    
    
    //Command.CommandText=ТекстКоманды;
    Для каждого Выборка из Тз Цикл
        Для каждого парам из Параметры Цикл
            Значение=Выборка[Парам.Name];
            Если Парам.Type=203 Тогда
                Парам.Size=СтрДлина(Значение)+1;
            КонецЕсли;    
            Парам.Value=Значение;
            
        КонецЦикла;    
        
        
        Command.Execute();
    КонецЦикла;
    //
    // Закрываем соединение
    Command = Неопределено;
    Connection.Close();
    Connection = Неопределено;
    
КонецПроцедуры
20 spectre1978
 
06.08.15
20:04
(0) как вариант, можно еще сделать автоматизацией через UNO в calc все то же что делалось в Excel. Но это джедайский путь :)
21 Провинциальный 1сник
 
06.08.15
20:39
(12) Переход на 8.3 бесплатный, если че. Зачем заморачиваться с ком-оле, если можно использовать нативные возможности платформы?
22 Попытка1С
 
06.08.15
20:48
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший