Меню

1с word documents add ошибка

   Dmitriy_ Kolesnikov

03.11.17 — 00:39

Сразу скажу — на файловой базе в Windows 7 этот код работает корректно.

Итак, есть: W2016Server + сервер приложений 8.3.10.2580 + самописный документ, в котором есть строчка

ДокументВорд = ОбъектВорд.Documents.Add(ИмяФайлаПаспортаЗаявки);

Сразу говорю — файл я проверял вот так:

Тест = Новый Файл(«c:temp_pmtest.docx»);

Если Тест.Существует() Тогда

— он существует, и сервер его может прочитать. С правами доступа к папкам всё ОК.

На сервере установлен Office 2013 (причем я ставил и 32-битный, и 64-битный), COM-компонент ручками зарегистрировал, поэтому строчка

ОбъектВорд = Новый COMОбъект(«Word.Application»);

теперь выполняется без ошибок. В отладчике объект виден.

Так вот, спотыкаемся на строчке

ДокументВорд = ОбъектВорд.Documents.Add(ИмяФайлаПаспортаЗаявки);

Если файл имеет расширение DOC — ошибка такая:

{Документ.дкЗаявкаНаПроект.МодульОбъекта(77)}: Ошибка при вызове метода контекста (Add): Произошла исключительная ситуация (Microsoft Word): Ошибка в Word.

Если файл имеет расширение DOCХ — ошибка чуть другая:

{Документ.дкЗаявкаНаПроект.МодульОбъекта(79)}: Ошибка при вызове метода контекста (Add): Произошла исключительная ситуация (Microsoft Word): Приложению Word не удалось прочитать документ. Возможно, он поврежден.

Попробуйте выполнить следующие действия:

* Откройте файл с помощью команды »Открыть и восстановить».

* Откройте файл с помощью конвертера резервных копий.

Я уже в отчаянии, целый день мучаюсь.

Сборки Офиса 2013 — от Кролика, с самыми последними обновлениями, сами понимаете, это бренд, здесь всё пучком. (На Win7 с файловой базой, где всё работает — такая же). Майкрософту я доверяю меньше, но завтра-таки попробую поставить c оригинального образа RTM. Интуиция подсказывает, что не взлетит.

Подскажите, что ещё можно попробовать проверить?

   Сергиус

1 — 03.11.17 — 01:24

А если попробовать зайти на сервер и вручную открыть данный файл? Открывается нормально и содержимое отображает?

   Сергиус

2 — 03.11.17 — 01:26

[Сборки Офиса 2013 — от Кролика, с самыми последними обновлениями, сами понимаете, это бренд, здесь всё пучком. (На Win7 с файловой базой, где всё работает — такая же). Майкрософту я доверяю меньше, но завтра-таки попробую поставить c оригинального образа RTM]

Достаточно спорное утверждение. Я бы больше доверял оригинальному дистрибутиву, чем какой-то сборке, из которой вполне могли повыкидывать «ненужные» вещи.

   h-sp

3 — 03.11.17 — 01:34

(0) попробуйте другую папку. c:temp_pm  — очень сомнительное место, вряд ли там откроет файл ворд.

   Dmitriy_ Kolesnikov

4 — 03.11.17 — 06:46

(1) конечно, открывает и отображает 🙂 Я же не первый день замужем. И даже ЗапуститьПриложение(ИмяФайла), я уверен, будет работать.

(3) и папка эта — не первая, до неё я использовал подкаталог во временной папке (пробовал разные). Разумеется, права доступа — всем на всё.

Ещё раз повторю, что на локальном компьютере с W7 при такой же структуре папок и том же дистрибутиве Офиса (только без сервера приложений) всё работает.

Мне кажется, подвох в Windows 2016.

Другой вариант — в сервере приложений.

Третьего не дано.

   arsik

5 — 03.11.17 — 09:02

(4) Подвох возможно кроется в битности офиса, 1С.

Допустим офис 64x, а 1С 32x и наоборот.

   v77

6 — 03.11.17 — 09:05

нафиг вам этот офис вообще уперся. распаковал, засунул в xml чо хочешь, запаковал и все дела. быстро, дешево и сердито.

   DOSS_S

7 — 03.11.17 — 09:30

Курить «профиль безопасности» в программе «Администрирование серверов 1С Предприятия». По умолчанию использование COM на сервере 1С запрещено. Не советую работать с вордом екселем и тд. на сервере. Зависнет ворд вместе с ним 1с сеанс, что будете делать?

   Сияющий в темноте

8 — 03.11.17 — 09:46

попробуйте написать сценарий и из него управлять вордлм,а уже этот сценарий запустите из 1ц,если что-то пойдет не так можно убить сценарий и ворд из самой 1с

