Имя: Пароль:
1C
 
Список полей из .docx файла
0 Stepa86
 
12.03.08
15:14
Есть вордовский документ со списком полей, заранее неизвестным списком. Поля в документ добавляются следующим образом: Вставка -> Текст -> Экспресс-блоки -> Поле -> DOCVARIABLE -> Ввод имени поля (например "Контрагент").
Как получить из 1Ски список этих полей? создал тестовый док, и в 1ске написал вот это:

Word = Новый COMОбъект("Word.Application");
Word.Documents.Open(ПолноеИмяФайла);
Шаблон = Word.ActiveDocument();
//здесь должно быть получение списка полей, но Шаблон.Variables.Count = 0,
Word.Quit();
1 ТелепатБот
 
гуру
12.03.08
15:14
2 Stepa86
 
13.03.08
11:55
неужели никто не сталкивался??? чую придется тогда делать через закладки, если их список можно получить или еще через какие нить извращения, так как по умному че т не получается
3 DDD2006
 
13.03.08
12:14
Я делал так

у меня только офис 2003 а не 2007

   Шаблон=СокрЛП(Константы.ЗаявлениеЮрЛица.Получить());
   Попытка
       Выпуск=Новый COMОбъект("Word.Application");//ПолучитьCOMОбъект("","WORD.Application")
   Исключение
       Сообщить(ОписаниеОшибки(),"!!!");
       Сообщить("Возможно, MS Word не установлен на этом компьютере.");
       Возврат;
   КонецПопытки;
   ДокВыпуск = Выпуск.Documents.Add(Шаблон,False,0);
   Выпуск.Visible=True;
   //З 3
   ДокВыпуск.Variables.Item("З_3").Value=?(Куда.Пустая()," ",СокрЛП(Куда.Наименование));
4 Stepa86
 
13.03.08
13:15
(3) суть в том, что мне и надо получить имя поля, которое в твоем случае "З_3". Зная поле записывать туда значения уже получается... Может кто знает где полный список методов (желательно на русском) для работы с Новый COMОбъект("Word.Application") можно достать???
5 Stepa86
 
14.03.08
13:22
Сырая версия получения списка:

   ПолноеИмяФайла = "D:\Doc1.docx";
   Сообщить("" + ТекущаяДата() + " Подключение к Word");
   Word = Новый COMОбъект("Word.Application");
   Сообщить("" + ТекущаяДата() + " Открытие документа");
   Word.Documents.Open(ПолноеИмяФайла);
   Шаблон = Word.ActiveDocument();
   
   Сообщить("" + ТекущаяДата() + " Получение списка полей");
   Для Каждого цПоле Из Шаблон.Fields Цикл
       ТекстПоля = цПоле.Code.Text;
       Если Лев(ТекстПоля, 12)=" DOCVARIABLE" Тогда
           ИмяПеременной = Сред(ТекстПоля, 15, Найти(ТекстПоля, "\*") - 17);
           НовСтрока = ТабличноеПоле1.Добавить();
           НовСтрока.ИмяПоля = ИмяПеременной;
       КонецЕсли;
   КонецЦикла;

   Шаблон = 0;
   Сообщить("" + ТекущаяДата() + " Отключение от Word");
   Word.Quit();
   
Она мне самому не нравиться,но лучше пока не могу найти...
6 Lmn
 
14.03.08
14:14
(4) Можно узнать из справки по VB для Word, но на инглише правда.

Вот тебе пример оттудова для твоего случая:

For Each aVar In ActiveDocument.Variables
   If aVar.Name = "Blue" Then num = aVar.Index
Next aVar
If num = 0 Then
   ActiveDocument.Variables.Add Name:="Blue", Value:=6
Else
   ActiveDocument.Variables(num).Value = 6
End If
7 Stepa86
 
14.03.08
14:33
(6) у меня коллекция ActiveDocument.Variables пустая, а ActiveDocument.Name - поле не найдено
8 Lmn
 
14.03.08
15:43
(7) Тады вот можно вот твкую красоту навести (обход всех полей типа DOCVARIABLE):

For Each aFld In ActiveDocument.Fields
   If aFld.Type = 64 Then {Моя мега прога для ковыряния содержимого поля} '64 = wdFieldDocVariable
Next aFld

Дальше не знаю как без "синтаксического аналза" кода поля имя переменной вырыть.
9 Stepa86
 
14.03.08
17:08
Теперь код усовершенствовался до такого:

Состояние("Подключение к Word");
   
   Попытка
       Word = Новый COMОбъект("Word.Application");
   Исключение
       Сообщить("Не удалось подключиться к Word.", СтатусСообщения.Важное);
       Возврат;
   КонецПопытки;
   
   Состояние("Открытие документа");
   Попытка
       Word.Documents.Open(ПолноеИмяФайла);
   Исключение
       Сообщить("Не удалось открыть документ в Word.", СтатусСообщения.Важное);
       Возврат;
   КонецПопытки;
   
   Шаблон = Word.ActiveDocument();
   
   Состояние("Получение списка полей");
   СоответствиеРеквизитов.Очистить();
   //получение полей
   Для Каждого цПоле Из Шаблон.Fields Цикл
       
       Если цПоле.Type = 64 Тогда
           
           ТекстПоля = цПоле.Code.Text;
           
           ИмяПеременной = Сред(ТекстПоля, 15, Найти(ТекстПоля, "\* MERGEFORMAT") - 17);
           
           Если Лев(ИмяПеременной, 1) = """"
               И Прав(ИмяПеременной, 1) = """" Тогда
               
               ИмяПеременной = Сред(ИмяПеременной, 2, СтрДлина(ИмяПеременной) - 2);
               
           КонецЕсли;
           
           НовСтрока = СоответствиеРеквизитов.Добавить();
           НовСтрока.ПолеДокумента = ИмяПеременной;
           
       КонецЕсли;
   КонецЦикла;
   
   //Закрываем документ без сохранения
   Шаблон.Close(0);
   Шаблон = 0;
   Состояние("Отключение от Word");
   Word.Quit();
   Попытка
       УдалитьФайлы(ПолноеИмяФайла);
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;

Единственное, что интересно: всегда ли .Code.Text = " DOCVARIABLE " + ИмяПеременной + " \* MERGEFORMAT"