ВНИМАНИЕ! При использовании кодов описанных ниже, уберите символ
_
Давайте рассмотрим на примерах как это делается! =) Мне известно 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;
КонецФункции
Код 1C v 8.2 УП Режим = РежимДиалогаВопрос.ДаНетОтмена;
Ответ = Вопрос("Выполнить?", Режим, 0);
Если Ответ =КодВозвратаДиалога.Да Тогда
Сообщить("Выполнено");
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
Сообщить("Не выполнено");
КонецЕсли;
Код 1C v 8.х
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("Сохранить текст?", Режим,0) ;
Если Ответ = КодВозвратаДиалога.Нет Тогда
ТекДок.Записать(ПутьКФайлу);
КонецЕсли ;
//Свойства РежимДиалогаВопрос:
//ДаНет (YesNo)
//ДаНетОтмена (YesNoCancel)
//ОК (OK)
//ОКОтмена (OKCancel)
//ПовторитьОтмена (RetryCancel)
//ПрерватьПовторитьПропустить (AbortRetryIgnore)
//Свойства КодВозвратаДиалога:
//Да (Yes)
//Нет (No)
//ОК (OK)
//Отмена (Cancel)
//Повторить (Retry)
//Прервать (Abort)
//Пропустить (Ignore)
//Таймаут (Timeout)
Код 1C v 7.x
// Зададим вопрос, и варианты ДА, НЕТ
Рез = Вопрос("Вы получили данное сообщение?", 4);
// При нажатии Да - Рез=6, Нет- Рез=6
//Можно и так:
Если Вопрос("Сохранить?", "Да+Нет") = "Да" Тогда
ТекДок.Записать(ПутьКФайлу);
КонецЕсли;
//Вопрос(Текст_вопроса, Режим, Таймаут) - Вывести окно вопроса и получить ответ.
//Возвращает ответную реакцию в виде числа или строки, в соответствии с заданием параметра <Режим>:
//-1 или 'Таймаут' ('Timeout'), если закончилось время ожидания ответа;
//1 или 'ОК' ('ОК'), если если нажата кнопка OK;
//2 или 'Отмена' ('Cancel'), если нажата кнопка Отмена;
//3 или 'Стоп' ('Abort'), если нажата кнопка Стоп;
//4 или 'Повтор' ('Retry'), если нажата кнопка Повтор;
//5 или 'Пропустить' ('Ignore'), если нажата кнопка Пропустить;
//6 или 'Да' ('Yes'), если нажата кнопка Да;
//7 или 'Нет' ('No'), если нажата кнопка Нет.
//
//Параметры:
//Текст_вопроса - cтрока текста вопроса;
//Режим - определяет набор кнопок диалога в виде числа или строки (в скобках английское написание):
// 0 или 'ОК' ('ОК') - кнопка OK;
// 1 или 'ОК+Отмена' ('OK+Cancel') - кнопки OK и Отмена;
// 2 или 'Стоп+Повтор+Пропустить' ('Abort+Retry+Ignore') - кнопки Стоп, Повтор, Пропустить;
// 3 или 'Да+Нет+Отмена' ('Yes+No+Cancel') - кнопки Да, Нет, Отмена;
// 4 или 'Да+Нет' ('Yes+No') - кнопки Да, Нет;
// 5 или 'Повтор+Отмена' ('Retry+Cancel') - кнопки Повтор, Отмена;
// (любое другое значение или отсутствие параметра равносильно 0);
//Таймаут - число секунд времени ожидания ответа (если опущен или 0, то без ограничения).