Обработка демонстрирует простейший пример работы с 2-мя текстовыми процессорами - OpenOffice.org Writer и Microsoft Office Word. Нужно запустить файл обработки, в качестве шаблона она будет использовать файл "Primer.doc", который находится в одном каталоге с обработкой:
Скачивать файлы может только зарегистрированный пользователь!
Файл Шаблона - Primer.doc:
От: {Организация}
Кому: {Контрагент}
Ждем акт сверки взаиморасчетов!
Директор /{Директор}/
Необходимо заменить в шаблоне ключевые слова в скобках {}, на указанные значения, вот примерный код обработки:
Код 1C v 7.x
//рдТаблицаЗамен - Таблица значений:
// {Организация} ООО "Контора"
// {Контрагент} ООО "Должник"
// {Директор} Дядя Вася
ПечатьИзШаблона(рдТаблицаЗамен, "Primer.doc");
// Функция преобразует Windows имя файла в URL OpenOffice
Функция ПреобразоватьВURL(ИмяФайла)
Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
КонецФункции
Функция ОбработкаФайлаШаблона(ИмяШаблона) Экспорт
ИмяФайла = КаталогВременныхФайлов() + "doc.tmp";
Путь = ""; Имя = "";
ФайлОбработки = РасположениеФайла(Путь, Имя);
КаталогШаблонов = Путь;
ПолноеИмяШаблона = КаталогШаблонов + ИмяШаблона;
РезультатОбработки = 0;
// Проверка на существование
ЕстьШаблон = 0;
Если ФС.СуществуетФайл(КаталогШаблонов + ИмяШаблона) = 0 Тогда
Сообщить("Файл " + ИмяШаблона + " не найден в каталоге шаблонов печатных форм! Обратитесь к системному администратору!", "!!!");
Иначе
ЕстьШаблон = 1;
КонецЕсли;
// Копирование во временный каталог
Если ЕстьШаблон = 1 Тогда
ФС.КопироватьФайл(ПолноеИмяШаблона, ИмяФайла, 0);
КонецЕсли;
// Проверка копирования
Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
РезультатОбработки = 1;
Иначе
Сообщить("Не удалось скопировать шаблон во временный файл.");
КонецЕсли;
Возврат РезультатОбработки;
КонецФункции
Процедура ОткрытьТекстовыйПроцессор(ИмяФайла, ТаблицаЗамен)
ТекПроцессор = рдТекстовыйПроцессор.ПолучитьЗначение(рдТекстовыйПроцессор.ТекущаяСтрока());
Если ТекПроцессор = "OOoWriter" Тогда
// Открыть OpenOffice
ServiceManager = СоздатьОбъект("com.sun.star.ServiceManager");
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
Scr = СоздатьОбъект("MSScriptControl.ScriptControl");
Scr.Language="javascript";
Scr.Eval("Args=new Array()");
Args = Scr.Eval("Args");
Scr.AddObject("ServiceManager", ServiceManager);
// Откроем шаблон
ТекстовыйПроцессор = Desktop.LoadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args);
// Заменяем ключевые поля на нужные значения
Replace = ТекстовыйПроцессор.CreateReplaceDescriptor();
Для x=1 По ТаблицаЗамен.КоличествоСтрок() Цикл
Replace.SearchString = ТаблицаЗамен.ПолучитьЗначение(x, 1);
Replace.ReplaceString = ТаблицаЗамен.ПолучитьЗначение(x, 2);
ТекстовыйПроцессор.ReplaceAll(Replace);
КонецЦикла;
Иначе
// Открываем MS Office Word
Попытка
ТекстовыйПроцессор = СоздатьОбъект("Word.Application");
Исключение
Сообщить("Не удалось создать объект Microsoft Office Word!", "!!!");
Возврат;
КонецПопытки;
// Открываем шаблон
ТекстовыйПроцессор.Visible = 0;
ТекстовыйПроцессор.Documents.Open(ИмяФайла,, -1);
Fnd = ТекстовыйПроцессор.ActiveDocument.Range().Find;
Fnd.ClearFormatting();
Fnd.Forward = -1;
// Заменяем ключевые поля на нужные значения
ТаблицаЗамен.ВыбратьСтроки();
Пока ТаблицаЗамен.ПолучитьСтроку() = 1 Цикл
Fnd.Execute(ТаблицаЗамен.Найти,,,,,,,,, ТаблицаЗамен.Заменить, 2);
КонецЦикла;
ТекстовыйПроцессор.Visible = -1;
ТекстовыйПроцессор.Activate();
КонецЕсли;
КонецПроцедуры
//*****************************************************************************
Процедура ПечатьИзШаблона(ТаблицаЗамен, ИмяФайлаШаблона) Экспорт
// Проверим, есть ли нужный шаблон
Если ОбработкаФайлаШаблона(ИмяФайлаШаблона) = 0 Тогда
Возврат;
КонецЕсли;
ИмяФайла = КаталогВременныхФайлов() + "doc.tmp";
// Открываем в текстовом процессоре файл шаблона
ОткрытьТекстовыйПроцессор(ИмяФайла, ТаблицаЗамен);
КонецПроцедуры
Для заключения договоров с контрагентами разработан типовой договор (шаблон).
При его оформлении (для реального контрагента) в определенные места документа вставляются данные о контрагенте.
Подобные фрагменты определены следующим образом: <ИмяОбласти> (на практике можно использовать другие способы, в нашем примере квадратные скобки [ ]).
Пример договора:
Договор
на оказание услуг
Я, [Заказчик], с одной стороны, именуемый в дальнейшем ЗАКАЗЧИК, и [Исполнитель],
с другой стороны, именуемый в дальнейшем ИСПОЛНИТЕЛЬ, заключили договор о настройке
системы 1С:Предприятие под нужды заказчика.
Дополнительные условия:
Глюки убирать сразу.
Оплата:
$100 в час. Обсуждению не подлежит.
Подписи сторон:
ЗАКАЗЧИК ИСПОЛНИТЕЛЬ
_____ [Заказчик] _____ [Исполнитель]
Оформленный таким образом документ сохранен в файле, который загружен в 1С v 8 в качестве макета (при его создании указывается, что тип макета – Active document).
Далее в соответствующем обработчике события (например, в обработчике нажатия на кнопку Создать договор) размещается следующий код:
Код 1C v 8.х Договор = ПолучитьМакет("Договор");
// Получить объект из макета.
MSWord = Договор.Получить();
Попытка
Документ = MSWord.Application.Documents(1);
Документ.Activate();
//Определим имена
Заказчик = "Петр Иванович КакВасТам";
Исполнитель = "helpf.pro - Помощник по 1С"
// Получить объект, который будем использовать для поиска и замены.
Замена = Документ.Content.Find;
// Заменить заранее определенные ключевые конструкции на требуемый текст.
Замена.Execute("[Заказчик]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик);
Замена.Execute("[Исполнитель]", Ложь, Истина, Ложь, , , Истина, , Ложь, Исполнитель);
// Далее аналогично для остальных ключевых конструкций.
// ...
// Делаем видимым приложение и активизируем его.
MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке и объект закрывается.
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;
Код 1C v 7.x
Word = создатьОбъект("Word.Application");
wdDoc = Word.Documents;
wdDoc.Open(ИмяФайлаШаблона,0,1); //открываем только на чтение
// Делаем видимым приложение
Word.Visible = 1;
wdFindContinue = 1;
wdReplaceAll = 2;
True = 1;
False = 0;
Word.S_election.Find.Execute("[Заказчик]", True, True, False, False, False, True, wdFindContinue,False,"Петр Иванович КакВасТам", wdReplaceAll);
Word.S_election.Find.Execute("[Исполнитель]", True, True, False, False, False, True, wdFindContinue,False,"helpf.pro - Помощник по 1C", wdReplaceAll);