helpf.pro
Регистрация
 +4 
Распечатать

Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice?

Код 1C v 8.х
  Перем СсылкаНаДокумент;

Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
	
	ДокументСсылка = СсылкаНаДокумент;
	ИмяФайла = ПолучитьИмяВременногоФайла();

	// Теперь формируем файл из MS Wordа
	Попытка
		
		MSWord = новый COMОбъект("Word.Application");
		//Передаем текущие параметры форм в MSWord
		MSWord.Documents.Open(ИмяФайла);	
		MSWordDoc = MSWord.ActiveDocument();
		
		WordContent =  MSWord.ActiveDocument().ActiveWindow.S_election;
		
		//------------------------------------------------------------
		// Перебираем таблицы в документе, и сопоставляем имена переменных
		// с именами табличных частей.
		Для ТекущаяТаблица = 1 ПО MSWordDoc.Tables.Count Цикл 
			мТабличнаяЧасть = Неопределено;
			Для ТекущаяСтрока  = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Rows.Count Цикл 
				Для ТекущаяКолонка = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Columns.Count Цикл 
					
					мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
					ПолучитьСтартПеременной( MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока,ТекущаяКолонка).Range.Text	) 
					,ДокументСсылка);
					
					Если  мТабличнаяЧасть <> Неопределено Тогда
						Прервать;;	
					КонецЕсли;	
					
				КонецЦикла;
				Если  мТабличнаяЧасть <> Неопределено Тогда
					Прервать;;	
				КонецЕсли;	
			КонецЦикла;
			
			//Итак мы имеем номер текущей таблицы  и имя табличной части
			Если  мТабличнаяЧасть <> Неопределено Тогда
				//Производим редактирование нашей таблицы в соответствии с количеством строк
				ВсегоСтрокТЧ = 0;
				Для Каждого строкаТЧ Из  ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
					ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
				КонецЦикла;
				//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
				// Добавляем строки
				Для ТекущаяСтрокаТЧ  = 1  По ВсегоСтрокТЧ Цикл
					Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ  Тогда
						MSWordDoc.Tables(ТекущаяТаблица).Rows.Add(MSWordDoc.Tables(ТекущаяТаблица).Rows(ТекущаяСтрока+ТекущаяСтрокаТЧ-1));
					КонецЕсли;	
					//MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,2).Range.Text = Строка(ТекущаяСтрокаТЧ);
					Для ТекКол = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Columns.Count Цикл 
						Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ  Тогда
							ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ,ТекКол).Range.Text));
							ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
							MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
						Иначе
							ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text));
							ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
							MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
						КонецЕсли;	
					КонецЦикла;	
				КонецЦикла;	
				//MSWordDoc.Tables(ТекущаяТаблица).Rows.Delete();
				//MSWordDoc.Tables(ТекущаяТаблица).Rows(3).Delete();
			КонецЕсли;	
		КонецЦикла;
		
		//------------------------------------------------------------
		// Вытаскивам из шаблона текст 
		ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
		
		// Из текста вытаскиваем Имена переменных залюченных а скобки []
		Список = ПолучитьСписокПеременных(ТекстДокумента);
		//Список.ВыбратьЭлемент();
		
		// Заполняем в структуру ревизитовперечень переменных
		СтруктураРеквизитов=СтруктураРеквизитовДокумента(ДокументСсылка);
		ЗначениеРеквизита="";
		Для Каждого ЭлементСписка Из Список Цикл
			
			// Если находится соответствие переменной из документа и шаблона то производим замену
			Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
				//Сообщить("["+ЭлементСписка.Значение+"]"+" : "+ЗначениеРеквизита);
				WordContent.Find.Execute("["+ЭлементСписка.Значение+"]",0,0,0,0,0,-1,,,Строка(ЗначениеРеквизита),2);		
			Иначе
				Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
				// Заменим переменную на пустую строку
				WordContent.Find.Execute("["+ЭлементСписка.Значение+"]",0,0,0,0,0,-1,,," ",2);		
			КонецЕсли;
			
		КонецЦикла;
		
		//автоматически обновляем поля документа
		MSWord.S_election.WholeStory();
		MSWord.S_election.Fields.Update();
		MSWord.S_election.HomeKey();	
		
		//MSWordDoc.SaveAs(ИмяФайла);
		
		//отображаем MSWord
		MSWord.Visible=1;
		MSWord.Activate();
		
	Исключение
		Предупреждение(ОписаниеОшибки());
		MSWord.Quit();
	КонецПопытки;
	
	
	// Теперь формируем файл из OpenOffice
	
	Попытка
		ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
		Reflection = ServiceManager.createInstance("com.sun.star.reflection.CoreReflection");
		Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
		
		Args = Новый COMSafeArray("VT_DISPATCH", 1);
		OOДокумент = Desktop.loadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args);
		
		//------------------------------------------------------------
		// Перебираем таблицы в документе, и сопоставляем имена переменных
		// с именами табличных частей.
		Для ТекущаяТаблица = 0 ПО OOДокумент.getTextTables().Count-1 Цикл 
			мТабличнаяЧасть = Неопределено;
			Для ТекущаяСтрока  = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.Count-1 Цикл 
				Для ТекущаяКолонка = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл 
					
					мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
					ПолучитьСтартПеременной( OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекущаяКолонка, ТекущаяСтрока).string	) 
					,ДокументСсылка);
					
					Если  мТабличнаяЧасть <> Неопределено Тогда
						Прервать;;	
					КонецЕсли;	
					
				КонецЦикла;
				Если  мТабличнаяЧасть <> Неопределено Тогда
					Прервать;;	
				КонецЕсли;	
			КонецЦикла;
			
			//Итак мы имеем номер текущей таблицы  и имя табличной части
			Если  мТабличнаяЧасть <> Неопределено Тогда
				//Производим редактирование нашей таблицы в соответствии с количеством строк
				ВсегоСтрокТЧ = 0;
				Для Каждого строкаТЧ Из  ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
					ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
				КонецЦикла;
				//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
				// Добавляем строки
				Для ТекущаяСтрокаТЧ  = 1  По ВсегоСтрокТЧ Цикл
					Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ  Тогда
						// Добавляем строку перед нашей
						OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.I_nsertByIndex(ТекущаяСтрока+ТекущаяСтрокаТЧ-1, 1);
					КонецЕсли;	
					
					Для ТекКол = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл 
						
						Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ  Тогда             
							ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ).string));
							ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
							OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
						Иначе                                                   
							ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string));
							ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
							
							OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
						КонецЕсли;	
					КонецЦикла;	
				КонецЦикла;	
			КонецЕсли;	
		КонецЦикла;
		
		//------------------------------------------------------------
		// Вытаскивам из шаблона текст 
		//ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
		ТекстДокумента = ООПолучитьТекст(OOДокумент);
		
		// Из текста вытаскиваем Имена переменных залюченных а скобки []
		Список = ПолучитьСписокПеременных(ТекстДокумента);
		//Список.ВыбратьЭлемент();
		
		// Заполняем в структуру ревизитовперечень переменных
		СтруктураРеквизитов=СтруктураРеквизитовДокумента(ДокументСсылка);
		ЗначениеРеквизита="";
		
		OOЗамена = OOДокумент.CreateReplaceDescriptor();
		
		Для Каждого ЭлементСписка Из Список Цикл
			
			// Если находится соответствие переменной из документа и шаблона то производим замену
			Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
				OOЗамена.SearchString  = "["+ЭлементСписка.Значение+"]";
				OOЗамена.ReplaceString = Строка(ЗначениеРеквизита);
				OOДокумент.ReplaceAll(OOЗамена);
			Иначе
				Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
				// Заменим переменную на пустую строку
				OOЗамена.SearchString  = "["+ЭлементСписка.Значение+"]";
				OOЗамена.ReplaceString = " ";
				OOДокумент.ReplaceAll(OOЗамена);
				
			КонецЕсли;
			
		КонецЦикла;
		OOДокумент.getCurrentController().getFrame().getContainerWindow().setFocus();
		
	Исключение
		Предупреждение(ОписаниеОшибки());
	КонецПопытки;			
	