а сервер,кстати,обычно 64-битный

   arsik

9 — 03.11.17 — 10:16

(8) Зачем такой изврат, можно просто фоновым заданием, мне кажется.

   Dedal

10 — 03.11.17 — 11:08

(4) Подвохов там масса. Начиная от того под кем выполняется. Если ушло на сервер значит выполняется под серверным userV8 значит у него должен быть доступ к dcom объекту. Лезешь в dcom офиса и выдаешь ему там все права.

Но лучше сделать по другому. docx это упакованные в zip xml. на просторах интернета есть уже готовый код. Также реализацию и можно посмотреть в 1С Договорчики.

Фактически docx распаковывается, в нужном xml правится, пакуется обратно. Сам понимаешь никаких проблем с COM и офис не нужен.

   Dmitriy_ Kolesnikov

11 — 03.11.17 — 11:14

(5) изначально офис был 32-битный и была ошибка при создании ком-объекта:

ОбъектВорд = Новый COMОбъект(«Word.Application»);

Но я вручную создал коннектор (по инструкции), и ошибка исчезла. Более того, как сказано в (0), я снес 32-битный Офис и поставил 64-битный — это ничего не изменило.

(6) а ссылку? У меня 15 файлов, часть в DOCX, часть в HTML, надо все их упихать в один. Я делаю это с помощью метода InsertFile.

(7) Благодарю, сейчас почитаю про эти профили. Похоже, собака зарыта именно здесь.

(10) пользователю usr1cv8 уже выданы везде все права, в том числе в COM+.

Насчет XML и ZIP — это интересно, но на будущее. Я уже написал код, который быстро работает на файловой базе. Теперь задача — заставить его выполняться на сервере.

   v77

12 — 03.11.17 — 11:20

(11) «а ссылку?» я писал про XML и ZIP

   Dedal

13 — 03.11.17 — 11:36

(11) В самом объекте dcom дал права?

Администрирование ? Службы компонентов ? *** ? Настройка DCOM ? Документ Microsoft Word 97–2003 ? безопасность.

   Филиал-msk

14 — 03.11.17 — 11:53

(0) Сборки Офиса 2013 — от Кролика, с самыми последними обновлениями, сами понимаете, это бренд

Кто все эти люди?

   v77

15 — 03.11.17 — 12:03

(14) уголовники

   Dmitriy_ Kolesnikov

16 — 09.11.17 — 17:05

(13) конечно

(14) весьма уважаемые люди. Робин Гуды наших дней.

(15) руководствуясь вашей логикой, уголовниками можно обозвать 99,9% граждан России, пользующихся компьютерами.

   Филиал-msk

17 — 09.11.17 — 17:07

(16) Обиделся, уголовник?

  

Dedal

18 — 09.11.17 — 17:16

(16) показывай что у тебя между:

ОбъектВорд = Новый COMОбъект(«Word.Application»);

ДокументВорд = ОбъектВорд.Documents.Add(ИмяФайлаПаспортаЗаявки);

В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.

В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.

Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:

Использование шаблонов Word в 1С

Использование шаблонов Word в 1С

Использование шаблонов Word  в 1С

Использование шаблонов Word в 1С

Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»:

Установка закладки, шаблон Word для 1С

Установка закладки, шаблон Word для 1С

Когда файл шаблона Word готов, создаем новую внешнею обработку в 1С, добавляем форму и в модуле формы вставляем следующий код:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ЗаполнитьШаблонВорд();
	
КонецПроцедуры

&НаКлиенте
Функция ЗаполнитьШаблонВорд()

	//Попытка создать COM объект
	Попытка
		ОбъектВорд = Новый COMОбъект("Word.Application"); 
	Исключение
		Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат Неопределено;
	КонецПопытки;
	
	//Путь к шаблону
	ОбъектВорд.Documents.Add("C:UsersКонстантинDesktopШаблон.docx");
	ШаблонВорд = ОбъектВорд.ActiveDocument;
	
	//Получаем все закладки из шаблона
	Для каждого ЗакладкаВорд Из ШаблонВорд.Bookmarks Цикл
		Сообщить(ЗакладкаВорд.Name);		
	КонецЦикла;
	
	//Заменяем закладку1 на текст
	ШаблонВорд.Bookmarks("Закладка1").Select();
	ШаблонВорд.Application.Selection.TypeText("Текст для закладки №1.");
	
	//Заменяем закладку2 на текст
	ШаблонВорд.Bookmarks("Закладка2").Select();
	ШаблонВорд.Application.Selection.TypeText("Текст для закладки №2.");
	
	//Заменяем закладку3 на текущую дату
	ШаблонВорд.Bookmarks("Закладка3").Select();
	ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());
	
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
	//Закрытие документа
	//ОбъектВорд.Application.Quit();
	
