15.04.2015 00:50
KirillHome
 
Вступление.

Долгое время 1с у меня работало просто в режиме "толстого клиента" на терминальном сервере (база - файловая, максимально работает 5 человек).
Но - чем дальше, тем больше падает скорость работы (проблема скорее всего - в медленных дисках).
В общем, поднял на том же сервере IIS, опубликовал базы на нём, и перестроил работу с "толстого клиента" на "тонкого". Помогло (первый запуск 1с - 45 секунд, последующие - 10 секунд; в режиме "толстого клиента" - запуск не быстрее 2 минут).

Возникшая проблема - есть внешний отчёт, который выводит информацию в Excel.
Сам файл формируется в директиве &НаСервере.
И после перехода на web:
  • под пользователем с правами администратора - отчёт запускается, файл формируется, доступен пользователю для просмотра, изменения, но - не для сохранения;
  • под пользователем с обычными правами - говорит о невозможности сформировать файл.
Пока нашёл "простой" выход (по-честному, костыль, думаю дальше придумаю лучший вариант).
Проверил, что Excel не запущен ни под одним из пользователей (если запущен - обязательно закрыть).
Пуск - выполнить - dcomcnfg
Службы компонентов - Мой компьютер - настройка DCOM - Microsoft Excel Application
Правая кнопка мыши - свойства - удостоверение.
В "Какую учётную запись использовать для запуска данного приложения" стояло - "Запускающий пользователь".
Исправил на "Текущий пользователь".
ОК.

Всё, проблема ушла (проверил как под администратором, так и под обычным пользователем).

P.S. Скорее всего - надо переделать вывод информации в ТаблицуЗначений, которую заполню на сервере, и передам её на клиента, где уже и формировать форму в Excel.
15.04.2015 06:51
BotMan
 
а если запускать 1с от имени админа?
15.04.2015 09:40
baggio
 
1. Проблема скорее всего в том что ты строки в жксель заполняешь через OLE.
2. Эксель не поддерживает заполнение по OLE в несколько потоков (не вашно под одним пользователем или под несколькими в терминале...)
3. мы долго былись с негоативными результатами... и в итоге ушли на формирование файла средствами OO и LibreOffice...
чуток медленнее зато можно не закрывать Exel и формировать в несколько потоков под разными пользователями...
15.04.2015 10:15
KirillHome
 
Цитата:
BotMan а если запускать 1с от имени админа?
Не пробовал, но как-то не вижу смысла, если честно.
Хотя вечером попробую и так - что получится. Отпишусь.

Цитата:
baggio 1. Проблема скорее всего в том что ты строки в жксель заполняешь через OLE.
2. Эксель не поддерживает заполнение по OLE в несколько потоков (не вашно под одним пользователем или под несколькими в терминале...)
3. мы долго былись с негоативными результатами... и в итоге ушли на формирование файла средствами OO и LibreOffice...
чуток медленнее зато можно не закрывать Exel и формировать в несколько потоков под разными пользователями...
Ну да, через OLE
Код:
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
	Исключение
		Возврат "Ложь " + ОписаниеОшибки() + Символы.ПС + "Программа Exсel не установлена на данном компьютере!";
	КонецПопытки;
	ИмяКниги = Excel.WorkBooks.Add();
...
Но почему у меня работает под несколькими пользователями?
Я, конечно, вечером проверю ещё раз (благо, из-за красивостей оформления отчёт работает не 5 секунд, а минуты три).

Всё же, как мне кажется, основная проблема была именно в том, что Excel я вызываю &НаСервере, соответственно, он пытался запустится под тем же пользователем, что "ответственен" за запуск сервера (в моём случае - Web-сервере IIS - это группа IIS_IUSRS (Встроенная группа, которую используют службы IIS)).
15.04.2015 10:32
baggio
 
Цитата:
KirillHome Но почему у меня работает под несколькими пользователями?
Ну не знаю... у нас на 2003 офисе его нормально завести не удавалось...
возможно чтото поправили в последующих версиях...
хз..
но вот по факту...

кстати может дело в правах пользователя винды на создание глобальных объектов?
15.04.2015 10:56
KirillHome
 
Не знаю.