КонецПроцедуры    


Код 1C v 8.х
   //ДОПОЛНИТЕЛЬНО НЕОБХОДИМЫЕ ФУНКЦИИ
// Добавлем форматы представления полей и дополнительную информацию о полях
Процедура ДобавитьФорматы(ПереченьРеквизитов,Значение,пПредставлениеРеквизита, ДокументСсылка = Неопределено)
	Если ТипЗнч(Значение) = Тип("Дата")  Тогда  // расширяем представление даты
		ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ДФddMMyyyy",Формат(Значение,"ДФ=dd.MM.yyyy"));
		ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ДЛФDD",Формат(Значение,"ДЛФ=DD"));
	ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда  // расширяем представление числа
		ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧДЦ2ЧГ0",Формат(Значение,"ЧДЦ=2; ЧГ=0"));
		ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧДЦ2",Формат(Значение,"ЧДЦ=2"));
		ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧПропись",Значение);
	ИначеЕсли  (ТипЗнч(Значение) = Тип("СправочникСсылка.КонтактныеЛица"))  или  (ТипЗнч(Значение) = Тип("СправочникСсылка.ФизическиеЛица")) Тогда
		// Расширяем выводимые поля для типов физ. лица, контакные лица сокращением инициалов	
		ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ФИО",Строка(Значение));
	КонецЕсли