КонецФункции

В результат запуска внешней обработки 1С по формированию печатной формы на основе шаблона в виде файла Word, мы получим следующий результат:

Результат использования шаблонов Word в 1С

Результат использования шаблонов Word в 1С

Информацию по методам COM объекта Word, а так же дополнительные данные можно узнать из MSDN.

Скачать файл обработки 1С и шаблона Word.

Дополнение к заметке Использование шаблонов Word в 1С

Выражаю благодарность, всем тем, кто комментирует запись, благодаря вам, материал дополняется новыми данными и будет полезен более широкому кругу посетителей.

1. А как поменять размер шрифта во вставляемом тексте?
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:

//Заменяем закладку3 на текущую дату
ШаблонВорд.Bookmarks("Закладка3").Select();

ШаблонВорд.Application.Selection.Font.Bold = 1;
ШаблонВорд.Application.Selection.Font.Size = 20;
	
ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());

2. Картинки есть возможность выгружать в шаблон?
Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:

// Вставка изображения
ШаблонВорд.Bookmarks("Закладка3").Select();
ШаблонВорд.Application.Selection.InlineShapes.AddPicture("C:UsersКонстантинDesktoplogo_1c.png");

3. При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?
Может попробовать изменить путь на: «C:Шаблон.docx».

4. Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Макет    = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка"); 
ИмяФайла = КаталогВременныхФайлов() + ""файл.doc";
Макет.Записать(ИмяФайла);

Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk
Предполагаю, что метод Записать(< ИмяФайла>, < ТипФайлаТаблицы>) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».

5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы?
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:

Sub Макрос1()
'
' Макрос1 Макрос
'
'
    Selection.MoveLeft Unit:=wdCharacter, Count:=15, Extend:=wdExtend
    ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _
        "C:UsersКонстантинDesktopТест.txt", SubAddress:="", ScreenTip:="", _
        TextToDisplay:="ТестоваяСсылка"
End Sub

Описание метода добавления в MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word

Соответственно код для 1С следующий:

Функция ЗаполнитьШаблонВорд()

	//Попытка создать COM объект
	Попытка
		ОбъектВорд = Новый COMОбъект("Word.Application"); 
	Исключение
		Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат Неопределено;
	КонецПопытки;
	
	//Путь к шаблону
	ОбъектВорд.Documents.Add("C:Usersk.blaginDesktopШаблон.docx");
	ШаблонВорд = ОбъектВорд.ActiveDocument;
	
	//Получаем все ссылки из шаблона
	Для каждого ЗакладкаВорд Из ШаблонВорд.Hyperlinks Цикл
		Сообщить(ЗакладкаВорд.Name);		
	КонецЦикла;
	
	//Меняем адрес уже существующей ссылки
	ШаблонВорд.Hyperlinks("Logs.zip").Address = "C:Usersk.blaginDesktopMemory.zip";
	
	//Заменяем закладку на ссылку
	ОбъектЗакладка = ШаблонВорд.Bookmarks("Закладка3");
	ШаблонВорд.Hyperlinks.Add(ОбъектЗакладка.Range, "C:Usersk.blaginDesktopШаблон.docx", "", "Шаблон.docx", "C:Usersk.blaginDesktopШаблон.docx");
	
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
	//Закрытие документа
	//ОбъектВорд.Application.Quit();
	
КонецФункции

Пример выгрузки информации в ворд из 1С

