Пример работы с общим макетом типа ActiveDocument в клиент-серверном варианте Код 1C v 8.х //**********************************************************************************
//получаем макет на сервере, сохраняем в файл и передаем на клиента
&НаСервере
Функция ПолучитьДанныеМакета()
АдресХранилища = Новый УникальныйИдентификатор();
Макет = ПолучитьОбщийМакет("Договор");
ВременныйФайл = ПолучитьИмяВременногоФайла("doc");
Макет.Записать(ВременныйФайл);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), АдресХранилища);
УдалитьФайлы(ВременныйФайл);
Возврат Адрес;
КонецФункции
//**********************************************************************************
//код сотрудника, нужно для создания уникального имени файла для каждого пользователя
&НаСервере
Функция КодПользователя(Пользователь)
Возврат СокрЛП(Пользователь.Сотрудник.Код);
КонецФункции
//**********************************************************************************
//Ссылка - ссылка на договор(ссылка справочника, нужно для подстановки реквизитов)
//РеквизитыДляПечати - структура с нужными реквизитами
&НаКлиенте
Процедура ПечатьДоговора(Ссылка,РеквизитыДляПечати)
Пользователь = ОбщегоНазначения.ТекущийПользователь();
Каталог = КаталогВременныхФайлов();
Каталог = ?(Прав(Каталог,1) = "\", Каталог, Каталог+"\");
ПолноеИмяФайла = Каталог+"Договор_"+КодПользователя(Пользователь)+".doc";
Попытка
Индификатор = ПолучитьДанныеМакета();
МакетДоговора = ПолучитьИзВременногоХранилища(Индификатор);
МакетДоговора.Записать(ПолноеИмяФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
MSWord = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Ошибка при попытке создать объект ""MS Word""!" + Символы.ПС +
"Возможно приложение ""MS Word"" не установлено или установлено неправильно.", СтатусСообщения.Внимание);
КонецПопытки;
MSWord .Documents.Open(ПолноеИмяФайла);
Попытка
Документ = MSWord .Application.Documents(1);
Документ.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке, и объект закрывается.
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
MSWord .Application.Quit();
Возврат;
КонецПопытки;
//*******************************************
//тут выполняем замену
Попытка
Замена = Документ.Content.Find;
Замена.Execute("{ЧтоМеняем}", Ложь, Истина, Ложь, , , Истина, , Ложь, "На что меняем");
Исключение
КонецПопытки;
// Делаем видимым приложение и активизируем его.
MSWord .Application.Visible = Истина;
MSWord .Activate();
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Замена текста в автофигуре word Есть документ Word.
Заполняю программно:
TextFind.Execute("[V1]", Ложь, Истина, Ложь, , , Истина, , Ложь, "test", 2);
Текст [V1] находится в таблице, которая находится в автофигуре.
Почему-то текст не заменяется, хотя вне автофигуры все отрабатывает нормально.
Ответ:
Примерный код такой:
Код 1C v 8.х Договор = ПолучитьМакет("Договор");
// Получить объект из макета.
MSWord = Договор.Получить();
Попытка
Документ = MSWord .Application.Documents(1);
Документ.Activate();
//Определим имена
Заказчик = "Петр Иванович КакВасТам";
Исполнитель = "helpf.pro - Помощник по 1С"
// Получить объект, который будем использовать для поиска и замены.
Замена = Документ.Content.Find;
// Заменить заранее определенные ключевые конструкции на требуемый текст.
Замена.Execute("[Заказчик]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик);
Замена.Execute("[Исполнитель]", Ложь, Истина, Ложь, , , Истина, , Ложь, Исполнитель);
// Далее аналогично для остальных ключевых конструкций.
// ...
// Делаем видимым приложение и активизируем его.
MSWord .Application.Visible = Истина;
MSWord .Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке и объект закрывается.
Сообщить(ОписаниеОшибки());
MSWord .Application.Quit();
КонецПопытки;
Более подробно:
Как сформировать новый договор, документ на основании файла, шаблона Microsoft Office Word? Категория:
Работа с Microsoft Office и OpenOffice Создание Word документа из 1С и подключение обработчика события word Код 1C v 8.х // Пример оздания Word документа из 1С и подключение обработчика события word
// Если у документ Word до сих пор не создан
Если WordДокумент = Неопределено Тогда
// Открыть Word
MSWord = Новый COMОбъект("Word.Application");
MSWord .Visible = Истина;
// Удалить временный файл, если есть
Если ВременныйФайл <> Неопределено Тогда
УдалитьФайлы(ВременныйФайл);
КонецЕсли;
// Получить имя временного файла для хранения документа
ИмяФайла = ПолучитьИмяВременногоФайла(".doc");
// Получим данные файла
ДанныеФайла = СправочникОбъект.Файл.Получить();
Если ДанныеФайла = Неопределено Тогда
// Создать новый документ, если не был создан до этого
WordДокумент = MSWord .Documents.Add();
// И сохранить его во временный файл
WordДокумент.SaveAs(ИмяФайла);
Иначе
// Записать данные во временный файл
ДанныеФайла.Записать(ИмяФайла);
// Открыть документ Word и добавить обработчик закрытия документа
WordДокумент = MSWord .Documents.Open(ИмяФайла);
КонецЕсли;
// Добавим обработчик события от документа Word
ДобавитьОбработчик WordДокумент.Close, ЗакрытиеДокумента;
КонецЕсли;
// Если документ открыт, активизировать его
WordДокумент.Activate();
WordДокумент.Application.Activate();
Категория:
Работа с Microsoft Office и OpenOffice Как сформировать документ в Word из 1С? (Active Document) ВНИМАНИЕ! При использовании кодов описанных ниже, уберите символ
_
Давайте рассмотрим на примерах как это делается! =) Мне известно 2 способа:
1. Путем замены шаблонного текста в макете Wordа.
2. Путем вставки текста с помощью закладок в Wordе,
В первом случае сразу скажу, что длина строки передаваемая в функцию замены, довольно небольшая 255 символов, да и расстановка шаблонных выражений в макете Word занимает довольно много времени. Через процедуру Content.Find.Execute.
Во втором случае длина, насколько мне известно неограниченна, также воськаться с закладками намного быстрее и удобнее, чем расставлять шаблонный текст. Используя Bookmarks().S_elect(). Поэтому давайте на коде рассмотрим второй пример.
И так, для начала необходимо добавить Word макет к документу. Добавляем макет с помощью конструктора макетов указав Active document и выбрав соответствующий макет.
Называем его Акт. Открываем макет в 1Ске, ставим курсор в нужном месте, переходим в меню Вставка закладка нажимаем добавить закладку к примеру у меня это НарушенияТекст
Теперь кидаем на форму документа кнопку Сформировать и по нажатию на нее пишем код который открывает наш макет Word ищем закладку по имени и вставляет туда текст:
Код 1C v 8.х //инициализация часть 1
СсылкаМакет = ПолучитьМакет(Акт);
MSWord = СсылкаМакет.Получить();
Попытка
СсылкаМакет = MSWord .Application.Documents(1);
СсылкаМакет.Activate();
//выгружаем табличную часть с нарушениями в строку часть 2
str = Новый COMОбъект(ADODB.Stream);
str.Open();
СтрочкаТаблицы = ЭлементыФормы.Нарушения.ТекущиеДанные;
Для Каждого СтрочкаТаблицы Из Нарушения Цикл
str.WriteText( + СтрочкаТаблицы.Описание + Нарушены требования СНИПФЗГОСТ: + СтрочкаТаблицы.СНИПФЗГОСТ + Статья: + СтрочкаТаблицы.ЧастьСтатья + Символ(13),0);
КонецЦикла;
str.Position = 0;
НарушенияТекст = str.readText();
//вставляем в закладку текст с нарушениями часть 3
MSWord .Bookmarks(НарушенияТекст).S_elect();
MSWord .Application.S_election.TypeText(НарушенияТекст);
//открыть Word часть 4
СсылкаМакет.Application.Visible = Истина;
СсылкаМакет.Activate();
Исключение
//если ошибка
Сообщить(ОписаниеОшибки());
MSWord .Application.Quit();
КонецПопытки;
Это пример вывода множества строчек из табличной части одной строкой, если нужно просто выгрузить какой-то реквизит то можно пропустить часть 2 и перейти к части 3.
Для выгрузки табличной части в форме таблицы можно использовать функцию автоформата, примеру код выгрузки табличной части документа Предписание:
Код 1C v 8.х Word = MSWord .Application;
Документ = Word.ActiveDocument();
//Переместиться вниз на 22 строк
Word.S_election.MoveDown(,22);
Документ.Paragraphs.Add();
//подготовка таблицы:
Rng = Word.S_election.Range;
//Формируем заголовок:
Rng.I_nsertAfter(№ п/п*Установленные нарушения и меры по их устранению*Основания);
Rng.I_nsertParagraphAfter();
//сама таблица
СтрочкаТаблицы = ЭлементыФормы.НарушенияПредписание.ТекущиеДанные;
Для Каждого СтрочкаТаблицы из НарушенияПредписание Цикл
Rng.I_nsertAfter(Строка(СтрочкаТаблицы.НомерСтроки)+*+СтрочкаТаблицы.Описание + ; + СтрочкаТаблицы.Предписание +* + СтрочкаТаблицы.СНИПФЗГОСТ + + СтрочкаТаблицы.ЧастьСтатья);
Rng.I_nsertParagraphAfter();
КонецЦикла;
Rng.ConvertToTable(*);
Документ.Tables(1).AutoFormat(17); //номер таблицы в шаблоне
Word.Visible = Истина;
Ну вот и все =)
Автор: saylolpls
Еще способ Active document
В Конфигураторе Макеты - правый клик - Добавить
Тип макета: Active document
Создать новый - Документ Microsoft Word
Меню Вставка - Поле - Автоматизация - DocVariable
Написать имя поля в графе "Новое имя:" ДатаПриказа
В модуле формы документа создаем кнопку, и в ее обработчике пишем:
Код 1C v 8.х Процедура ОсновныеДействияФормыWord(Кнопка)
АктивныйДокумент = ПолучитьМакет("Макет");
КомОбъект = АктивныйДокумент.Получить();
КомОбъект.Application.Visible=1;
КомОбъект.Variables.Item("ДатаПриказа").Value="24.01.2007";
КомОбъект.Fields.UpDate();
КомОбъект.PrintOut(); //распечатать документ
//Ожидание окончания отправки на печать...
Пока objWord.Application.BackgroundPrintingStatus<>0 Цикл
Предупреждение("Ожидание",1);
КонецЦикла;
КомОбъект.Application.Quit(); //закрыть Word
КомОбъект = 0;
КонецПроцедуры
2) добавляем не поле, а Закладку
Меню Вставка - Закладка и далее указываем ее имя ("ИмяЗакл")
Код 1C v 8.х Процедура ОсновныеДействияФормыWord(Кнопка)
АктивныйДокумент = ПолучитьМакет("Макет");
КомОбъект = АктивныйДокумент.Получить();
КомОбъект.Application.Visible=1;
КомОбъект.Bookmarks(СокрЛП("ИмяЗакл")).S_elect();
КомОбъект.Application.S_election.TypeText(СокрЛП("тест проверка"));
КонецПроцедуры
Код 1C v 8.2 УП // Параметры договора обозначены в тексте переменными вида "[%НомерДоговора%]"
Функция ПечатьДокумента() Экспорт
Договор = ПолучитьМакет("ActiveDocument_ДоговорПоставки"); // получим макет-ActiveDocument
MSWord = Договор.Получить();
Попытка
Doc = MSWord .Application.Documents(1);
Doc.Activate();
Replace = Doc.Content.Find;
FindText = "{НомерДоговора}"; // что искать - имя_шаблона
MatchCase = Ложь; // использовать регулярные выражения
MatchWholeWord = Истина; // искать слово целиком
MatchWildcards = Ложь; // испоьзовать регулярные выражения
MatchSoundsLike = Неопределено; // искать созвучные
MatchAllWordForms = Неопределено; // искать все формы слова
Forward = Истина; // искать вперед
Wrap = Неопределено; // что должен вернуть Find-объект
Format_ = Ложь; // использовать форматирование
ReplaceWith = "N777"; // текст, на который надо заменить имя_шаблона
// кратко:
//Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,НомерДоговора);
Replace.Execute(
FindText,
MatchCase,
MatchWholeWord,
MatchWildcards,
MatchSoundsLike,
MatchAllWordForms,
Forward,
Wrap,
Format_,
НомерДоговора);
MSWord .Application.Visible = Истина;
MSWord .Activate();
Исключение
Сообщить(ОписаниеОшибки());
MSWord .Application.Quit();
КонецПопытки;
возврат 0;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Картинку в колонтитул документа MS Word Код 1C v 8.2 УП &НаКлиенте
Процедура Вариант1(Команда)
MsWord = Новый COMОбъект("Word.Application");
MsWord .Documents.Open("q:\test.doc");
Попытка
MsWord .Application.Visible = 0;
Word = MsWord .Application;
Док=Word.Documents(1);
Док.Activate();
ЗаменаКолонтитула=Док.sections.item(1).footers.item(1);
//--Просто вставить строку
ЗаменаКолонтитула.Range.Text=СокрЛП("Привет");
//--Вставить картинку
ЗаменаКолонтитула.Range.InlineShapes.AddPicture("q:\1.jpg",
False, //LinkToFile
True //SaveWithDocument
);
Док.SaveAs("q:\test.doc");
Док.Close(0);
//ЗапуститьПриложение("""" + "q:\test.doc" + """");
Исключение
Сообщить(ОписаниеОшибки());
Word.Quit();
КонецПопытки;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Работа с MS Word через OLE В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Код 1C v 8.х
// "ПутьКФайлу" - строка. Полное имя файла в формате MSWord .
// "Ссылка" - ДокументСсылка (в моем случае - счет).
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;
Doc = Объект.Application.Documents(1);
Doc.Activate();
// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;
// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"
Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");
// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";
// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо
// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");
Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки
// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();
// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
Table = Doc.Tables.Add(Position, 1, 6, 1, 2);
// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth=10;
Table.Columns(2).PreferredWidth=50;
Table.Columns(3).PreferredWidth=10;
Table.Columns(4).PreferredWidth=10;
Table.Columns(5).PreferredWidth=10;
Table.Columns(6).PreferredWidth=10;
// Задаем заголовки колонок
Row1=Table.Rows(1);
Row1.Cells(1).Range.Text="№ п/п";
Row1.Cells(2).Range.Text="Наименование";
Row1.Cells(4).Range.Text="Кол-во";
Row1.Cells(3).Range.Text="Ед. изм.";
Row1.Cells(5).Range.Text="Цена,руб.";
Row1.Cells(6).Range.Text="Сумма,руб.";
// Построчно выводим содержимое таблицы Товары
НомерСтроки = 1;
Для каждого СтрокаТовары Из Ссылка.Товары Цикл
Row=Table.Rows.Add();
Row.Cells(1).Range.Text=НомерСтроки;
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 1с
// вызовут исключение.
Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование
+?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры),
" ("+СтрокаТовары.ХарактеристикаНоменклатуры+")","");
Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество);
Row.Cells(4).Range.ParagraphFormat.Alignment = 1;
Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения)
,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-");
Row.Cells(3).Range.ParagraphFormat.Alignment = 1;
Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.ParagraphFormat.Alignment = 1;
Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2");
Row.Cells(6).Range.ParagraphFormat.Alignment = 1;
НомерСтроки=НомерСтроки+1;
КонецЦикла;
// Задаем форматирование первой строки
// Если сделать это сразу, то все новые строки таблицы будут
// формироваться с тем же форматом
Row1.Range.Font.Bold = 9999998;
Row1.Range.Font.Size = 14;
Row1.Range.Font.Name = "Verdana";
Row1.Range.ParagraphFormat.Alignment = 1;
// Последняя строка...
Row = Table.Rows.Add();
Row.Range.Font.Bold = 9999998;
Row.Cells(1).Range.Text="Итого:";
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
Попытка // эта конструкция выдает исключительную ситуацию, но при этом
// результат все-равно работает))
// объединяем ячейки в конце таблицы
Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));
Исключение
КонецПопытки;
Попытка
Row.Cells(1).Range.ParagraphFormat.Alignment = 3;
Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2");
Row.Cells(2).Range.ParagraphFormat.Alignment = 1;
Doc.Save();
Объект.Application.Quit();
Объект = Неопределено;
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;
// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);
// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Автор:
Крылов Николай Категория:
Работа с Microsoft Office и OpenOffice Создание документа Word без использования макетов и пример создания таблицы и её оформление. Кроме прочего в статье присутствует пример создания таблицы с любым количеством колонок и столбцов. Несколько строк с форматированием текста и таблицы. Создание "объединенных" ячеек.
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Исп. переменные: "ПутьКФайлу" - строка. Полное имя файла в формате
MSWord .
"Ссылка" - ДокументСсылка (в моем случае - счет).
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;
Doc = Объект.Application.Documents(1);
Doc.Activate();
// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;
// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"
Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");
// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";
// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо
// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");
Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки
// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();
// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
Table = Doc.Tables.Add(Position, 1, 6, 1, 2);
// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth=10;
Table.Columns(2).PreferredWidth=50;
Table.Columns(3).PreferredWidth=10;
Table.Columns(4).PreferredWidth=10;
Table.Columns(5).PreferredWidth=10;
Table.Columns(6).PreferredWidth=10;
// Задаем заголовки колонок
Row1=Table.Rows(1);
Row1.Cells(1).Range.Text="№ п/п";
Row1.Cells(2).Range.Text="Наименование";
Row1.Cells(4).Range.Text="Кол-во";
Row1.Cells(3).Range.Text="Ед. изм.";
Row1.Cells(5).Range.Text="Цена,руб.";
Row1.Cells(6).Range.Text="Сумма,руб.";
// Построчно выводим содержимое таблицы Товары
НомерСтроки = 1;
Для каждого СтрокаТовары Из Ссылка.Товары Цикл
Row=Table.Rows.Add();
Row.Cells(1).Range.Text=НомерСтроки;
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 1с
// вызовут исключение.
Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование
+?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры),
" ("+СтрокаТовары.ХарактеристикаНоменклатуры+")","");
Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество);
Row.Cells(4).Range.ParagraphFormat.Alignment = 1;
Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения)
,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-");
Row.Cells(3).Range.ParagraphFormat.Alignment = 1;
Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.ParagraphFormat.Alignment = 1;
Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2");
Row.Cells(6).Range.ParagraphFormat.Alignment = 1;
НомерСтроки=НомерСтроки+1;
КонецЦикла;
// Задаем форматирование первой строки
// Если сделать это сразу, то все новые строки таблицы будут
// формироваться с тем же форматом
Row1.Range.Font.Bold = 9999998;
Row1.Range.Font.Size = 14;
Row1.Range.Font.Name = "Verdana";
Row1.Range.ParagraphFormat.Alignment = 1;
// Последняя строка...
Row = Table.Rows.Add();
Row.Range.Font.Bold = 9999998;
Row.Cells(1).Range.Text="Итого:";
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
Попытка // эта конструкция выдает исключительную ситуацию, но при этом
// результат все-равно работает))
// объединяем ячейки в конце таблицы
Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));
Исключение
КонецПопытки;
Попытка
Row.Cells(1).Range.ParagraphFormat.Alignment = 3;
Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2");
Row.Cells(2).Range.ParagraphFormat.Alignment = 1;
Doc.Save();
Объект.Application.Quit();
Объект = Неопределено;
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/67727/ Категория:
Работа с Microsoft Office и OpenOffice Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice? Код 1C v 8.х Перем СсылкаНаДокумент;
Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
ДокументСсылка = СсылкаНаДокумент;
ИмяФайла = ПолучитьИмяВременногоФайла();
// Теперь формируем файл из MS Wordа
Попытка
MSWord = новый COMОбъект("Word.Application");
//Передаем текущие параметры форм в MSWord
MSWord .Documents.Open(ИмяФайла);
MSWord Doc = MSWord .ActiveDocument();
WordContent = MSWord .ActiveDocument().ActiveWindow.S_election;
//------------------------------------------------------------
// Перебираем таблицы в документе, и сопоставляем имена переменных
// с именами табличных частей.
Для ТекущаяТаблица = 1 ПО MSWord Doc.Tables.Count Цикл
мТабличнаяЧасть = Неопределено;
Для ТекущаяСтрока = 1 ПО MSWord Doc.Tables(ТекущаяТаблица).Rows.Count Цикл
Для ТекущаяКолонка = 1 ПО MSWord Doc.Tables(ТекущаяТаблица).Columns.Count Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( MSWord Doc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока,ТекущаяКолонка).Range.Text )
,ДокументСсылка);
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
//Итак мы имеем номер текущей таблицы и имя табличной части
Если мТабличнаяЧасть <> Неопределено Тогда
//Производим редактирование нашей таблицы в соответствии с количеством строк
ВсегоСтрокТЧ = 0;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
КонецЦикла;
//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
// Добавляем строки
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
MSWord Doc.Tables(ТекущаяТаблица).Rows.Add(MSWord Doc.Tables(ТекущаяТаблица).Rows(ТекущаяСтрока+ТекущаяСтрокаТЧ-1));
КонецЕсли;
//MSWord Doc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,2).Range.Text = Строка(ТекущаяСтрокаТЧ);
Для ТекКол = 1 ПО MSWord Doc.Tables(ТекущаяТаблица).Columns.Count Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWord Doc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ,ТекКол).Range.Text));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
MSWord Doc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWord Doc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
MSWord Doc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
КонецЕсли;
КонецЦикла;
КонецЦикла;
//MSWord Doc.Tables(ТекущаяТаблица).Rows.Delete();
//MSWord Doc.Tables(ТекущаяТаблица).Rows(3).Delete();
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
ТекстДокумента = MSWord Doc.Range(0, MSWord Doc.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();
//MSWord Doc.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 = ТекстПеременной;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
//ТекстДокумента = MSWord Doc.Range(0, MSWord Doc.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;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат Текст;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Как сформировать новый договор, документ на основании файла, шаблона Microsoft Office Word? Для заключения договоров с контрагентами разработан типовой договор (шаблон).
При его оформлении (для реального контрагента) в определенные места документа вставляются данные о контрагенте.
Подобные фрагменты определены следующим образом: <ИмяОбласти> (на практике можно использовать другие способы, в нашем примере квадратные скобки [ ]).
Пример договора:
Договор
на оказание услуг
Я, [Заказчик], с одной стороны, именуемый в дальнейшем ЗАКАЗЧИК, и [Исполнитель],
с другой стороны, именуемый в дальнейшем ИСПОЛНИТЕЛЬ, заключили договор о настройке
системы 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);
Категория:
Работа с Microsoft Office и OpenOffice