КонецПроцедуры

Процедура ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,РеквизитСсылка,Реквизит,пПредставлениеРеквизита)
	
	мГлубинаРекурсии = мГлубинаРекурсии+1;
	ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"Код",РеквизитСсылка["Код"]);
	ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"Наименование",РеквизитСсылка["Наименование"]);
	
	Для Каждого ЭлементРеквизита Из Реквизит.Реквизиты  Цикл
		ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя,РеквизитСсылка[ЭлементРеквизита.Имя]);
		Если (Найти(ЭлементРеквизита.Тип,"Справочник ссылка")>0) И (мГлубинаРекурсии <=3) И (Найти(ЭлементРеквизита.Тип,",")=0) Тогда
			///+++
			ЗаполнитьРеквизиты(мГлубинаРекурсии, ПереченьРеквизитов,РеквизитСсылка[ЭлементРеквизита.Имя],РеквизитСсылка[ЭлементРеквизита.Имя].Метаданные(),пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя);
		Иначе
			ДобавитьФорматы(ПереченьРеквизитов,РеквизитСсылка[ЭлементРеквизита.Имя],пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя);
		КонецЕсли
	КонецЦикла;	
	
КонецПроцедуры

Функция ПолучитьСписокПеременных(ТекстШаблона)
	СписокПеременных = Новый СписокЗначений();
	ЕщеЕсть = Истина;
	Пока ЕщеЕсть Цикл
		ПервыйСимвол = Найти(ТекстШаблона,"[");
		Если ПервыйСимвол > 0 Тогда
			ВторойСимвол = Найти(ТекстШаблона,"]");
			Если (ВторойСимвол > 0 И ВторойСимвол > ПервыйСимвол) Тогда
				СписокПеременных.Добавить(Сред(ТекстШаблона,ПервыйСимвол + 1,ВторойСимвол - ПервыйСимвол - 1));
				ТекстШаблона = Сред(ТекстШаблона,ВторойСимвол + 1);
			Иначе
				ЕщеЕсть = Ложь;
			КонецЕсли;
		Иначе
			ЕщеЕсть = Ложь;
		КонецЕсли;
	КонецЦикла;
	Возврат СписокПеременных;
КонецФункции