Процедура КнопкаВыполнитьНажатие(Кнопка)

          // Создание объекта MS Word
     //Попытка
     //    Word = Новый COMОбъект(«Word.Application»);
     //Исключение
     //    Сообщить(ОписаниеОшибки(),»!!!»);
     //    Сообщить(«Возможно, MS Word не установлен на этом компьютере.»);
     //    Возврат;
     //КонецПопытки;

          Handler = Новый Структура(«Тип», «DOC»);

          Попытка
         Word = Новый COMОбъект(«Word.Application»);
     Исключение
         //ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), «Ошибка»,
         //    ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина);
         //НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке());
     КонецПопытки;

          Handler.Вставить(«COMСоединение», Word);
     Попытка
         Word.Documents.Add();
     Исключение
         Word.Quit(0);
         Word = 0;
         Handler.Word = 0;
         //ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), «Ошибка»,
         //    ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина);
         //НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке());
     КонецПопытки;

   

     // Установка видимости приложения
     Word.Visible = Истина;
     // Добавление нового документа в приложение
     //Word.Documents.Add();
     // Делаем документ активным
     Документ = Word.ActiveDocument();

          Таб = Документ.Tables.Add(Документ.characters.last, 2, 2);
     Таб.Cell(1, 1).Range.Text = «»;
     Таб.Cell(1, 2).Range.Text =»»;
     Таб.Cell(1, 2).Range.ParagraphFormat.Alignment=2; // право

          Таб.Cell(2, 1).Range.Text = «г. Иркутск, б. Постышева 18Б»;
     Таб.Cell(2, 2).Range.Text = «Отдел по работе с претензиями»;
     Таб.Cell(2, 2).Range.ParagraphFormat.Alignment = 2; // Выравнивание в право

          // Добавим параграф
     Документ.Paragraphs.Add();
     НомерПараграфа = Документ.Paragraphs.Count();
     Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«Претензия № «);

          Документ.Paragraphs.Add(); // Отступ

          Документ.Paragraphs.Add();
     НомерПараграфа = Документ.Paragraphs.Count();

          ПечТема = «»;
         ПечТема = «Тема: Адресная система распространения»;   

          Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(ПечТема);
     Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта
     Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = -1; // жирный шрифт

          Документ.Paragraphs.Add();
     НомерПараграфа = Документ.Paragraphs.Count();
     Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«на «);
     Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта
     Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = -1; // жирный шрифт

               Документ.Paragraphs.Add(); // Отступ

          ПечТовар = «» + » (» + «)»;
     ПечНомерИздания = «»;
     ПечЗаказ = «№ » + » от «;

          ПечИсполнитель = «123»;
     ПечТелефон = «123»;

               Документ.Paragraphs.Add();
     НомерПараграфа = Документ.Paragraphs.Count();
     //Документ.Paragraphs(НомерПараграфа).Format.SpaceAfter = 24;
     Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(»    Направляем для проверки запрос о неполучении «);
     Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта
     Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт   
     Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // лево

          Документ.Paragraphs.Add();
     НомерПараграфа = Документ.Paragraphs.Count();
     Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(»    Просим сообщить данные отправительных документов на указанное издание или сообщить причину неполучения посыла.»);
     Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта
     Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт   
     Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // лево

               Документ.Paragraphs.Add(); // Отступ
     Документ.Paragraphs.Add(); // Отступ

          Документ.Paragraphs.Add();
     НомерПараграфа = Документ.Paragraphs.Count();
     Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«ФИО исполнителя: » + ПечИсполнитель + » _____________ подпись»);
     Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта
     Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт   
     Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // лево

          Документ.Paragraphs.Add();
     НомерПараграфа = Документ.Paragraphs.Count();
     Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«Контактный телефон: » + ПечТелефон);
     Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта
     Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт   
     Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // лево

          Документ.Paragraphs.Add(); // Отступ

          Word.Activate();

          // Сохранить и закрыть документ
     //Документ.Save();
     //Документ.SaveAs(»c:\Akt.doc»);
     //Word.ActiveDocument.Close();
КонецПроцедуры

Автор bestname, 29 апр 2016, 15:35

0 Пользователей и 1 гость просматривают эту тему.

Здравствуйте. Формирую word файл. Никак не могу добавить строки из табличной части документа в word. Все получается, только если в ТЧ документа одна строка. Если больше, то получаю ошибку:

{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(3000)}: Ошибка при вызове метода контекста (Cell): Произошла исключительная ситуация (Microsoft Word): Запрашиваемый номер семейства не существует

Я так понимаю, что я обращаюсь к ячейке еще не созданной строки. Но я вроде как ее создаю. Наверное неправильно создаю.


        Договор = ПолучитьМакет("Макет");
MSWord = Договор.Получить();

Попытка
Doc = MSWord.Application.Documents(1);
Doc.Activate();

//Товары
ТекСтрока = ЭлементыФормы.Товары.ТекущаяСтрока;
Для Каждого ТекСтрока Из Товары Цикл

    НомерСтроки = ТекСтрока.НомерСтроки + 1;
    //Добавляем новую строку таблицы
    Doc.Tables(2).Rows.Add();

    Doc.Tables(2).Cell(НомерСтроки, 1).Range.Text = ТекСтрока.НомерСтроки;
    Doc.Tables(2).Cell(НомерСтроки, 2).Range.Text = ТекСтрока.Номенклатура.НаименованиеПолное;
    Doc.Tables(2).Cell(НомерСтроки, 3).Range.Text = ТекСтрока.ЕдиницаИзмерения.Наименование;
    Doc.Tables(2).Cell(НомерСтроки, 4).Range.Text = ТекСтрока.Количество;
    Doc.Tables(2).Cell(НомерСтроки, 5).Range.Text = ТекСтрока.Цена;
    Doc.Tables(2).Cell(НомерСтроки, 6).Range.Text = ТекСтрока.Сумма;
