Форматированные документы в 1с word

   Garkin

05.10.12 — 04:24

Подскажите как через OLE вставить текст «форматированного документа» в Word с сохранением форматирования

   skunk

1 — 05.10.12 — 07:08

хм … а простой копи/паст у тебя не взлетает?

   dk

2 — 05.10.12 — 08:09

(1) +1

select, copy, paste

   IamAlexy

3 — 05.10.12 — 08:33

(1)а программно в шаблон?

а програмно в табличный документ?

   skunk

4 — 05.10.12 — 08:52

(3)а собственно какая разница в шаблон или просто документ … ворд сохраняет формат при копи/пасте … а шаблон для него такой-же обычный документ …

и что значит табличный документ в ворде?

   Coldboy

5 — 05.10.12 — 09:04

(0) мб поможет.

   Coldboy

6 — 05.10.12 — 09:04

   Garkin

7 — 05.10.12 — 10:58

(1) Нет, надо программно.

(5) Спасибо, увы, не поможет, форматированный документ может быть отформатирован самым произвольным способом.

   skunk

8 — 05.10.12 — 11:00

(7)собственно я про программно и говорил

   Garkin

9 — 05.10.12 — 11:16

(9) Открывать 1000 позиций а потом их копипастить как то не очень, есть надежда что кто нибудь предложит еще что нибудь.

   skunk

10 — 05.10.12 — 11:32

а без открытия никак не случиться …

   Coldboy

11 — 05.10.12 — 11:35

(0) а можно тогда еще раз проблему, я не много не понял. как ты хочешь формировать Word сам текст без шаблонов и параметров ?

   Garkin

12 — 05.10.12 — 12:03

(10) не может быть.

(11) Проблема:  есть справочник номенклатуры. У каждой позиции номенклатуры есть описание оформленное в виде «форматированного документа» (что-то красным, что-то жирным, что-то крупным, что-то с картинками). В 1с формируется документ «комерческое предложение». Этим документом создается вордовcкий файлик: в который надо вывести нашу табличку с сохранением форматирования описания.

   skunk

13 — 05.10.12 — 12:19

(12)я тебе клянусь … пока ты файл не откроешь … ты не прочитать … не записать в него ничего не сможешь

   Garkin

14 — 05.10.12 — 12:30

(13) Не, само открытие файла меня не пугает, меня пугает процесс копипаста, насколько я понимаю чтобы скопипастить мне кроме того что открыть документ, надо его еще вывести на экран, потом сымитировать нажатие кнопок клавиатуры ( и сделать это на клиенте)? Или я что-то не знаю?

   skunk

15 — 05.10.12 — 12:31

(14)ничего не надо … выводить на экран(а даже не желательно ибо торомоза при отрисовке) … и имитировать не надо … есть команды копи и пасте

   Garkin

16 — 05.10.12 — 12:36

(15) Здорово, а можно еще какую нибудь подсказку?

   skunk

17 — 05.10.12 — 12:42

Selection.TypeText Text:=»sdfsdf dfgdfgdf fdgfd»

   Selection.Font.Bold = wdToggle

   Selection.Font.Size = 14

   Selection.TypeText Text:=»fgfdgdfsdfgdf dfgdffdgfdgsdsdferterdfgdfgfdgfd»

   Application.WindowState = wdWindowStateMaximize

   Selection.HomeKey Unit:=wdLine, Extend:=wdExtend

   Selection.Cut

   Selection.PasteAndFormat (wdFormatOriginalFormatting)

   Selection.TypeParagraph

   Selection.TypeParagraph

   Selection.PasteAndFormat (wdFormatOriginalFormatting)

   Selection.TypeParagraph

   Selection.TypeParagraph

   Selection.PasteAndFormat (wdFormatOriginalFormatting)

   Selection.TypeParagraph

   Selection.TypeParagraph

   Selection.PasteAndFormat (wdFormatOriginalFormatting)

   Garkin

18 — 05.10.12 — 12:53

(17) Так не честно,

«Selection.TypeText Text:=»sdfsdf dfgdfgdf fdgfd»

   Selection.Font.Bold = wdToggle

   Selection.Font.Size = 14

   Selection.TypeText Text:=»fgfdgdfsdfgdf dfgdffdgfdgsdsdferterdfgdfgfdgfd»»