Функция СтруктураРеквизитовДокумента(ДокументСсылка)  Экспорт
	ПереченьРеквизитов = Новый Структура;
	ПереченьРеквизитов.Вставить("Дата",ДокументСсылка["Дата"]);
	ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка["Дата"],"Дата");
	ПереченьРеквизитов.Вставить("Номер",ДокументСсылка["Номер"]);
	Реквизиты = ДокументСсылка.Метаданные().Реквизиты;
	Для Каждого Реквизит Из Реквизиты  Цикл
		мГлубинаРекурсии = 1;
		ПереченьРеквизитов.Вставить(Реквизит.Имя,ДокументСсылка[Реквизит.Имя]);
			ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],Реквизит.Имя,ДокументСсылка);
		Если Найти(Реквизит.Тип,"Справочник ссылка")>0 Тогда
			ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],ДокументСсылка[Реквизит.Имя].Метаданные(),Реквизит.Имя);
		Иначе
			//ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],Реквизит.Имя);
		КонецЕсли;
	КонецЦикла;	
	ТабличныеЧасти = ДокументСсылка.Метаданные().ТабличныеЧасти;
	Для Каждого ТабличнаяЧасть Из ТабличныеЧасти  Цикл
		// Сообщить(ТабличнаяЧасть); // Для таблицы характеристик отрабатываем свой код // с выводом табличной части как набора реквизитов
		Если ТабличнаяЧасть.Имя = "Характеристики" Тогда
			Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть.Имя]  Цикл
				мПредставлениеРеквизита = "Характеристика"+"_"+СтрЗаменить(СтрокаТабличнойЧасти["ВидХарактеристики"], " ", "_");
				мЗначение = СтрокаТабличнойЧасти["ЗначениеХарактеристики"];
				ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
				ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
				Если Найти(ТипЗнч(мЗначение),"Справочник ссылка")>0 Тогда
					ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,мЗначение,мЗначение.Метаданные(),мПредставлениеРеквизита);
				КонецЕсли;
				
			КонецЦикла;	
		КонецЕсли;	
		//Перечень реквизитов табличной части
		Реквизиты = ТабличнаяЧасть.Реквизиты;
		Для Каждого Реквизит Из Реквизиты  Цикл
			Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть.Имя]  Цикл
				мГлубинаРекурсии = 1;
				мПредставлениеРеквизита = "_"+СтрокаТабличнойЧасти.НомерСтроки+"_"+ТабличнаяЧасть.Имя+"_НомерСтроки";
				ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,Строка(СтрокаТабличнойЧасти.НомерСтроки));
				мПредставлениеРеквизита = "_"+СтрокаТабличнойЧасти.НомерСтроки+"_"+ТабличнаяЧасть.Имя+"_"+Реквизит.Имя;
				мЗначение = СтрокаТабличнойЧасти[Реквизит.Имя];
				ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
				ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
				Если Найти(ТипЗнч(мЗначение),"Справочник ссылка")>0 Тогда
					ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,мЗначение,мЗначение.Метаданные(),мПредставлениеРеквизита);
				Иначе
					//ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита);
				КонецЕсли;
			КонецЦикла;	
			//Если реквизит числовой, то подсчитываем итог  
			Если Реквизит.Тип.СодержитТип(Тип("Число"))  Тогда
				мЗначение = ДокументСсылка[ТабличнаяЧасть.Имя].Итог(Реквизит.Имя);
				мПредставлениеРеквизита = "Итог"+"_"+ТабличнаяЧасть.Имя+"_"+Реквизит.Имя;
				ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
				ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
			КонецЕсли;
		КонецЦикла;			
	КонецЦикла;	    	
	Возврат ПереченьРеквизитов;
КонецФункции

Функция ИмяТабличнойЧастиВСтроке(Строка,ДокументСсылка)
	ТабличнаяЧасть=Неопределено;
	Если НЕ ПустаяСтрока(Строка) Тогда
		ТабличнаяЧасть = ДокументСсылка.Метаданные().ТабличныеЧасти.Найти(Строка) 
	КонецЕсли;	
	Возврат ТабличнаяЧасть;
	
КонецФункции