У меня такие "входные данные"
Win Server 2008 (x'64)
IIS 7.5
MS Office 2013 (x'64)
1c 8.3
15.04.2015 13:29
BotMan
 
у меня на 7.7 все работает под несколькими пользователями одновременно. офис 2007 стоит.
19.04.2015 00:21
KirillHome
 
После очередной перезагрузки - всё пропало
В смысле - стало писать "Excel не установлен на данном компьютере"

Плюнул на всё, и переписал весь код "по старинке" - через формирование XML-файла (взял отчёт, сформированный ранее в Excel, сохранил его в формате "Таблица XML 2003", и уже к этому формату привёл всё).

Получилось следующее
Много, много текста:

Код:
&НаКлиенте
Процедура Сформировать(Команда)
	//Получим адрес во временном хранилище сформированного в ФормируемТЗНаСервере() файла "двоичных данных"
	АдресВХранилище = ФормируемТЗНаСервере();
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	
	//Запишем его во временный файл
	ПолноеИмяВремФайла = ПолучитьИмяВременногоФайла("xml");
	ДвоичныеДанные.Записать(ПолноеИмяВремФайла);
	
	НаличиеExcel = Истина;
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
	Исключение
		НаличиеExcel = Ложь;
	КонецПопытки;
	
	//Так как всё в Windows, то будем, всё же, работать с каталогом "Мои документы" пользователя
	WshShell = Новый COMОбъект("WScript.Shell");
	WshSpecialFolders = WshShell.SpecialFolders();
	МоиДокументы = WshSpecialFolders.Item("MyDocuments");
	Если Прав(МоиДокументы,1) <> "\" Тогда
		МоиДокументы = МоиДокументы + "\";
	КонецЕсли;
	
	Если НаличиеExcel Тогда
		//Откроем временный файл
		КнигаExcel = Excel.WorkBooks.Open(ПолноеИмяВремФайла);
		
		//и запишем его в формате XLS в каталог "Мои документы"
		ИмяФайла = Формат(ТекущаяДата(), "ДФ=""ддММгггг-ЧЧммсс""");
		ПолноеИмяФайла = МоиДокументы + ИмяФайла + ".xls";
		ФайлСуществует = 1;
		Пока ФайлСуществует = 1 Цикл
			ФайлВывода = Новый Файл(ПолноеИмяФайла);
			Если НЕ ФайлВывода.Существует() Тогда
				ФайлСуществует = 0;
			Иначе
				ИмяФайла = ИмяФайла + "1";
				ПолноеИмяФайла = МоиДокументы + ИмяФайла + ".xls";
			КонецЕсли;
		КонецЦикла;
		КнигаExcel.SaveAs(ПолноеИмяФайла, -4143);	
		Excel.Application.Quit();
		//Удалим временный файл
		УдалитьФайлы(ПолноеИмяВремФайла);
	Иначе
		//перепишем временный файл в каталог "Мои документы"
		ПолноеИмяФайла = МоиДокументы + ИмяФайла + ".xml";
		ФайлСуществует = 1;
		Пока ФайлСуществует = 1 Цикл
			ФайлВывода = Новый Файл(ПолноеИмяФайла);
			Если НЕ ФайлВывода.Существует() Тогда
				ФайлСуществует = 0;
			Иначе
				ИмяФайла = ИмяФайла + "1";
				ПолноеИмяФайла = МоиДокументы + ИмяФайла + ".xml";
			КонецЕсли;
		КонецЦикла;
		ПереместитьФайл(ПолноеИмяВремФайла,ПолноеИмяФайла);
	КонецЕсли;
	
	//И запустим файл (ну, точнее говоря, ассоциированное с ним приложение)
	ЗапуститьПриложение(ПолноеИмяФайла);
КонецПроцедуры

&НаСервере
Функция ФормируемТЗНаСервере()
	
	ЕстьВходящееСальдо = 0;
	ЕстьОборотыПоДебету = 0;
	ЕстьОборотыПоКредиту = 0;
	ЕстьИсходящееСальдо = 0;
	
	ЗапросОстатки = Новый Запрос;
	ЗапросОстатки.Текст = "ВЫБРАТЬ
	| ХозрасчетныйОстатки.Счет,
	| ХозрасчетныйОстатки.Субконто1,
	| ХозрасчетныйОстатки.СуммаОстатокДт,
	| ХозрасчетныйОстатки.СуммаОстатокКт,
	| ХозрасчетныйОстатки.СуммаОстаток
	|ИЗ
	| РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = &Счет, ,Организация = &Организация) КАК ХозрасчетныйОстатки
	|ГДЕ
	| ХозрасчетныйОстатки.Субконто1 = &Субконто1";
	
	ЗапросОстатки.УстановитьПараметр("Дата", НачалоДня(Отчет.ДатаНачала)); 
	ЗапросОстатки.УстановитьПараметр("Счет", Отчет.Счет); 
	ЗапросОстатки.УстановитьПараметр("Организация", Отчет.Организация); 
	ЗапросОстатки.УстановитьПараметр("Субконто1", Отчет.РасСчет); 
	
	ВыборкаВходящееСальдо = ЗапросОстатки.Выполнить().Выбрать();
	Если ВыборкаВходящееСальдо.Количество() > 0 Тогда
		ЕстьВходящееСальдо = 1;
	КонецЕсли;
	
	ЗапросОборотыДт = Новый Запрос;
	ЗапросОборотыДт.Текст = "ВЫБРАТЬ
	|	ХозрасчетныйДвиженияССубконто.Период,
	|	ХозрасчетныйДвиженияССубконто.СчетКт,
	|	ХозрасчетныйДвиженияССубконто.Сумма,
	|	ХозрасчетныйДвиженияССубконто.Содержание,
	|	ХозрасчетныйДвиженияССубконто.Регистратор
	|ИЗ
	|	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&ДатаНачальная,&ДатаКонечная,Организация = &Организация
	|                И СчетДт = &СчетДт
	|                И Активность = ИСТИНА) КАК ХозрасчетныйДвиженияССубконто
	|ГДЕ
	|	ХозрасчетныйДвиженияССубконто.СубконтоДт1 = &Субконто1
	|УПОРЯДОЧИТЬ ПО
	|	СчетКт.Код,
	|	ХозрасчетныйДвиженияССубконто.Период
	|ИТОГИ Сумма(Сумма) ПО
	|	ОБЩИЕ,
	|	СчетКт";
	
	ЗапросОборотыДт.УстановитьПараметр("ДатаНачальная", НачалоДня(Отчет.ДатаНачала)); 
	ЗапросОборотыДт.УстановитьПараметр("ДатаКонечная", КонецДня(Отчет.ДатаЗавершения));
	ЗапросОборотыДт.УстановитьПараметр("СчетДт", Отчет.Счет); 
	ЗапросОборотыДт.УстановитьПараметр("Организация", Отчет.Организация); 
	ЗапросОборотыДт.УстановитьПараметр("Субконто1", Отчет.РасСчет); 
		
	ВыборкаДебет = ЗапросОборотыДт.Выполнить().Выбрать();
	Если ВыборкаДебет.Количество() > 0 Тогда
		ЕстьОборотыПоДебету = 1;
	КонецЕсли;
	
	ЗапросОборотыКт = Новый Запрос;
	ЗапросОборотыКт.Текст = "ВЫБРАТЬ
	|	ХозрасчетныйДвиженияССубконто.Период,
	|	ХозрасчетныйДвиженияССубконто.СчетДт,
	|	ХозрасчетныйДвиженияССубконто.Сумма,
	|	ХозрасчетныйДвиженияССубконто.Содержание,
	|	ХозрасчетныйДвиженияССубконто.Регистратор
	|ИЗ
	|	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&ДатаНачальная,&ДатаКонечная,Организация = &Организация
	|                И СчетКт = &СчетКт
	|                И Активность = ИСТИНА) КАК ХозрасчетныйДвиженияССубконто
	|ГДЕ
	|	ХозрасчетныйДвиженияССубконто.СубконтоКт1 = &Субконто1
	|УПОРЯДОЧИТЬ ПО
	|	СчетДт.Код,
	|	ХозрасчетныйДвиженияССубконто.Период
	|ИТОГИ Сумма(Сумма) ПО
	|	ОБЩИЕ,
	|	СчетДт";
	
	ЗапросОборотыКт.УстановитьПараметр("ДатаНачальная", НачалоДня(Отчет.ДатаНачала)); 
	ЗапросОборотыКт.УстановитьПараметр("ДатаКонечная", КонецДня(Отчет.ДатаЗавершения));
	ЗапросОборотыКт.УстановитьПараметр("СчетКт", Отчет.Счет); 
	ЗапросОборотыКт.УстановитьПараметр("Организация", Отчет.Организация); 
	ЗапросОборотыКт.УстановитьПараметр("Субконто1", Отчет.РасСчет); 
	
	ВыборкаКредит = ЗапросОборотыКт.Выполнить().Выбрать();
	Если ВыборкаКредит.Количество() > 0 Тогда
		ЕстьОборотыПоКредиту = 1;
	КонецЕсли;
	
	ЗапросОстатки.УстановитьПараметр("Дата", Новый Граница(КонецДня(Отчет.ДатаЗавершения), ВидГраницы.Включая));
	ВыборкаИсходящееСальдо = ЗапросОстатки.Выполнить().Выбрать();
	Если ВыборкаИсходящееСальдо.Количество() > 0 Тогда
		ЕстьИсходящееСальдо = 1;
	КонецЕсли;
	
	//Опишем - куда мы будем выводить файл. Т.е. в текст.
	НовДок = Новый ТекстовыйДокумент;
	
	//Заполняем заголовок (описание, разметка)
	СтрокаДоб = "";
	СтрокаДоб = "<?xml version=""1.0""?>
	|<?mso-application progid=""Excel.Sheet""?>
	|<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""
	| xmlns:o=""urn:schemas-microsoft-com:office:office""
	| xmlns:x=""urn:schemas-microsoft-com:office:excel""
	| xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""
	| xmlns:html=""http://www.w3.org/TR/REC-html40"">
	| <DocumentProperties xmlns=""urn:schemas-microsoft-com:office:office"">
	|  <Author>Kir</Author>
	|  <LastAuthor>Kir</LastAuthor>
	|  <Created>2015-04-17T13:47:09Z</Created>
	|  <LastSaved>2015-04-17T13:49:11Z</LastSaved>
	|  <Version>14.00</Version>
	| </DocumentProperties>
	| <OfficeDocumentSettings xmlns=""urn:schemas-microsoft-com:office:office"">
	|  <AllowPNG/>
	| </OfficeDocumentSettings>
	| <ExcelWorkbook xmlns=""urn:schemas-microsoft-com:office:excel"">
	|  <WindowHeight>13350</WindowHeight>
	|  <WindowWidth>23955</WindowWidth>
	|  <WindowTopX>360</WindowTopX>
	|  <WindowTopY>135</WindowTopY>
	|  <ProtectStructure>False</ProtectStructure>
	|  <ProtectWindows>False</ProtectWindows>
	| </ExcelWorkbook>
	| <Styles>
	|  <Style ss:ID=""Default"" ss:Name=""Normal"">
	|   <Alignment ss:Vertical=""Bottom""/>
	|   <Borders/>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/>
	|   <Interior/>
	|   <NumberFormat/>
	|   <Protection/>
	|  </Style>
	|  <Style ss:ID=""m47348820"">
	|   <Alignment ss:Horizontal=""Right"" ss:Vertical=""Bottom""/>
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|  </Style>
	|  <Style ss:ID=""m47348840"">
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|   <NumberFormat ss:Format=""#,##0.00&quot;р.&quot;""/>
	|  </Style>
	|  <Style ss:ID=""m47348148"">
	|   <Alignment ss:Horizontal=""Center"" ss:Vertical=""Bottom""/>
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|  </Style>
	|  <Style ss:ID=""m47348168"">
	|   <Alignment ss:Horizontal=""Right"" ss:Vertical=""Bottom""/>
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|  </Style>
	|  <Style ss:ID=""m47348208"">
	|   <Alignment ss:Horizontal=""Center"" ss:Vertical=""Bottom""/>
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|  </Style>
	|  <Style ss:ID=""m47348228"">
	|   <Alignment ss:Horizontal=""Right"" ss:Vertical=""Bottom""/>
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|  </Style>
	|  <Style ss:ID=""m47347760"">
	|   <Alignment ss:Horizontal=""Right"" ss:Vertical=""Bottom""/>
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|  </Style>
	|  <Style ss:ID=""m47347780"">
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|   <NumberFormat ss:Format=""#,##0.00&quot;р.&quot;""/>
	|  </Style>
	|  <Style ss:ID=""s63"">
	|   <Alignment ss:Horizontal=""Center"" ss:Vertical=""Bottom""/>
	|  </Style>
	|  <Style ss:ID=""s73"">
	|   <Borders>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|  </Style>
	|  <Style ss:ID=""s90"">
	|   <Alignment ss:Horizontal=""Center"" ss:Vertical=""Bottom""/>
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|  </Style>
	|  <Style ss:ID=""s100"">
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <NumberFormat ss:Format=""@""/>
	|  </Style>
	|  <Style ss:ID=""s101"">
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <NumberFormat ss:Format=""Short Date""/>
	|  </Style>
	|  <Style ss:ID=""s102"">
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <NumberFormat ss:Format=""#,##0.00&quot;р.&quot;""/>
	|  </Style>
	|  <Style ss:ID=""s103"">
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|  </Style>
	|  <Style ss:ID=""s111"">
	|   <Borders>
	|    <Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|    <Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1""/>
	|   </Borders>
	|   <Font ss:FontName=""Calibri"" x:CharSet=""204"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000"" ss:Bold=""1""/>
	|   <NumberFormat ss:Format=""#,##0.00&quot;р.&quot;""/>
	|  </Style>
	| </Styles>";
	НовДок.ДобавитьСтроку(СтрокаДоб);	
	
	//Заполним информацию о листе
	СтрокаДоб = "";
	СтрокаДоб = " <Worksheet ss:Name=""Лист1"">
	|  <Table ss:ExpandedColumnCount=""5"" x:FullColumns=""1""
	|   x:FullRows=""1"" ss:DefaultRowHeight=""15"">
	|   <Column ss:AutoFitWidth=""0"" ss:Width=""225""/>
	|   <Column ss:AutoFitWidth=""0"" ss:Width=""375""/>
	|   <Column ss:AutoFitWidth=""0"" ss:Width=""53.25""/>
	|   <Column ss:AutoFitWidth=""0"" ss:Width=""87"" ss:Span=""1""/>";
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	//Начинаем заполнять шапку
	СтрокаДоб = "";
	СтрокаДоб = "   <Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""s63""><Data ss:Type=""String"">Журнал-ордер синтетического счета</Data></Cell>
	|   </Row>
	|   <Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""s63""><Data ss:Type=""String"">ОписаниеСчетаПредприятия</Data></Cell>
	|   </Row>
	|   <Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""s63""><Data ss:Type=""String"">ОписаниеПериода</Data></Cell>
	|   </Row>
	|   <Row>
	|    <Cell ss:MergeAcross=""4""/>
	|   </Row>";
	
	СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСчетаПредприятия",Отчет.Счет.Код + Символы.НПП+Отчет.РасСчет.Наименование + Символы.НПП + "... по предприятю..." + Символы.НПП + Отчет.Организация.Наименование);
	СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеПериода","с" + Символы.НПП + Формат(Отчет.ДатаНачала, "ДФ=""дд ММММ гггг""") + Символы.НПП +"по" + Символы.НПП + Формат(Отчет.ДатаЗавершения, "ДФ=""дд ММММ гггг"""));
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	//Начальное сальдо
	СтрокаДоб = "";
	СтрокаДоб = "   <Row>
	|    <Cell ss:MergeAcross=""1"" ss:StyleID=""m47347760""><Data ss:Type=""String"">ОписаниеСальдо</Data></Cell>
	|    <Cell ss:MergeAcross=""2"" ss:StyleID=""m47347780""ЗначениеСальдо
	|   </Row>";
	
	//На всякий случай запомним, как будет выглядеть строка, если есть сальдо
	//|    <Cell ss:MergeAcross=""2"" ss:StyleID=""m47347780""><Data ss:Type=""Number"">84236.34</Data></Cell>
	
	Если Отчет.Счет.Вид = ВидСчета.Активный Тогда
		СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСальдо","Начальное сальдо (дебет)");
	Иначе
		СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСальдо","Начальное сальдо (кредит)");
	КонецЕсли;
	Если ЕстьВходящееСальдо = 1 Тогда
		Пока ВыборкаВходящееСальдо.Следующий() Цикл
			Если Отчет.Счет.Вид = ВидСчета.Активный Тогда
				ВходящееСальдо = ВыборкаВходящееСальдо.СуммаОстатокДт;
			Иначе
				ВходящееСальдо = ВыборкаВходящееСальдо.СуммаОстатокКт;
			КонецЕсли;
			СтрокаДоб = СтрЗаменить(СтрокаДоб,"ЗначениеСальдо","><Data ss:Type=""Number"">"+Формат(ВходящееСальдо,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ=")+"</Data></Cell>");
		КонецЦикла;
	Иначе
		СтрокаДоб = СтрЗаменить(СтрокаДоб,"ЗначениеСальдо","/>");
	КонецЕсли;
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	//Обороты по дебету (заголовок)
	СтрокаДоб = "";
	СтрокаДоб = "   <Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""s73""/>
	|   </Row>
	|   <Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""m47348148""><Data ss:Type=""String"">Дебет</Data></Cell>
	|   </Row>
	|   <Row>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Наименование кор. счета</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Содержание хозяйственной операции</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Дата</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Сумма</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Итого</Data></Cell>
	|   </Row>";
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	ИтогПоНаправлению = 0.0;
	
	//Обороты по дебету (строки)
	Если ЕстьОборотыПоДебету = 1 Тогда
		СтрокаДоб = "";
		СтрокаСтарт = "";
		СтрокаСтарт = "   <Row>
		|    <Cell ss:StyleID=""s100""ОписаниеСчета
		|    <Cell ss:StyleID=""s100""><Data ss:Type=""String"">ОписаниеОперации</Data></Cell>
		|    <Cell ss:StyleID=""s101""><Data ss:Type=""String"">ДатаОперации</Data></Cell>
		|    <Cell ss:StyleID=""s102""><Data ss:Type=""Number"">СуммаОперации</Data></Cell>
		|    <Cell ss:StyleID=""s102""ИтогПоОперации
		|   </Row>";
		
		//На всякий случай - запомним, как должна выглядеть строка, если все поля заполнены
		//СтрокаСтарт = "   <Row>
		//|    <Cell ss:StyleID=""s100""><Data ss:Type=""String"">50.01Касса организации</Data></Cell>
		//|    <Cell ss:StyleID=""s100""><Data ss:Type=""String"">Торговая выручка сдана в банк</Data></Cell>
		//|    <Cell ss:StyleID=""s101""><Data ss:Type=""String"">16.02.2015</Data></Cell>
		//|    <Cell ss:StyleID=""s102""><Data ss:Type=""Number"">40000</Data></Cell>
		//|    <Cell ss:StyleID=""s102""><Data ss:Type=""Number"">40000</Data></Cell>
		//|   </Row>";
		
		
		КоличествоСчетов = 0;
		КоличествоСтрокПоСчету = 0;
		СуммаПоСчету = 0.0;
		ИтогПоНаправлению = 0.0;
		НужнаЗапись = Ложь;
	
		Пока ВыборкаДебет.Следующий() Цикл
			Если ВыборкаДебет.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
				КоличествоСчетов = КоличествоСчетов + 1;
				Если КоличествоСчетов <> 1 Тогда
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоОперации","><Data ss:Type=""Number"">"+Формат(СуммаПоСчету,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ=")+"</Data></Cell>");
				КонецЕсли;
				СуммаПоСчету = ВыборкаДебет.Сумма;
				КоличествоСтрокПоСчету = 0;
				НовДок.ДобавитьСтроку(СтрокаДоб);
				НужнаЗапись = Ложь;
			ИначеЕсли ВыборкаДебет.ТипЗаписи() = ТипЗаписиЗапроса.ОбщийИтог Тогда
				ИтогПоНаправлению = ВыборкаДебет.Сумма;
			Иначе
				Если НужнаЗапись Тогда
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоОперации","/>");
					НовДок.ДобавитьСтроку(СтрокаДоб);
					НужнаЗапись = Ложь;
				КонецЕсли;
				КоличествоСтрокПоСчету = КоличествоСтрокПоСчету + 1;
				СтрокаДоб = "";
				СтрокаДоб = СтрокаСтарт;
				Если КоличествоСтрокПоСчету = 1 Тогда
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСчета","><Data ss:Type=""String"">"+ВыборкаДебет.СчетКт.Код + Символы.НПП + ВыборкаДебет.СчетКт.Наименование+"</Data></Cell>");
				Иначе
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСчета","/>");
				КонецЕсли;
				СтрокаСодержание = СтрЗаменить(ВыборкаДебет.Содержание, Символы.ПС, " ");
				СтрокаСодержание = СтрЗаменить(СтрокаСодержание, "  ", " ");
			
				Если ВыборкаДебет.Регистратор.Метаданные().Имя = Метаданные.Документы.ПоступлениеНаРасчетныйСчет.Имя Тогда
					Если Найти(СтрокаСодержание,ВыборкаДебет.Регистратор.НазначениеПлатежа) <> 1 Тогда
						СтрокаСодержание = ВыборкаДебет.Регистратор.НазначениеПлатежа + " " +СтрокаСодержание;
						СтрокаСодержание = СтрЗаменить(СтрокаСодержание, Символы.ПС, " ");
						СтрокаСодержание = СтрЗаменить(СтрокаСодержание, "  ", " ");
					КонецЕсли;
				КонецЕсли;
				СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеОперации",СтрокаСодержание);
				СтрокаДоб = СтрЗаменить(СтрокаДоб,"ДатаОперации",Формат(ВыборкаДебет.Период, "ДФ=""дд.ММ.гггг"""));
				СтрокаДоб = СтрЗаменить(СтрокаДоб,"СуммаОперации",Формат(ВыборкаДебет.Сумма,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ="));
				НужнаЗапись = Истина;
			КонецЕсли;
		КонецЦикла;	
		Если КоличествоСчетов > 0 Тогда
			СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоОперации","><Data ss:Type=""Number"">"+Формат(СуммаПоСчету,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ=")+"</Data></Cell>");
			НовДок.ДобавитьСтроку(СтрокаДоб);
		КонецЕсли;
	КонецЕсли;
	
	//Обороты по дебету (итог)
	СтрокаДоб = "";
	СтрокаДоб = "   <Row>
	|    <Cell ss:MergeAcross=""3"" ss:StyleID=""m47348168""><Data ss:Type=""String"">Итого дебет:</Data></Cell>
	|    <Cell ss:StyleID=""s111""><Data ss:Type=""Number"">ИтогПоДебету</Data></Cell>
	|   </Row>
	|   <Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""s73""/>
	|   </Row>";
		
	СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоДебету",Формат(ИтогПоНаправлению,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ="));
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	
	//Обороты по кредиту (заголовок)
	СтрокаДоб = "";
	СтрокаДоб = "	<Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""m47348208""><Data ss:Type=""String"">Кредит</Data></Cell>
	|   </Row>
	|   <Row>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Наименование кор. счета</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Содержание хозяйственной операции</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Дата</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Сумма</Data></Cell>
	|    <Cell ss:StyleID=""s90""><Data ss:Type=""String"">Итого</Data></Cell>
	|   </Row>";
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	ИтогПоНаправлению = 0.0;
	
	//Обороты по кредите (строки)
	Если ЕстьОборотыПоКредиту = 1 Тогда
		СтрокаДоб = "";
		СтрокаСтарт = "";
		СтрокаСтарт = "   <Row>
		|    <Cell ss:StyleID=""s100""ОписаниеСчета
		|    <Cell ss:StyleID=""s100""><Data ss:Type=""String"">ОписаниеОперации</Data></Cell>
		|    <Cell ss:StyleID=""s101""><Data ss:Type=""String"">ДатаОперации</Data></Cell>
		|    <Cell ss:StyleID=""s102""><Data ss:Type=""Number"">СуммаОперации</Data></Cell>
		|    <Cell ss:StyleID=""s102""ИтогПоОперации
		|   </Row>";
		
		КоличествоСчетов = 0;
		КоличествоСтрокПоСчету = 0;
		СуммаПоСчету = 0.0;
		ИтогПоНаправлению = 0.0;
		НужнаЗапись = Ложь;
		
		Пока ВыборкаКредит.Следующий() Цикл
			Если ВыборкаКредит.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
				КоличествоСчетов = КоличествоСчетов + 1;
				Если КоличествоСчетов <> 1 Тогда
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоОперации","><Data ss:Type=""Number"">"+Формат(СуммаПоСчету,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ=")+"</Data></Cell>");
				КонецЕсли;
				СуммаПоСчету = ВыборкаКредит.Сумма;
				КоличествоСтрокПоСчету = 0;
				НовДок.ДобавитьСтроку(СтрокаДоб);
				НужнаЗапись = Ложь;
			ИначеЕсли ВыборкаКредит.ТипЗаписи() = ТипЗаписиЗапроса.ОбщийИтог Тогда
				ИтогПоНаправлению = ВыборкаКредит.Сумма;
			Иначе
				Если НужнаЗапись Тогда
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоОперации","/>");
					НовДок.ДобавитьСтроку(СтрокаДоб);
					НужнаЗапись = Ложь;
				КонецЕсли;
				СтрокаДоб = "";
				СтрокаДоб = СтрокаСтарт;
				КоличествоСтрокПоСчету = КоличествоСтрокПоСчету + 1;
				Если КоличествоСтрокПоСчету = 1 Тогда
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСчета","><Data ss:Type=""String"">"+ВыборкаКредит.СчетДт.Код + Символы.НПП + ВыборкаКредит.СчетДт.Наименование+"</Data></Cell>");
				Иначе
					СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСчета","/>");
				КонецЕсли;
				СтрокаСодержание = СтрЗаменить(ВыборкаКредит.Содержание, Символы.ПС, " ");
				СтрокаСодержание = СтрЗаменить(СтрокаСодержание, "  ", " ");
			
				Если ВыборкаКредит.Регистратор.Метаданные().Имя = Метаданные.Документы.ПоступлениеНаРасчетныйСчет.Имя Тогда
					Если Найти(СтрокаСодержание,ВыборкаКредит.Регистратор.НазначениеПлатежа) <> 1 Тогда
						СтрокаСодержание = ВыборкаКредит.Регистратор.НазначениеПлатежа + " " +СтрокаСодержание;
						СтрокаСодержание = СтрЗаменить(СтрокаСодержание, Символы.ПС, " ");
						СтрокаСодержание = СтрЗаменить(СтрокаСодержание, "  ", " ");
					КонецЕсли;
				КонецЕсли;
				СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеОперации",СтрокаСодержание);
				СтрокаДоб = СтрЗаменить(СтрокаДоб,"ДатаОперации",Формат(ВыборкаКредит.Период, "ДФ=""дд.ММ.гггг"""));
				СтрокаДоб = СтрЗаменить(СтрокаДоб,"СуммаОперации",Формат(ВыборкаКредит.Сумма,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ="));
				НужнаЗапись = Истина;
			КонецЕсли;
		КонецЦикла;	
		Если КоличествоСчетов > 0 Тогда
			СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоОперации","><Data ss:Type=""Number"">"+Формат(СуммаПоСчету,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ=")+"</Data></Cell>");
			НовДок.ДобавитьСтроку(СтрокаДоб);
		КонецЕсли;
	КонецЕсли;
	
	//Обороты по кредиту (итог)
	СтрокаДоб = "";
	СтрокаДоб = "   <Row>
	|    <Cell ss:MergeAcross=""3"" ss:StyleID=""m47348228""><Data ss:Type=""String"">Итого кредит:</Data></Cell>
	|    <Cell ss:StyleID=""s111""><Data ss:Type=""Number"">ИтогПоКредиту</Data></Cell>
	|   </Row>
	|   <Row>
	|    <Cell ss:MergeAcross=""4"" ss:StyleID=""s73""/>
	|   </Row>";
	
	СтрокаДоб = СтрЗаменить(СтрокаДоб,"ИтогПоКредиту",Формат(ИтогПоНаправлению,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ="));
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	//Конечное сальдо
	СтрокаДоб = "";
	СтрокаДоб = "   <Row>
	|    <Cell ss:MergeAcross=""1"" ss:StyleID=""m47348820""><Data ss:Type=""String"">ОписаниеСальдо</Data></Cell>
	|    <Cell ss:MergeAcross=""2"" ss:StyleID=""m47348840""ЗначениеСальдо
	|   </Row>";
	
	Если Отчет.Счет.Вид = ВидСчета.Активный Тогда
		СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСальдо","Конечное сальдо (дебет)");
	Иначе
		СтрокаДоб = СтрЗаменить(СтрокаДоб,"ОписаниеСальдо","Конечное сальдо (кредит)");
	КонецЕсли;
	Если ЕстьИсходящееСальдо = 1 Тогда
		Пока ВыборкаИсходящееСальдо.Следующий() Цикл
			Если Отчет.Счет.Вид = ВидСчета.Активный Тогда
				ИсходящееСальдо = ВыборкаИсходящееСальдо.СуммаОстатокДт;
			Иначе
				ИсходящееСальдо = ВыборкаИсходящееСальдо.СуммаОстатокКт;
			КонецЕсли;
			СтрокаДоб = СтрЗаменить(СтрокаДоб,"ЗначениеСальдо","><Data ss:Type=""Number"">"+Формат(ИсходящееСальдо,"ЧЦ=15; ЧДЦ=2; ЧРД='.'; ЧГ=")+"</Data></Cell>");
		КонецЦикла;
	Иначе
		СтрокаДоб = СтрЗаменить(СтрокаДоб,"ЗначениеСальдо","/>");
	КонецЕсли;
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	//Завершение книги
	СтрокаДоб = "";
	СтрокаДоб = "  </Table>
	|  <WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel"">
	|   <PageSetup>
	|    <Header x:Margin=""0.3""/>
	|    <Footer x:Margin=""0.3""/>
	|    <PageMargins x:Bottom=""0.75"" x:Left=""0.7"" x:Right=""0.7"" x:Top=""0.75""/>
	|   </PageSetup>
	|   <Print>
	|    <ValidPrinterInfo/>
	|    <PaperSizeIndex>9</PaperSizeIndex>
	|    <HorizontalResolution>600</HorizontalResolution>
	|    <VerticalResolution>600</VerticalResolution>
	|   </Print>
	|   <Selected/>
	|   <Panes>
	|    <Pane>
	|     <Number>3</Number>
	|     <RangeSelection>R1C1:R1C5</RangeSelection>
	|    </Pane>
	|   </Panes>
	|   <ProtectObjects>False</ProtectObjects>
	|   <ProtectScenarios>False</ProtectScenarios>
	|  </WorksheetOptions>
	| </Worksheet>
	|</Workbook>";
	НовДок.ДобавитьСтроку(СтрокаДоб);
	
	ВремФайл = ПолучитьИмяВременногоФайла("txt");
	НовДок.Записать(ВремФайл);
	ДвоичДанные = Новый ДвоичныеДанные(ВремФайл);
	Адрес = ПоместитьВоВременноеХранилище(ДвоичДанные, УникальныйИдентификатор);
	УдалитьФайлы(ВремФайл);
	
	Возврат Адрес;
КонецФункции
20.04.2015 14:22
KirillHome
 
По результатам проверки выполнения на компьютере без установленного MS Excel, но - с установленным LO

1) Забыл про формирование имени файла в этом случае

Код:
	Иначе
		//перепишем временный файл в каталог "Мои документы"
		ПолноеИмяФайла = МоиДокументы + ИмяФайла + ".xml";
Надо либо добавить строку
Код:
		ИмяФайла = Формат(ТекущаяДата(), "ДФ=""ддММгггг-ЧЧммсс""");
либо вынести это определение имение файла перед Если.

2) Сформированный xml-файл открывается (по умолчанию) через IE. Это не совсем тот результат, который хотелось бы получить.
Правильнее, наверное, сохранять файл c расширением odt (для LO) или ods (для OO) - в этом случае по умолчанию запустится scalc из пакета LO/OO (можно, конечно, сделать ему и расширение xls - но при установленном и при ассоциации с ним xls файлов - выдаётся ошибка).
20.04.2015 15:06
Micle
 
кстати, помнится мне, что раньше, html таблица записанная в файл с расширением .xls прекрасно открывалась в Экселе.
Часовой пояс GMT +3, время: 11:10.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.