Вот эта часть у меня уже есть, храниться в html как мне ее на тонком клиенте малой кровью поместить в буфер обмена?

   skunk

19 — 05.10.12 — 13:03

пятница ломает …

   skunk

20 — 05.10.12 — 13:03

смотри (2) … и спрашивай гугла … там примеров как грязи

   skunk

21 — 05.10.12 — 13:05

  

Garkin

22 — 05.10.12 — 13:05

(19) ясно, спасибо.

 

Функция ПолучитьТекстHTML()


        МакетHTML = РеквизитФормыВЗначение(«Объект»).ПолучитьМакет(«МакетПечати»);


        ОбластьШапка           = ПолучитьОбласть(МакетHTML,»Шапка»);


        ОбластьШапкаТаблицы    = ПолучитьОбласть(МакетHTML,»ШапкаТаблицы»);


        ОбластьСтрока          = ПолучитьОбласть(МакетHTML,»Строка»);


        ОбластьПодвал          = ПолучитьОбласть(МакетHTML,»Подвал»);


        ПараметрыШапки         = Новый Структура(«Номер,Дата,Контрагент»


                                              ,«000001»


                                              ,«01.01.2016»


                                              ,«ООО Рога и Копыта»);


        ТекстHTML      = ТекстHTML+Символы.ПС


                               + ВывестиОбласть(ОбластьШапка,ПараметрыШапки);


        ТекстHTML      = ТекстHTML+Символы.ПС


                               + ВывестиОбласть(ОбластьШапкаТаблицы);


        СуммаИтог = 0;


        Для Сч= 1 по 10 Цикл


               Рандом  = Новый ГенераторСлучайныхЧисел(150*Сч);


               Артикул = Рандом.СлучайноеЧисло(10000,30000);


               Рандом = Новый ГенераторСлучайныхЧисел(15*Сч);


               Цена           = Окр(Рандом.СлучайноеЧисло(100,30000)/100,2);


               Рандом = Новый ГенераторСлучайныхЧисел(Сч);


               Количество             = Рандом.СлучайноеЧисло(1,20);


               Сумма                  = Окр(Цена*Количество,2);


               СуммаИтог              = СуммаИтог+Сумма;


               ПараметрыСтроки = Новый Структура(«НомерСтроки,Артикул,Товар,Количество,Цена,Сумма»


                                              ,Сч


                                              ,Артикул


                                              ,«Товар такойто «+ Строка(Сч)


                                              ,Количество


                                              ,Формат(Цена,«ЧДЦ=2»)


                                              ,Формат(Сумма,«ЧДЦ=2»));


               ТекстHTML = ТекстHTML+Символы.ПС


                                 + ВывестиОбласть(ОбластьСтрока,ПараметрыСтроки);   


        КонецЦикла;


        ПараметрыПодвала = Новый Структура(«Сумма»,Формат(СуммаИтог,«ЧДЦ=2»));                


        ТекстHTML = ТекстHTML+Символы.ПС


                         + ВывестиОбласть(ОбластьПодвал,ПараметрыПодвала);


        Возврат ТекстHTML             


КонецФункции
 

 
<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

4 Comments

  1. к сожалению не нужно лично мне пока, но полезно…

    Reply

  2. Можно не заниматься связкой WORD с 1С, а получать сразу красивые отформатированные документы с использованием ОптимаСофт:Документы.

    Скриншоты можно посмотреть

    http://www.optimasoft.info/index_doki.html

    Там используется внешняя компонента, встроенная в 1С и управляемая кодом 1С.

    Reply

  3. (2) Спасибо, интересно.

    P.S. Метод из публикации портит содержимое буфера обмена. Этим грешит и УТ или ДО при работе с шаблонами MS Office.

    Reply

  4. Добрый день. Как с Вами связаться? Нет старт мани, очень нужна обработка…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Оглавление (нажмите, чтобы раскрыть)

Вставка таблицы в документ Word

Пример вставки таблицы в Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//определяем место вставки
Range = Doc.Range(0);
//создаем таблицу 2х2
Table = Doc.Tables.Add(Range, 2, 2);
Table.Style = "Сетка таблицы";