КонецЦикла;

    MSWord.Application.Visible = Истина;
    MSWord.Activate();
Исключение
    Сообщить(ОписаниеОшибки());
    MSWord.Application.Quit();   
КонецПопытки;   

возврат 0;

Что я делаю неправильно?


Doc.Tables(2).Cell(НомерСтроки,)<—- нет такого элемента

Добавлено: 29 апр 2016, 15:50


т.е. по данному номеру строки не может найти элемент

Добавлено: 29 апр 2016, 15:54


по идеи Doc.Tables(2).Rows.Add() должно вернуть вам строку

Помогли — Скажи спасибо! Решил сам — поделись решением!
:)


Короче я понял. Строка добавляется в конце таблицы. А мне нужно с определенного места(со второй строки). Я так понимаю, что в

Doc.Tables(2).Rows.Add(); мне нужно передать параметры?
Пишу
Doc.Tables(2).Rows.Add(2);
{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(2993)}: Ошибка при вызове метода контекста (Add): Произошла исключительная ситуация (Microsoft Word): Неверный параметр

Вот как выглядит макет моей таблицы:

Добавлено: 05 мая 2016, 11:54


Вообщем получилось, строка добавилась после второй строки. Но добавилась, когда я снял объединение ячеек. Вот такая команда:


Doc.Tables(2).Rows(2).Select();
MSWord.Application.Selection.InsertRowsBelow(1);

Но поскольку у меня некоторые ячейки объеденены, то вылазит ошибка:

{Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(2994)}: Ошибка при вызове метода контекста (Rows): Произошла исключительная ситуация (Microsoft Word): Отсутствует доступ к отдельным строкам, поскольку таблица имеет ячейки, объединенные по вертикали

Может кто подскажет?


Рекомендовать в новости

0

18.04.2017 — 10:49


Сетевая Торговля 7.7
Обработка, которая заполняет файл шаблон Word выдает сообщение.
Док=NewDoc.Add(сокрЛП(ИмяДокСПутем));
Microsoft Word: Приложению Word не удалось открыть документ, так как пользователь не обладает достаточными правами.

Эта ошибка не зависит от прав пользователя в 1С, а только от компьютера. На компьютере главбуха ошибки нет, независимо от того под кем входишь в 1С. На остальных компьютерах ошибка.

1

18.04.2017 — 11:07

Так, может быть, ворды разные?

3

18.04.2017 — 11:26

(1)+
либо на компе буха виндовые права позволяют открывать, а на остальных компах виндовых прав не хватает…

4

18.04.2017 — 12:16

Word случаем не 64 бита «у НЕ ГЛАВБУХА»?

5

18.04.2017 — 13:37

(3) об рассказал сам ТС… Только он, похоже, напрочь забанен в гугле. Ибо если фразу из сообщения ТС задать гуглю, то получаем четкую причину невозможности открытия документа

6

14.06.2017 — 12:12

Уточнение к вопросу.
1С стоит на терминальном сервере Windows Сервер 2003.
Word 2007 32-бит.
Как сделать так, чтобы пользователи не имеющие прав администратора в Windows могли заполнять файл шаблон Word с помощью 1С обработки.

7

14.06.2017 — 15:07

Цитата:

Сообщение от narv Посмотреть сообщение

Как сделать так, чтобы пользователи не имеющие прав администратора в Windows могли заполнять файл шаблон Word с помощью 1С обработки

Сохранить шаблон в той папке, где у пользователя есть все нужные права.

8

14.06.2017 — 17:12

Шаблоны лежат папке с базой 1С на которую у всех полные права. Файлы Word прекрасно открываются в ручном режиме. Проблема именно при открытии обработкой 1С:
WordApp=СоздатьОбъект(«Word.Application»);
NewDoc=WordApp.Documents;
Док=NewDoc.Add(сокрЛП(ИмяДокСПутем));
Microsoft Word: Приложению Word не удалось открыть документ, так как пользователь не обладает достаточными правами.

9

16.06.2017 — 10:11

права на 1С каталог и на темпы полные поставь
ЗЫ и вообще политики безопасности

Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

1

1C 8.x

25.06.2019, 11:26. Показов 8308. Ответов 17

Метки нет (Все метки)


