// Процедура СтрокаВДату преобразует строку в дату по шаблону форматной строки // // Параметры // Строка - строка, содержащая дату, // ФорматДаты - форматная строка вида: // [dd MM yy] // [yy-MM-dd HH:mm] // [dd MM yy HH mm ss] // [dd MM yyyy] // [MM dd, yyyy, HH:mm] // [dd.MM.yy] // [MM, dd, yyyy] // [yyyyMMdd] // [HH-mm-ss, dd-MM-yy] // [dd] // [dd MM HH:mm:ss yyyy] // [HH:mm:ss] // [HH:mm] // [yyyy-MM-dd HH:mm:ss] // [yyyy-MM-dd] // [yyyy/MM/dd] // [dd/MM/yy] // [MM dd yyyy] // [yyyy-MM] // [yyyy] // [MM, dd, yyyy] // [dd-MM-yyyy] // [ddMMyyyy] // Функция СтрокаВДату(Знач Строка, Знач ФорматДаты) Экспорт Ч = Новый Соответствие; Для ё = 1 По СтрДлина(ФорматДаты) + 6 Цикл Ч[Сред(ФорматДаты + "dMyHms", ё, 1)] = 0 КонецЦикла; Для ё = 1 По СтрДлина(ФорматДаты) Цикл Ч[Сред(ФорматДаты, ё, 1)] = 10 * Ч[Сред(ФорматДаты, ё, 1)] + Найти("123456789", Сред(Строка, ё, 1)); КонецЦикла; Ч["y"] = Ч["y"] + ?(0 < Ч["y"] И Ч["y"] < 50, 2000, ?(0 < Ч["y"] И Ч["y"] < 100, 1900, 0)); Возврат Дата(Макс(Ч["y"], 1), Макс(Ч["M"],1), Макс(Ч["d"],1), Ч["H"], Ч["m"], Ч["s"]); КонецФункции
Источник
Перем СсылкаНаДокумент; Процедура СформироватбФайл_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(); Исключение Предупреждение(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры
//ДОПОЛНИТЕЛЬНО НЕОБХОДИМЫЕ ФУНКЦИИ // Добавлем форматы представления полей и дополнительную информацию о полях Процедура ДобавитьФорматы(ПереченьРеквизитов,Значение,пПредставлениеРеквизита, ДокументСсылка = Неопределено) Если ТипЗнч(Значение) = Тип("Дата") Тогда // расширяем представление даты ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ДФ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; КонецЦикла; КонецЦикла; КонецЦикла; Возврат Текст; КонецФункции
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, "ЧЦ=10; ЧДЦ=2"); // ЗначФормат = "123 456,79" ЗначФормат = Формат(123456.789, "ЧГ=0; ЧДЦ=2"); // ЗначФормат = "123456,79" ЗначФормат = Формат(123456.789, "ЧРД='-'"); // ЗначФормат = "123 456-789" ЗначФормат = Формат(-123456.789, "ЧО=0"); // ЗначФормат = "(123 456,789)"; ЗначФормат = Формат(13, "ЧЦ=5; ЧВН=; ЧГ=0"); // ЗначФормат = "00013"; //В 8 версии для вывовода чисел прописью используется ЧислоПрописью ЧислоПрописью(Сумма, "L=ru_RU", Валюта.ПараметрыПрописиНаРусском) ЧислоПрописью(1457.25,"L=en_US","dollar, dollars, cent, cents, 2"); // One thousand four hundreds fifty seven dollars 25 cents. ЧислоПрописью(Сумма,"Рубль,рубля,рублей,м,копейка,копейки,копеек,ж,2"); //Пример представления Числа в виде Даты ЗначФормат = Формат(25021949, "ЧЦ=8; ЧРГ=.; ЧВН=; ЧГ=4,2,0"); // ЗначФормат = "25.02.1949" // Примеры форматирования дат ЗначФормат = Формат('20020820153309', "ДФ=""дд ММММ гггг 'г.' ЧЧ:мм:сс"""); // ЗначФормат = "20 августа 2002 г. 15:33:09" ЗначФормат = Формат('20020820153309', "ДФ=""дд/ММ-гггг"""); // ЗначФормат = "20/08-2002" ЗначФормат = Формат('20020820153309', "ДФ='q ""кв."" yyyy'"); // ЗначФормат = "3 кв. 2002"; ЗначФормат = Формат('20020820153309', "ДФ='""Итого"" q ""квартал""'") ; // ЗначФормат = "Итого 3 квартал"; ЗначФормат = Формат('20020820153309', "ДФ='ММММ гггг'"); // ЗначФормат = "Август 2002 г."; ЗначФормат = Формат('20020820153309', "ДЛФ=ДД"); // ЗначФормат = "20 августа 2002 г."; ЗначФормат = Формат('20020820153309', "ДЛФ=Д"); // ЗначФормат = "20.08.2002"; ЗначФормат = Формат('20020820153309', "ДЛФ=В"); // ЗначФормат = "15:33:09"; ЗначФормат = Формат('20020820153309', "ДФ=HHmmssyyyyMMdd"); // ЗначФормат = "15330920020820"; ЗначФормат = Формат('20020820153309', "ДФ=HH:mm:ss yyyy MM dd"); // Время 24 часа - ЗначФормат = "15:33:09 2002 08 20"; ЗначФормат = Формат('20020820153309', "ДФ=hh:mm:ss yyyy MM dd"); // Время 12 часов - ЗначФормат = "03:33:09 2002 08 20"; Формат(Дата(2009, 1, 1), "ДЛФ=DD") + ", " + ОпределитьДеньНедели(ДеньНедели(Дата(2009, 1, 1))); // 1 января 2009 г., Четверг (Смотрите в "Работаем с Датами" Функция Определить день недели) Формат(Дата(2009, 1, 1), "ДФ=ММММ") + ", " + Формат(Дата(2009, 1, 1), "ДФ=yyyy") + " г."; // Январь, 2009 г. Формат(НачалоНедели(Дата(2009, 1, 1)), "ДФ='dd MMMM yyyy'") + " г. - " + Формат(КонецНедели(Дата(2009, 1, 1)), "ДФ='dd MMMM yyyy'") + " г."; // 29 декабря 2008 г. - 04 января 2009 г. // ДЕКАДУ нельзя вывести через формат, но можно так: Строка(Цел(День(Дата('20020820153309')) / 10) + 1)+" декада" = 2 декада // Примеры форматирования логических выражений ЗначФормат = Формат(Истина, "БЛ=Отсутствует; БИ=Доступен"); // ЗначФормат = "Доступен"; ЗначФормат = Формат(Ложь, "БЛ=Нет; БИ=Да"); // ЗначФормат = "Нет";
// Символы, определяющие тип форматируемых данных: // Ч — число (Англоязычный синоним: N) ЗначФормат = Формат(123.15, "Ч(0)10.2") // 0000123.15 Долг = Строка(Формат(Долг(), "Ч12.2")) + " " + Валюта.Сокр_назв; // Возможен вывод денежных величин и просто целых чисел прописью. В этом случае форматная строка должна иметь вид "ЧПДС". // Наличие буквы "П" (в английском варианте для аналогичной цели используется буква "S") определяет сам факт вывода числа прописью. // Символ "Д" (в английском варианте — "M") обозначает вывод денежной величины и является необязательным. // Символ "С" (в английском варианте — "H") также необязателен и означает вывод с копейками. ИтогоСуммаПрописью = Формат(Итог("Сумма"), "ЧПДС"); КоличествоНаименованийПрописью = Формат(КоличествоСтрок(), "ЧП"); // С — строка (Англоязычный синоним: S) // "Сn", где n — положительное целое число определяющее ширину поля, в котором будет размещаться строка. // В случае, если ширина поля превосходит длину строки сформатированная строка будет дополнена справа пробелами, если же ширина поля меньше длины строки — строка будет усечена справа. // Д — дата (Англоязычный синоним: D) ДатаДокумента = Формат(Док.ДатаДок,"Д ДД.ММ.ГГ"); //12.03.08 ДатаДокумента = Формат("01.01.1999", "Д(0)ДДММММГГГГ"); // 01 Января 1999 г. //Для форматирования даты используется форматная строка вида "Д<ПодстрокаФормата>", где <Подстрока Формата> представляет собой строку, определяющую вид сформатированного представления даты: //DDMMYY (ДДММГГ) дата в виде ДД.ММ.ГГ //DDMMYYYY (ДДММГГГГ) дата в виде ДД.ММ.ГГГГ //DDMMMMYYYY (ДДММММГГГГ) дата в виде ДД месяц прописью ГГГГ //(0)DDMMMMYYYY ((0)ДДММММГГГГ) этот формат представляет собой вариант предыдущего формата с тем отличием, что число месяца всегда выводится двумя цифрами, т. е. для чисел меньших 10 спереди будет добавлен 0. Например: Формат('01.01.1999', ' 'Д(0)ДДММММГГГГ' ') = 01 Января 1999 г. //MMMMYYYY (ММММГГГГ) дата в виде месяц прописью ГГГГ //MMMMYY (ММММГГ) дата в виде месяц прописью ГГ //ММММ (ММММ) дата в виде месяц прописью //QQQQYYYY (ККККГГГГ) дата в виде N квартала ГГГГ //QQQQYY (ККККГГ) дата в виде N квартала ГГ //QQQQ дата в виде N квартала //YYYYMMDD (ГГГГММДД) дата в виде ГГГГММДД, то есть дата '10.11.1998' будет представлена как строка "19981110" //WWWW (HHHH) выводит наименование дня недели, соответствующее указанной дате. Наименования дней недели берутся из файла прописи.