//Получает первый кусок переменной до _
Функция ПолучитьСтартПеременной(ПереданнаяСтрока) Экспорт
	СтартПеременной = "";
	ПервыйСимвол = Найти(ПереданнаяСтрока,"[");
	Если  ПервыйСимвол > 0 Тогда
		ВторойСимвол = Найти(ПереданнаяСтрока,"]");
		Если  (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
			Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
			ВторойСимвол = Найти(Переменная,"_");
			Если  (ВторойСимвол > 0) И (ВторойСимвол > 1) Тогда
				СтартПеременной = Сред(Переменная,1,ВторойСимвол-1);
			КонецЕсли;	
		КонецЕсли;	
		
	КонецЕсли;	
	
	Возврат СтартПеременной;	
КонецФункции

// Получает переменную заключенную в скобки
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока) Экспорт
	Переменная = "";
	ПервыйСимвол = Найти(ПереданнаяСтрока,"[");
	Если  ПервыйСимвол > 0 Тогда
		ВторойСимвол = Найти(ПереданнаяСтрока,"]");
		Если  (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
			Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
		КонецЕсли;	
		
	КонецЕсли;	
	Возврат Переменная;	
КонецФункции// Идентифицирует табличную часть в строке

// Функция преобразует Windows имя файла в URL OpenOffice
Функция ПреобразоватьВURL(ИмяФайла)
	Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
КонецФункции

// Функция извлекает текст из документа
Функция ООПолучитьТекст(OOДокумент)
	Текст = "";
	oParEnum = OOДокумент.getText().createEnumeration();
	Пока  oParEnum.hasMoreElements() Цикл
		oPar = oParEnum.nextElement();
		Если  oPar.supportsService("com.sun.star.text.Paragraph") ТОгда
			Текст = Текст + oPar.getString();
		ИначеЕсли oPar.supportsService("com.sun.star.text.TextTable") Then
			//Сообщить(oPar.getString());
		КонецЕсли;
	КонецЦикла;
	Для ТекущаяТаблица = 0 ПО OOДокумент.getTextTables().Count-1 Цикл 
		Для ТекущаяСтрока  = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.Count-1 Цикл 
			Для ТекущаяКолонка = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл 
				Текст = Текст + OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекущаяКолонка, ТекущаяСтрока).string;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	Возврат Текст;
КонецФункции    
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 25288
 +4 
Распечатать
Возможно, вас также заинтересует
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 53
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1С Предприятие что это? 13
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое
Cодержимое указанного ниже веб-сайта в этом приложении блокируется... Aboutsecurity_1cv8c.exe 2
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э
Excel файл как Внешний источник данных 17
Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто. 1. В конфигурации добавляет новый объект метаданных типа " Внешние источники данных" и назовем его просто " Excel" . https://helpf.pro/uploads/img
HTML5 Canvas в 1С 8.3 или Google нам поможет 0
Добрался я для написания маленьких тестов для 1С в плане web графики. Версии 1С 8.2.61 и 8.3.3.641. Зайдем на http://www.w3schools.com/html/html5_canvas.asp и перенесем примеры в обработку 1С. Скачать обработку: Результаты не радуют. 1С в Intern
Посмотреть все результаты поиска похожих
Комментарии
skvorcov_74
10.10.2012 11:22Комментарий: 3
skvorcov_74
На счет опэн офиса всё как-то запутано чересчур, у меня работает так:
Код 1C v 8.х
 	// Открываем Опупэн Оффисце 
	ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
	Desktop           = ServiceManager.createInstance("com.sun.star.frame.Desktop");
    Args                = Новый COMSafeArray("VT_DISPATCH", 1);

	ТекстовыйПроцессор = Desktop.LoadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args); 
		
	// Заменяем ключевые поля на нужные значения
	Replace = ТекстовыйПроцессор.CreateReplaceDescriptor();
		
	Для НомСтр=0 По ТД.Количество()-1 Цикл
		Replace.SearchString  = "здесь текст который будем менять";
		Replace.ReplaceString = "здесь текст на который меняем";
		ТекстовыйПроцессор.ReplaceAll(Replace);
	КонецЦикла;   


единственная функция которая понадобится из дополнительных это ПреобразоватьВURL
а вот кто и как будет туда переменные для поиска и замены передавать это уже к опен офису не относится да и вообще к любому офису
skvorcov_74
08.10.2012 16:47Комментарий: 2
skvorcov_74
насчет форматирования тут уже нужно искать в форумах по VBA, например для ворда параметры страницы можно задать так:
Код 1C v 8.2 УП
  // параметры страницы 1 cm = 28.35 points
	Документ.PageSetup.TopMargin =  28.35;
	Документ.PageSetup.BottomMargin =  28.35;
	Документ.PageSetup.LeftMargin =  28.35;
	Документ.PageSetup.RightMargin =  28.35;   
8SiriuS8
16.11.2010 18:23Комментарий: 1
8SiriuS8
Все конечно хорошо но тут страдает форматирование конечного документа, а как его сохранить чтоб оно не отличалось от шаблона
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!