Добрый день!
Подскажите как сохранить шаблон word. У меня ругается на SaveAs

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 ПутьКШаблонам =СокрЛП(Константы.КвартплатаПутьКШаблонам.Получить());
     Если ДокПечати=СокрЛП("Квитанция2") Тогда
         ИмяШаблона = СокрЛП("Квитанция2.dot");
     КонецЕсли;
 
     ИмяФайла = "E:file.doc";
    
    Word= Новый COMОбъект("Word.Application");
    Докум=Word.Documents.Add(""+ПутьКШаблонам+ИмяШаблона);
    Word=Докум;
    Докум=Word.Application.Documents(1);
    Докум.Activate();
    Докум.Content.Copy();
    фл=ложь;
    сч=0;
    
    Для Каждого Стр из Ведомость Цикл
        сч=сч+1;
        фл=Истина;
        
         ЛС=СокрЛП(Стр.ЛицевойСчет)+Стр.ЛицевойСчет.Регион.КодСбер;
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ЛС"+сч+">",0,1,0,,,1,,0,Формат(ЛС,"ЧГ=0"));
         Исключение
         КонецПопытки;
         
         ФИО_1=ТРег(СокрЛП(Стр.ЛицевойСчет.ОтветственныйКвартиросъемщик));
         ФИО_1_Кратко=ОбщегоНазначения.ФамилияИнициалыФизЛица(ФИО_1);
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ФИО"+сч+">",0,1,0,,,1,,0,СокрЛП(ФИО_1_Кратко));
         Исключение
         КонецПопытки;
         
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<АДРЕС"+сч+">",0,1,0,,,1,,0,СокрЛП(Стр.Адрес));
         Исключение
         КонецПопытки;
 
        Если сч=1 Тогда
            сч=0;
            Докум = Word.Range(0,0);
            Докум.InsertBreak();
            Докум = Word.Range(0,0);
            Докум.Paste();
        Конецесли; 
    КонецЦикла;
    Докум.SaveAs(ИмяФайла);
Word.Application.Quit();

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



198 / 158 / 45

Регистрация: 23.08.2014

Сообщений: 807

25.06.2019, 12:42

2

Процедура клиент, сервер ?
Есть доступ до папки у пользователя ?
1С пробовал от админа запускать ?
И что за ошибка хоть ?



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

25.06.2019, 14:39

 [ТС]

3

1. Процедура сервер
2. Есть доступ
3. Работаю по админом
4. Метод объекта не обнаружен (SaveAs)
Докум.SaveAs(ИмяФайла);



0



198 / 158 / 45

Регистрация: 23.08.2014

Сообщений: 807

25.06.2019, 16:17

4

Нельзя сохранять фалы на сервере, нужно перенести на клиент.



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

25.06.2019, 16:18

 [ТС]

5

можешь показать



0



198 / 158 / 45

Регистрация: 23.08.2014

Сообщений: 807

25.06.2019, 16:24

6

Ermak27, полностью процедуру всю переноси на клиент. А данные для заполнения вытаскивай через функции на сервере несли понадобится.

Перед процедурой у тебя написано &НаСервере, меняй это на &НаКлиенте. Повалятся ошибки, такие как обращение к константе например и начинай их исправлять потихоньку.



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

25.06.2019, 16:44

 [ТС]

7

Я тебя не так понял на счёт сервера. У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте. У меня база крутиться на sql сервере



0



198 / 158 / 45

Регистрация: 23.08.2014

Сообщений: 807

25.06.2019, 16:52

8

Ermak27, хорошо. Напиши тогда где находится процедура. В модуле формы или модуле объекта ?



0



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

25.06.2019, 17:06

 [ТС]

9

Модуле формы. Процедура срабатывает при нажатии кнопки

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Процедура ОсновныеДействияФормыКвитанция(Кнопка)
    // Вставить содержимое обработчика.
    Печать("Квитанция2");
КонецПроцедуры
 
Процедура Печать(ДокПечати="")
    ПутьКШаблонам =СокрЛП(Константы.КвартплатаПутьКШаблонам.Получить());
     Если ДокПечати=СокрЛП("Квитанция2") Тогда
         ИмяШаблона = СокрЛП("Квитанция2.dot");
     КонецЕсли;
 
     ИмяФайла = "E:file.doc";
    
    Word= Новый COMОбъект("Word.Application");
    Докум=Word.Documents.Add(""+ПутьКШаблонам+ИмяШаблона);
    Word=Докум;
    Докум=Word.Application.Documents(1);
    Докум.Activate();
    Докум.Content.Copy();
    фл=ложь;
    сч=0;
    
    Для Каждого Стр из Ведомость Цикл
        сч=сч+1;
        фл=Истина;
        
         ЛС=СокрЛП(Стр.ЛицевойСчет)+Стр.ЛицевойСчет.Регион.КодСбер;
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ЛС"+сч+">",0,1,0,,,1,,0,Формат(ЛС,"ЧГ=0"));
         Исключение
         КонецПопытки;
         
         ФИО_1=ТРег(СокрЛП(Стр.ЛицевойСчет.ОтветственныйКвартиросъемщик));
         ФИО_1_Кратко=ОбщегоНазначения.ФамилияИнициалыФизЛица(ФИО_1);
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<ФИО"+сч+">",0,1,0,,,1,,0,СокрЛП(ФИО_1_Кратко));
         Исключение
         КонецПопытки;
         
         Попытка 
             Замена=Word.Content.Find;
             Замена.Execute("<АДРЕС"+сч+">",0,1,0,,,1,,0,СокрЛП(Стр.Адрес));
         Исключение
         КонецПопытки;
 
        Если сч=1 Тогда
            сч=0;
            Докум = Word.Range(0,0);
            Докум.InsertBreak();
            Докум = Word.Range(0,0);
            Докум.Paste();
        Конецесли;  
    КонецЦикла;
    Докум.SaveAs(ИмяФайла);