//определяем ширину столбцов
Table.columns(1).Width = 20;
Table.columns(2).Width = 50;

//заполняем первую строку
Table.Cell(1, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("1");
Table.Cell(1, 2).Select();
Word.Selection.TypeText("Один");

//заполняем вторую строку
Table.Cell(2, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("2");
Table.Cell(2, 2).Select();
Word.Selection.TypeText("Два");

//показываем документ на экране
Word.Visible = Истина;

Вставка текста в документ Word

Пример вставки текста в документ Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//добавляем пустой документ
Doc = Word.Documents.Add();

//добавляем 10 параграфов
Для Н = 1 По 10 Цикл
    Par = Doc.Paragraphs.Add();
    Par.Range.InsertBefore("Параграф №" + Н);
КонецЦикла;

//вставляем текст в начало докуменета
Range = Doc.Range(0);
Range.InsertBefore("Начало!" + Символы.ПС);

//вставляем текст после 16-го символа
Range = Doc.Range(16, 16);
Range.InsertAfter("[Вставка]");

//показываем документ на экране
Word.Visible = Истина;

Выделение текста

Пример выделения текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выделяемый текст");

//выделяем первое слово
Doc.Range(0, 10).Select();

//копируем выделение в буфер обмена
Word.Selection.Copy();

//меняем размер шрифта и т.д.
Word.Selection.Font.Size = 16;

//показываем документ на экране
Word.Visible = Истина;

Выравнивание текста

Пример выравнивания текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Заголовок");
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выравниваем этот текст");

//0 - по левому краю
//1 - по центру
//2 - по правому краю
//3 - по ширине
//текущей параграф по центру
Par.Alignment = 1;
//заголовок по правому краю
Doc.Paragraphs(1).Alignment = 2;

//показываем документ на экране
Word.Visible = Истина;

Замена текста в документе Word

Пример замены текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сбербанк ИНН/КПП: [ИНН]/[КПП]");

//заменяем ИНН
Word.Selection.Find.Text = "[ИНН]";
Word.Selection.Find.Replacement.Text = "7707083893";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//заменяем КПП
Word.Selection.Find.Text = "[КПП]";
Word.Selection.Find.Replacement.Text = "773601001";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//показываем документ на экране
Word.Visible = Истина;

Открытие документа Word

Пример открытия документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Word.Documents.Add("C:tmp1.docx");

//показываем документ на экране
Word.Visible = Истина;

Преобразование в таблицу

Пример преобразования документа Word в таблицу из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Таблица умножения:");

//формируем строку с разделителями
Сторока = "";
Для Н1 = 1 По 9 Цикл
    Для Н2 = 1 По 9 Цикл
        Сторока = Сторока + Н1 * Н2 + ?(
            Н2 = 9, "", Символы.Таб);
    КонецЦикла;
    Сторока = Сторока + Символы.ПС;
КонецЦикла;
Par.Range.InsertAfter(Сторока);

//переходим на строчку вниз
Word.Selection.MoveDown(5, 1, 0);
//выделяем таблицу
Word.Selection.MoveDown(5, 9, 1);

//конвертируем текст в таблицу
Word.Selection.ConvertToTable(1, 9, 9, 0);
Word.Selection.Tables(1).Style = "Сетка таблицы";

//показываем документ на экране
Word.Visible = Истина;

Создание документа Word

Пример создания документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//показываем документ на экране
Word.Visible = Истина;

Сохранение документа

Пример сохранения документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сохраняемый текст");

//сохраняем документ в файл
Doc.SaveAs("C:tmp2.docx");

//закрываем документ
Doc.Close();
Word.Quit();

Удаление текста из документа Word

Пример удаления текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Некоторый текст");

//удаляем слово некоторый и пробел
Range = Doc.Range(0, 10);
Range.Text = "";

//показываем документ на экране
Word.Visible = Истина;

Форматирование текста в документе Word

Пример форматирования текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Форматируем этот текст");
//меняем размер шрифта
Par.Range.Font.Size = 15;
//меняем название шрифта
Par.Range.Font.Name = "Verdana";

//выбираем слово "этот"
Range = Doc.Range(12, 16);
//меняем шрифт на ширный
Range.Font.Bold = Истина;
//курсив
Range.Font.Italic = Истина;
//подчеркнутый
Range.Font.Underline = Истина;
//красный
Range.Font.Color = 13311;

//показываем документ на экране
Word.Visible = Истина;

Чтение текста документа Word

Пример чтения текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Doc = Word.Documents.Open("C:tmp1.docx");

//читаем весь текст документа
Text = doc.Content.Text;
Сообщить(Text);

//читаем с 6-го по 10-й символ
From = 6;
To = 10;
Range = Doc.Range(From, To);
Text = Range.Text;
Сообщить(Text);

//закрыть документ
Doc.Close();
Word.Quit();

Вставка таблицы в документ Word

Пример вставки таблицы в Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//определяем место вставки
Range = Doc.Range(0);
//создаем таблицу 2х2
Table = Doc.Tables.Add(Range, 2, 2);
Table.Style = "Сетка таблицы";

//определяем ширину столбцов
Table.columns(1).Width = 20;
Table.columns(2).Width = 50;

//заполняем первую строку
Table.Cell(1, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("1");
Table.Cell(1, 2).Select();
Word.Selection.TypeText("Один");

//заполняем вторую строку
Table.Cell(2, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("2");
Table.Cell(2, 2).Select();
Word.Selection.TypeText("Два");

//показываем документ на экране
Word.Visible = Истина;
Вставка текста в документ Word

Пример вставки текста в документ Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//добавляем пустой документ
Doc = Word.Documents.Add();

//добавляем 10 параграфов
Для Н = 1 По 10 Цикл
    Par = Doc.Paragraphs.Add();
    Par.Range.InsertBefore("Параграф №" + Н);
КонецЦикла;

//вставляем текст в начало докуменета
Range = Doc.Range(0);
Range.InsertBefore("Начало!" + Символы.ПС);

//вставляем текст после 16-го символа
Range = Doc.Range(16, 16);
Range.InsertAfter("[Вставка]");

//показываем документ на экране
Word.Visible = Истина;
Выделение текста

Пример выделения текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выделяемый текст");

//выделяем первое слово
Doc.Range(0, 10).Select();

//копируем выделение в буфер обмена
Word.Selection.Copy();

//меняем размер шрифта и т.д.
Word.Selection.Font.Size = 16;

//показываем документ на экране
Word.Visible = Истина;
Выравнивание текста

Пример выравнивания текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Заголовок");
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выравниваем этот текст");

//0 - по левому краю
//1 - по центру
//2 - по правому краю
//3 - по ширине
//текущей параграф по центру
Par.Alignment = 1;
//заголовок по правому краю
Doc.Paragraphs(1).Alignment = 2;

//показываем документ на экране
Word.Visible = Истина;
Замена текста в документе Word

Пример замены текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сбербанк ИНН/КПП: [ИНН]/[КПП]");

//заменяем ИНН
Word.Selection.Find.Text = "[ИНН]";
Word.Selection.Find.Replacement.Text = "7707083893";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//заменяем КПП
Word.Selection.Find.Text = "[КПП]";
Word.Selection.Find.Replacement.Text = "773601001";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//показываем документ на экране
Word.Visible = Истина;
Открытие документа Word

Пример открытия документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Word.Documents.Add("C:tmp1.docx");

//показываем документ на экране
Word.Visible = Истина;

Для открытия документа можно использовать два метода коллекции Documents. Первый — Open() приведен выше, второй — Add().

Метод Open() открывает файл для редактирования в Ворде, документ остается связанным с этим файлом — в заголовке окна Ворд указывается имя файла. Открыть можно любой файл, поддерживаемый Вордом, формат файла при редактировании не меняется. Например, открыли файл .rtf, отредактировали, сохранили, файл остался .rtf. Открывать непосредственно шаблон из папки, в которой хранятся шаблоны таким способом не стоит. Если что-то произойдет не так, например, сработает автосохранение в Ворде, шаблон будет испорчен. Сначала файл шаблона следует скопировать (при работе в клиент-серверном варианте это само собой разумеющиеся действие), а потом можно открывать.

Метод Add() создает новый документ на основании указанного шаблона. Шаблоном может быть любой файл, не обязательно родные для Ворда .doc или .docx или .dot. Открытый документ с файлом-шаблоном не связывается, в заголовке окна Ворд будет надпись «Документ1 — Word». При этом информация о формате исходного файла не сохраняется. Открывается просто документ Ворд, содержащий в себе всю информацию из указанного файла. При сохранении без явного указания типа файла он будет сохранен как .docx. Единственное исключение — документ, открытый на основе файла .doc, такие документы по умолчанию сохраняются в файлы .doc. Метод Add() можно использовать для создания документов на основании оригинала шаблона, шаблон повредить невозможно даже случайно.

Методы Open() и Add() являются функциями, т.е. возвращают значение. Причем возвращают они ссылку на новый документ. И ловить потом этот документ в коллекции Documents нам не нужно, ссылку можно сразу сохранить в переменной для дальнейшего использования. Таким образом, для открытия используются следующие команды:

Документ = Word.Documents.Open («C:готовые документыфайл.docx»);

Или

Документ = Word.Documents.Add («C:шаблоныфайл.docx»);

Преобразование в таблицу

Пример преобразования документа Word в таблицу из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Таблица умножения:");

//формируем строку с разделителями
Сторока = "";
Для Н1 = 1 По 9 Цикл
    Для Н2 = 1 По 9 Цикл
        Сторока = Сторока + Н1 * Н2 + ?(
            Н2 = 9, "", Символы.Таб);
    КонецЦикла;
    Сторока = Сторока + Символы.ПС;
КонецЦикла;
Par.Range.InsertAfter(Сторока);

//переходим на строчку вниз
Word.Selection.MoveDown(5, 1, 0);
//выделяем таблицу
Word.Selection.MoveDown(5, 9, 1);

//конвертируем текст в таблицу
Word.Selection.ConvertToTable(1, 9, 9, 0);
Word.Selection.Tables(1).Style = "Сетка таблицы";

//показываем документ на экране
Word.Visible = Истина;
Создание документа Word

Пример создания документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//показываем документ на экране
Word.Visible = Истина;
Сохранение документа

Пример сохранения документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сохраняемый текст");

//сохраняем документ в файл
Doc.SaveAs("C:tmp2.docx");

//закрываем документ
Doc.Close();
Word.Quit();

Иногда после сохранения файла нужно узнать его полное имя, т.е. включая путь и расширение. Например, чтобы отправить файл по электронной почте или записать в базу. Если мы сохранили файл методом SaveAs(), то полного имени мы не знаем, ведь расширение к имени файла добавил Ворд. Ну так из Ворда же полное имя можно получить, у документа есть доступное для чтения свойство FullName:

ПолноеИмяФайла = Документ.FullName;

Завершение работы с СОМ-Объектом рекомендуют (неправильно) делать так:

Документ.Close();
Word.Quit(0);

На первый взгляд, можно и не заметить нолик в параметре метода Quit(). А он важен. Это просто константа wdDoNotSaveChanges :-). Закрыться-то Ворд закроется, вместе со всеми файлами, которые пользователь, возможно, открыл и редактирует.

Если мы исходим из предположения, а мы из него исходим, что пользователь может работать интерактивно со своими собственными файлами, которые могут быть открыты в том же экземпляре Ворда, что и наш СОМ-Объект, то торопиться принудительно выгонять пользователей и закрывать экземпляр приложения не стоит. Можно проверить, есть ли еще открытые документы, кроме нашего. Если есть, не закрывать экземпляр Ворда, пусть пользователь спокойно работает, если других документов нет — закрыть:

Документ.Close();
Если (Word.Documents.Count = 0) Тогда
Word.Quit();
КонецЕсли;

Удаление текста из документа Word

Пример удаления текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Некоторый текст");

//удаляем слово некоторый и пробел
Range = Doc.Range(0, 10);
Range.Text = "";

//показываем документ на экране
Word.Visible = Истина;
Форматирование текста в документе Word

Пример форматирования текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Форматируем этот текст");
//меняем размер шрифта
Par.Range.Font.Size = 15;
//меняем название шрифта
Par.Range.Font.Name = "Verdana";

//выбираем слово "этот"
Range = Doc.Range(12, 16);
//меняем шрифт на ширный
Range.Font.Bold = Истина;
//курсив
Range.Font.Italic = Истина;
//подчеркнутый
Range.Font.Underline = Истина;
//красный
Range.Font.Color = 13311;

//показываем документ на экране
Word.Visible = Истина;
Чтение текста документа Word

Пример чтения текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Doc = Word.Documents.Open("C:tmp1.docx");

//читаем весь текст документа
Text = doc.Content.Text;
Сообщить(Text);

//читаем с 6-го по 10-й символ
From = 6;
To = 10;
Range = Doc.Range(From, To);
Text = Range.Text;
Сообщить(Text);

//закрыть документ
Doc.Close();
Word.Quit();

Вставка картинок

Все картинки в документе Ворд делятся на два вида — вставленные как символ в текст и произвольно расположенные в графическом слое документа (текст их может либо обтекать, либо нет, зависит от параметров каждого объекта). Первый вид картинок представляется объектом InlineShape и доступен в коллекции InlineShapes. Второй вид — объектом Shape и доступен в коллекции Shapes документа. Для деловых документов возиться с размещением картинок в графическом слое нет смысла, достаточно объектов InlineShape.

Принцип прост, находим соответствующий якорь и заменяем его картинкой:

Range = Документ.Range();
Range.Find.Execute(«$[ЯкорьКартинки]$»);
Range.Text = «»;
Документ.InlineShapes.AddPicture (ИмяФайлаКартинки,,, Range);

/// Как создать документ Word на основе шаблона из 1с 8.3, 8.2
 
&НаКлиенте
Функция КакСоздатьДокументWordНаОсновеШаблона(ПутьКШаблону)
 
    // В шаблоне уже расставлены поля с определенными
    // именами, например, org_name, inn, kpp и т.д.
    // Наша задача - заполнить эти поля и сохранить
    // этот шаблон в виде вордовкского файла с
    // расширением docx;
 
    // Сам шаблон мы создали по инструкции отсюда:
    // helpme1s.ru/kak-sozdavat-shablony-word-dlya-ispolzovaniya-v-1s
 
    // Или взяли готовым отсюда:
    // helpme1s.ru/files/ref/bill.dotx
 
    ПриложениеВорд = Новый COMОбъект("Word.Application");
    ОбъектШаблон = ПриложениеВорд.Documents.Add(ПутьКШаблону);
 
    Для Каждого Поле Из ОбъектШаблон.Fields Цикл
        ПолноеИмяПоля = Поле.Code.Text;
 
        // Наши предопределенные поля имеют такой
        // вид: " MERGEFIELD  org_name  * MERGEFORMAT".
        // Наша задача - вытащить из этой конструкции org_name
        // (ну или другое имя, которое мы задали в ворде).
 
        Если (Найти(ПолноеИмяПоля, " MERGEFIELD") = 1) Тогда
            ПозицияСлеша = Найти(ПолноеИмяПоля, "*");
            КороткоеИмяПоля = СокрЛП(Сред(ПолноеИмяПоля, 12, ПозицияСлеша - 12));
 
            ЗначениеПоля = "";
 
            Если КороткоеИмяПоля = "id" Тогда
                ЗначениеПоля = "1";
            ИначеЕсли КороткоеИмяПоля = "bill_date" Тогда
                ЗначениеПоля = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
            ИначеЕсли КороткоеИмяПоля = "org_name" Тогда
                ЗначениеПоля = "ООО ""Ромашка""";
            ИначеЕсли КороткоеИмяПоля = "inn" Тогда
                ЗначениеПоля = "1234567890";
            ИначеЕсли КороткоеИмяПоля = "kpp" Тогда
                ЗначениеПоля = "123456789";
            Иначе
                // ... и так все нужные поля
            КонецЕсли;
 
            Если ЗначениеПоля <> "" Тогда
                Поле.Select();
                ОбъектШаблон.Application.Selection.TypeText(ЗначениеПоля);
            КонецЕсли;            
        КонецЕсли;
    КонецЦикла;
 
    // Запишем файл в папку "Мои документы" пользователя
    ФайлДляЗаписи = КаталогДокументов() + "helpme1c_ru_word_test.docx";
 
    // Если такой файл уже существует - удалим его.
    УдалитьФайлы(ФайлДляЗаписи);
    // Сохраняем шаблон как документ Word с расширением docx.
    ОбъектШаблон.SaveAs(ФайлДляЗаписи);
    // Не забываем закрыть приложение Word.
    ОбъектШаблон.Application.Quit();
 
    Возврат ФайлДляЗаписи;
 
КонецФункции

Особенности работы с колонтитулами

Перебор всех колонтитулов выполняется так:

WdReplaceAll = 2; Для Каждого Section Из Документ.Sections Цикл Для Каждого Header Из Section.Headers Цикл Range = Header.Range; Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла; Для Каждого Footer Из Section.Footers Цикл Range = Footer.Range; Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла КонецЦикла;

Более лаконичное решение заключается в использовании коллекции StoryRanges. Эта коллекция содержит диапазоны (range) всех блоков(?), частей(?) (в справке используется термин story) документа. Тело документа, это главный блок (main story), тоже есть в этой коллекции. Т.е. необязательно искать якоря отдельно в теле документа, отдельно в колонтитулах, все можно сделать одним циклом:

Для Каждого Range Из Документ.StoryRanges Цикл Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла;

Объектная модель Ворд

Ворд, запущенный в качестве СОМ-Объекта, предоставляет доступ к множеству объектов приложения. Понятие «объект» такое же как везде — программная абстракция, имеющая методы и свойства. Методы могут быть как процедурами, так и функциями, при этом функции можно вызывать как процедуры, игнорируя возвращаемое значение. Свойства могут быть либо объектами, либо обычными (скалярными, примитивными) данными, такими как число, строка, логический тип.

Среди объектов особо выделяются специальные объекты-контейнеры, называемые коллекциями. Каждая коллекция предназначена для хранения ссылок на группу однотипных объектов. Например, коллекция Documents хранит ссылки на объекты Document, коллекция Tables хранит ссылки на объекты Table и т.д. Все коллекции именованы во множественном числе, а обычные объекты в единственном. Нумерация объектов в коллекции начинается с единицы. Коллекции Ворд можно перебирать циклом «Для каждого» языка программирования 1С.

Полный список объектов можно, и нужно, смотреть в справочной системе Ворд (раздел справки по Вижуал Бейсику (VBA)). Для старых версий справка откроется локально на компьютере пользователя. Новые версии отправят на сайт Майкрософт: https://docs.microsoft.com/ru-ru/office/vba/api/overview/word/object-model Текст переведен с английского автоматически и местами понять написанное невозможно. Переключение на английский оригинал делается очень просто, достаточно нажать кнопочку «почитать на английском» в правом верхнем углу страницы. Или в адресе ссылки «ru-ru» заменить на «en-us»: https://docs.microsoft.com/en-us/office/vba/api/overview/word/object-model

Многие методы объектов Ворда в качестве параметров принимают числовые значения. Для того, чтобы не путаться в числовых значениях, в Вижуал Бейсике предусмотрены именованные константы. Например, константа wdFormatRTF соответствует числу 6. В Вижуал Бейсике можно писать код так:

Document.SaveAs («имя файла», wdFormatRTF)

Вне VBA именованные константы недоступны, поэтому код 1С будет таким:

Document.SaveAs («имя файла», 6)

Или, без “магических” чисел, таким:

wdFormatRTF = 6;
Document.SaveAs («имя файла», wdFormatRTF);

Я предпочитаю последний вариант.

Значения всех констант нужно смотреть в справочной системе, там они объединены в смысловые группы, называемые «перечисления» (Enumerations): https://docs.microsoft.com/ru-ru/office/vba/api/word(enumerations)

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Понравилась статья? Поделить с друзьями:
  • Форматы данных vba excel
  • Форматы данных microsoft excel формат ячеек
  • Форматы данных excel презентация
  • Форматы графических объектов word
  • Форматы вывода данных excel