[codebox]Если СокрЛП(ПутьКПечФорме)<>"" Тогда
Если Найти(ПутьКПечФорме,".odt")>0 Тогда //OpenOffice
Состояние("Создаем документ OO Writer...");
scr=СоздатьОбъект("MSScriptControl.ScriptControl");
scr.language="javascript";
scr.eval("Massiv=new Array()");
Massiv=scr.eval("Massiv"); //создали массив на ява
ServiceManager=СоздатьОбъект("com.sun.star.ServiceManager");
Scr.AddObject("ServiceManager",ServiceManager);
Desktop=ServiceManager.createInstance("com.sun.star.frame.Desktop"); //сом объект
FileNameSh = СокрЛП(ПутьКПечФорме);
URL = СтрЗаменить(FileNameSh," ","%20");
URL = СтрЗаменить(URL,"\","/");
URL ="file://localhost/" + URL;
Попытка
DocumentSh=Desktop.LoadComponentFromURL(URL,"_blank",0, Massiv ); //шаблон текста
Document=Desktop.LoadComponentFromURL("private:factory/swriter","_blank",0, Massiv ); //новый документ
Исключение
КонецПопытки;
dispatcher = ServiceManager.createInstance("com.sun.star.frame.DispatchHelper"); //компанента для копирования
dispatcher.executeDispatch(DocumentSh.CurrentController.Frame, ".uno:SelectAll", "", 0, Massiv);//выделить все
dispatcher.executeDispatch(DocumentSh.CurrentController.Frame, ".uno:Copy", "", 0, Massiv);//копировать
dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno
aste", "", 0, Massiv);//вставить в новый документ
DocumentSh.Close(0); //закрываем шаблон
Для Инд=1 По Закладки.РазмерСписка() Цикл
Закладка = СокрЛП(Закладки.ПолучитьЗначение(Инд));
ЗакладкаЦ = Закладка;
Текст = Подстановка(Закладка);
// ишем и заменяем
SearchDesc=Document.createReplaceDescriptor();//компанента для поиска
SearchDesc.SearchString = Закладка;//искомый текст
SearchDesc.ReplaceString = Текст;//замена
Document.replaceAll(SearchDesc);// заменяем все по шаблону
КонецЦикла;
//Сетка
TextTables = Document.getTextTables();//список таблиц документа
Table = TextTables.getByIndex(12);//получаем нужную таблицу
Rows = Table.getRows();//список строк таблицы
ТТрафика = СоздатьОбъект("Справочник.ТипыТрафика");
ТСетка = СоздатьОбъект("Справочник.СеткаТарифов");
ТТрафика.ИспользоватьВладельца(Тариф);
Валюта = Подстановка("ТарифВалюта");
ПервыйПроход=0;
Н=3;
ТТрафика.ВыбратьЭлементы();
Пока ТТрафика.ПолучитьЭлемент()=1 Цикл
Если ТТрафика.ЯвляетсяТарифицируемым = 0 Тогда
Продолжить;
КонецЕсли;
//шапка
Если ПервыйПроход=0 Тогда
Table.getCellByPosition(0,Н).setString(ТТрафика.Наименование);
Cell=Table.getCellByPosition(0,Н); //Ячейка таблицы
CellCursor = Cell.createTextCursor();//выделяем текст
CellCursor.paraAdjust = 0;//0 по левому краю
Н=Н+1;
Rows.insertByIndex(Н,1);//добавляем строку
Table.getCellByPosition(0,Н).setString("Объем трафика");
Cell=Table.getCellByPosition(0,Н); //Ячейка таблицы
CellCursor = Cell.createTextCursor();//выделяем текст
CellCursor.paraAdjust = 1;//1 по правому краю
Table.getCellByPosition(2,Н).setString("Стоимость");
ПервыйПроход=1;
Иначе
Н=Н+1;
Rows.insertByIndex(Н,1);//добавляем строку
Table.getCellByPosition(0,Н).setString(ТТрафика.Наименование);
Cell=Table.getCellByPosition(0,Н); //Ячейка таблицы
CellCursor = Cell.createTextCursor();//выделяем текст
CellCursor.paraAdjust = 0;//0 по левому краю
Н=Н+1;
Rows.insertByIndex(Н,1);//добавляем строку
Table.getCellByPosition(0,Н).setString("Объем трафика");
Cell=Table.getCellByPosition(0,Н); //Ячейка таблицы
CellCursor = Cell.createTextCursor();//выделяем текст
CellCursor.paraAdjust = 1;//1 по правому краю
Table.getCellByPosition(2,Н).setString("Стоимость");
КонецЕсли;
//сетка
ЗнакОбъема = ?(Тариф.ТарифМегабайт=1," Mб."," Гб.");
SearchDesc.SearchString = "ЗнакОбъема";//искомый текст
SearchDesc.ReplaceString = ЗнакОбъема;//замена
Document.replaceAll(SearchDesc);
ТСетка.ИспользоватьВладельца(ТТрафика.ТекущийЭлемент());
ТСетка.ПорядокРеквизита("Интервал");
ТСетка.ВыбратьЭлементы();
ПерваяСтрочкаСетки=0;
Пока ТСетка.ПолучитьЭлемент() = 1 Цикл
Н=Н+1;
Rows.insertByIndex(Н,1);//добавляем строку
Если ПерваяСтрочкаСетки=0 Тогда
Table.getCellByPosition(0,Н).setString("1 Мб.");
Table.getCellByPosition(1,Н).setString(?(ТСетка.Интервал>=9999999.000,"и более",Строка(ТСетка.Интервал)+ЗнакОбъема));
Table.getCellByPosition(2,Н).setString(СокрЛП(Строка(Формат(ТСетка.Стоимость,"Ч15.2. "))));
Table.getCellByPosition(3,Н).setString(Строка(Валюта + ". за 1 "+ЗнакОбъема));
ИнтервалОт=Строка(ТСетка.Интервал);
ПерваяСтрочкаСетки=1;
Иначе
Table.getCellByPosition(0,Н).setString(ИнтервалОт+ЗнакОбъема);
Table.getCellByPosition(1,Н).setString(?(ТСетка.Интервал>=9999999.000,"и более",Строка(ТСетка.Интервал)+ЗнакОбъема));
Table.getCellByPosition(2,Н).setString(СокрЛП(Строка(Формат(ТСетка.Стоимость,"Ч15.2. "))));
Table.getCellByPosition(3,Н).setString(Строка(Валюта + ". за 1 "+ЗнакОбъема));
ИнтервалОт=Строка(ТСетка.Интервал);
КонецЕсли;
КонецЦикла;
КонецЦикла;
dispatcher.executeDispatch(Document.CurrentController.Frame, ".uno:GoToStartOfDoc", "", 0,Massiv);//в начало документа
Иначе//MS Word
Состояние("Создаем документ MS Word...");
Если ФС.СуществуетФайл(ПутьКПечФорме) = 0 Тогда
Предупреждение("Файл шаблона не найден");
Возврат;
КонецЕсли;
Word=СоздатьОбъект("Word.Application");
Word.Options.CheckSpellingAsYouType = 0;
Word.Options.CheckGrammarAsYouType = 0;
Word.Options.CheckGrammarWithSpelling = 0;
Word.Documents.Add(ПутьКПечФорме);
Document=Word.ActiveDocument;
//
ЗнакОбъема = ?(Тариф.ТарифМегабайт=1," Mб."," Гб.");
//
к = Закладки.РазмерСписка();
Для н = 1 по к Цикл
Закладка = СокрЛП(Закладки.ПолучитьЗначение(н));
ЗакладкаЦ = Закладка;
Текст = Подстановка(Закладка);
// Заменяем пока закладки не кончатся
ц = 0;
Пока ц < 10 Цикл
Метка2Текст(ЗакладкаЦ, Текст);
ц = ц + 1;
ЗакладкаЦ = Закладка + СокрЛП(ц);
КонецЦикла;
КонецЦикла;
// Сетка
BookMark = Document.Bookmarks("НачалоСетки");
BookMark.Select();
ТТрафика = СоздатьОбъект("Справочник.ТипыТрафика");
ТСетка = СоздатьОбъект("Справочник.СеткаТарифов");
ТТрафика.ИспользоватьВладельца(Тариф);
ТТрафика.ВыбратьЭлементы();
Валюта = Подстановка("ТарифВалюта");
первый = 1;
Пока ТТрафика.ПолучитьЭлемент() = 1 Цикл
Если ТТрафика.ЯвляетсяТарифицируемым = 0 Тогда
Продолжить;
КонецЕсли;
ВидТрафика = ТТрафика.ТекущийЭлемент();
Для н = 1 по к Цикл
Закладка = СокрЛП(Закладки.ПолучитьЗначение(н));
ЗакладкаЦ = Закладка;
Текст = Подстановка(Закладка);
// Заменяем пока закладки не кончатся
ц = 0;
Пока ц < 10 Цикл
Метка2Текст(ЗакладкаЦ, Текст);
ц = ц + 1;
ЗакладкаЦ = Закладка + СокрЛП(ц);
КонецЦикла;
КонецЦикла;
Если первый = 0 Тогда
Word.Selection.InsertRowsBelow(1);
КонецЕсли;
первый = 0;
Word.Selection.TypeText(СокрЛП(ТТрафика));
Word.Selection.ParagraphFormat.Alignment = 0;
Word.Selection.Borders(-4).LineStyle = 0;
Word.Selection.MoveRight(1);
Word.Selection.Borders(-4).LineStyle = 0;
Word.Selection.MoveRight(1);
Word.Selection.Borders(-4).LineStyle = 0;
Word.Selection.MoveRight(1);
Word.Selection.InsertRowsBelow(1);
Word.Selection.TypeText("Объем трафика");
Word.Selection.ParagraphFormat.Alignment = 2;
Word.Selection.Borders(-4).LineStyle = 0;
Word.Selection.MoveRight(1);
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.MoveRight(1);
Word.Selection.TypeText("Стоимость");
Word.Selection.Borders(-4).LineStyle = 0;
Word.Selection.MoveRight(1);
Word.Selection.MoveRight(1);
Word.Selection.InsertRowsBelow(1);
ТСетка.ИспользоватьВладельца(ТТрафика.ТекущийЭлемент());
ТСетка.ПорядокРеквизита("Интервал");
ТСетка.ВыбратьЭлементы();
Если ТСетка.ПолучитьЭлемент() = 1 Тогда
Интервал = ТСетка.Интервал;
Стоимость = ТСетка.Стоимость;
Word.Selection.TypeText("1 Мб");
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.MoveRight(1);
Если ТСетка.ПолучитьЭлемент() = 0 Тогда
Word.Selection.TypeText("и более");
Последний = 1;
Иначе
Word.Selection.TypeText(СокрЛП(Интервал)+ЗнакОбъема);
Последний = 0;
КонецЕсли;
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.MoveRight(1);
Word.Selection.TypeText(Формат(СокрЛП(Стоимость),"Ч15.2. "));
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.MoveRight(1);
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.TypeText(Валюта + ". за 1 "+ЗнакОбъема);
Word.Selection.Borders(-4).LineStyle = 1;
КонецЕсли;
Пока Последний = 0 Цикл
Стоимость = ТСетка.Стоимость;
Word.Selection.InsertRowsBelow(1);
Word.Selection.TypeText(СокрЛП(Интервал)+ЗнакОбъема);
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.MoveRight(1);
Интервал = ТСетка.Интервал;
Если ТСетка.ПолучитьЭлемент() = 0 Тогда
Word.Selection.TypeText("и более");
Последний = 1;
Иначе
Word.Selection.TypeText(СокрЛП(Интервал)+ЗнакОбъема);
КонецЕсли;
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.MoveRight(1);
Word.Selection.TypeText(Формат(СокрЛП(Стоимость),"Ч15.2. "));
Word.Selection.Borders(-4).LineStyle = 1;
Word.Selection.MoveRight(1);
Word.Selection.TypeText(Валюта + ". за 1 "+ЗнакОбъема);
Word.Selection.Borders(-4).LineStyle = 1;
КонецЦикла;
КонецЦикла;
Word.Visible=1;
КонецЕсли;[/codebox]
Есть еще по мелочам