Word.Application.Quit();
 
КонецПроцедуры



0



198 / 158 / 45

Регистрация: 23.08.2014

Сообщений: 807

25.06.2019, 18:16

10

Попробуй так прописать

Докум.Documents.SaveAs(ИмяФайла);



0



1117 / 671 / 195

Регистрация: 22.04.2013

Сообщений: 5,072

Записей в блоге: 1

25.06.2019, 22:48

11

Цитата
Сообщение от Ermak27
Посмотреть сообщение

У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте.

ну не стоит и не стоит. где процедура выполняется, когда не стоит? в воздухе? вряд ли.
посмотрите, есть ли у вас на сервере диск Е, куда вы пытаетесь записать, и есть ли права на запись на него



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

26.06.2019, 08:40

 [ТС]

12

dggrom, выдаёт ошибку Поле объекта не обнаружено (Documents)
Докум.Documents.SaveAs(ИмяФайла);

Добавлено через 2 минуты
Yulunga, Я же писал что диск есть, права есть



0



198 / 158 / 45

Регистрация: 23.08.2014

Сообщений: 807

26.06.2019, 10:02

13

Yulunga, у него метод записи самой не видет.

Ermak27, что за конфигурация, какие формы, управляемые или нет ?



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

26.06.2019, 10:05

 [ТС]

14

dggrom, Не управляемые, Обычное приложение



0



1117 / 671 / 195

Регистрация: 22.04.2013

Сообщений: 5,072

Записей в блоге: 1

26.06.2019, 13:01

15

по мне так проблема в этом:
Докум=Word…
Word=Докум;
Докум=Word…

запутал с какой-то целью. поэтому и нет там сейвас, что применяется не к тому к чему надо. чехарда. имена переменных закончились?



0



4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

26.06.2019, 13:51

 [ТС]

16

Yulunga, я закомментировал Word=Докум;, теперь выдаёт ошибку Метод объекта не обнаружен (Range)
Докум = Word.Range(0,0);



0



Yulunga

1117 / 671 / 195

Регистрация: 22.04.2013

Сообщений: 5,072

Записей в блоге: 1

26.06.2019, 17:47

17

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Word =  Новый COMОбъект("Word.Application");
    word.Visible = 0;    
    word.Application.DisplayAlerts = ложь;
        
    Word.Documents.ADD();
    DocWord = Word.Documents.Open(ПутькФайлу);
    DocWord.Activate();
    
    DocWord.sections.item(1).footers.item(1).Range.Text = "Мой любимый документ";
 
    Word.Application.DisplayAlerts =-1; 
    
    Word.ActiveDocument.saveas(ПутькФайлу);
  
    word.Application.quit();

ну вот чем не код для рыбы. сейвас должен быть для активного документа



0



Ermak27

4 / 4 / 0

Регистрация: 16.01.2013

Сообщений: 1,228

27.06.2019, 11:22

 [ТС]

18

Yulunga, как мне мой код поправить?
Мне нужно чтобы два значение выводились на страницу.
Например: Страницу ворда я делю по пополам, получается при печати А5. Т.е есть в ТЗ 4 значение, то вордовский документ должен вывести две страницы, на каждой странице два значения. Приложил картинку.

Код который в самом начале, он так и выводит как надо, но встала задача сохранить эти вордовские документы по индексу, вот тут проблема и появилась у меня. Вчера я переделал немного код
Создал форму с типом ActiveDocument. Написал код который сохраняет мне вордовские документы но значение заносит в каждый лист, а мне нужно два значения на лист.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Процедура КнопкаВыполнитьНажатие(Кнопка)
    
 
    
    Файл = "E:doc";
    //таблица
    Таблица = Новый ТаблицаЗначений();   // создаем таблицу    
    //колонки
    Таблица.Колонки.Добавить("Наименование"); //добавляем нетипизированную колонку
    Таблица.Колонки.Добавить("Индекс"); //добавляем колонку со строгим указанием типа     
    //строчки
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст1";  //указываем произвольное значение
    Строка.Индекс = "185001";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст11"; //указываем произвольное значение
    Строка.Индекс = "185001";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст2";  //указываем произвольное значение
    Строка.Индекс = "185002";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст22"; //указываем произвольное значение
    Строка.Индекс = "185002";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст3";  //указываем произвольное значение
    Строка.Индекс = "185003";   //указываем произвольное значение
    Строка = Таблица.Добавить();
    Строка.Наименование = "Текст33"; //указываем произвольное значение  
    Строка.Индекс = "185003";   //указываем произвольное значение
    Строка = Таблица.Добавить();   
    Строка.Наименование = "Текст333";    //указываем произвольное значение  
    Строка.Индекс = "185003";   //указываем произвольное значение 
    
    
    ТабДокумент  = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ";
    
    АктивныйДокумент = ПолучитьМакет("Макет");
    КомОбъект = АктивныйДокумент.Получить();
    
    
    Word = КомОбъект.Application;
    Док=Word.Documents(1);
    // Отключим проверку грамматики и вывод информации о грамматических ошибках.
    Док.GrammarChecked=0;
    Док.ShowGrammaticalErrors=0;
    
    Док.Activate();
    //Файл = "E:doc" + Индекс1 + "_" + КолЗаписей + ".doc";
    Word.Selection.WholeStory();
    Word.Selection.Copy();
    
    Счетчик = 0;
    
    Индекс1 = "";
    КолЗаписей = 0;
    
    //обход всей таблицы
    Для каждого Стр из Таблица Цикл
        Счетчик = Счетчик + 1;
 
        Если Индекс1 <> Стр.Индекс Тогда
            Если НЕ Индекс1=""  Тогда
                ЗаписатьФайл (Док,КолЗаписей,Индекс1,Файл); 
            КонецЕсли;
                
            ТабДокумент  = Новый ТабличныйДокумент;
            ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ";
            
            АктивныйДокумент = ПолучитьМакет("Макет");
            КомОбъект = АктивныйДокумент.Получить();
            
            
            Word = КомОбъект.Application;
            Док=Word.Documents(1);
            // Отключим проверку грамматики и вывод информации о грамматических ошибках.
            Док.GrammarChecked=0;
            Док.ShowGrammaticalErrors=0;
            
            Док.Activate();
            //Файл = "E:doc" + Индекс1 + "_" + КолЗаписей + ".doc";
            Word.Selection.WholeStory();
            Word.Selection.Copy();
            
            
            КолЗаписей = 0;
        КонецЕсли;         
        КолЗаписей = КолЗаписей + 1;
        
        Замена = Док.Content.Find;
        Замена.Execute("ЛС"+Счетчик,  Ложь, Истина, Ложь, , , Истина, , Ложь, Стр.Наименование);
        Замена = Док.Content.Find;
        Замена.Execute("Индекс"+Счетчик,  Ложь, Истина, Ложь, , , Истина, , Ложь, Стр.Индекс);
        
        Word.Selection.EndKey(6);
        
      Если Счетчик < Таблица.Количество() тогда
                Word.Selection.InsertBreak(7);
                Word.Selection.Paste();
     КонецЕсли;
                
        Индекс1 = Стр.Индекс;
    КонецЦикла;
    ЗаписатьФайл (Док,КолЗаписей,Индекс1,Файл);
 
    Word.Quit();
КонецПроцедуры
 
 
Процедура ЗаписатьФайл (Док,КолЗаписей,Индекс1,Файл)
     Док.SaveAs(Файл + ?(Прав(Файл,1)="","","") + Индекс1 + "_" + КолЗаписей + ".doc");
    Док.Close(0);
КонецПроцедуры

Можете подсказать как мне сделать чтобы два значения выводила.

Миниатюры

Word SaveAs 1c
 



0



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

Вставка таблицы в документ 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();

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

2017-12-19T18:36:38+00:00<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать шаблон bill.dotx, который используется в примерах ниже.
Как создавать такие шаблоны самому.

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

/// Как создать документ 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();
 
    Возврат ФайлДляЗаписи;
 
КонецФункции
 
/// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать шаблон bill.dotx, который используется в примерах ниже.
Как создавать такие шаблоны самому.

Работа с Word в языке 1С 8.3, 8.2 (в примерах)

<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • 1с postgresql ошибка формата потока
  • 1с post запрос ошибка 400