Имя: Пароль:
1C
1С v8
Выгрузка из 1С в Word
,
0 nlira
 
17.02.17
09:32
Здравствуте! Тема может изъезженная, весь интернет перерыла, найти ответы на свои вопросы не смогла.

Выгружаю из 1С данные в Word, как описано здесь 2 способом, напрямую: http://1clancer.ru/forum/forumTheme=11651#lastMess.

1 способом  active document не получается, потому что, в Создать новый  - вставка объекта - пусто, ничего не выбрать.

Word 2013, 1С 8.3

Все вроде бы заполняется, но только в заполненном документе Word сразу не показывает заполненное значение. Надо выделить поле с параметром, нажать на правую кнопку мыши и "Обновить Поле" - тогда показывает переданное из 1С значение.  
Что нужно сделать с Word, чтобы автоматически показывало заполненные поля?
1 nlira
 
17.02.17
09:37
Или может правильную ссылку дадите, в которой по - другому надо делать. Метод исполнения не важен, важен результат.
2 osa1C
 
17.02.17
10:57
(0) Когда-то делал так. Создавал шаблон будущего документа в Word. Места для вставки из 1С [Параметр 1С]. (Это для текстовой части). Для таблицы рисовал шапку таблицы в Word.
Этот шаблон загружал как Макет объекта 1С (из которого идет выгрузка, например обработка)

Ну и сам код:

// Заполнение текстовой части
    MsWord = ПолучитьМакет("МакетРус").Получить();
    Документ = MsWord.Application.Documents(1);
    Документ.Activate();
    
   Word = MsWord.Application;
   Документ = Word.ActiveDocument();
   Замена = Документ.Content.Find;
   РезультатЗамены = Замена.Execute("[Дата]", , , , , , , , , Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy"), 2);
   РезультатЗамены = Замена.Execute("[Город]", , , , , , , , ,Город, 2);
   ТаблицаВорд =Документ.Tables(1);
   Ном = 1;
   Сч = 1;
   // Заполнение таблицы в Word
   Для Каждого Строка Из Заявка Цикл
       ТаблицаВорд.Rows.Add();
       КолНомер = ТаблицаВорд.Cell(Сч+1,1).Range;
       КолНомер.text = Ном;
       КолГруппа = ТаблицаВорд.Cell(Сч+1,2).Range;
       КолГруппа.text = Строка.КатегорияТРУ.Наименование;
       КолНаименование = ТаблицаВорд.Cell(Сч+1,3).Range;
       КолНаименование.text = Строка.НаименованиеТРУ;
       КолКоличество = ТаблицаВорд.Cell(Сч+1,4).Range;
       КолКоличество.text = Строка.Количество;
       КолЕдИзм = ТаблицаВорд.Cell(Сч+1,5).Range;
       КолЕдИзм.text = Строка.ЕдиницаИзмерения;
       Ном = Число(Ном) + 1;
       Сч = Сч +1;
   КонецЦикла;      
      Word.Visible = Истина;
3 nlira
 
17.02.17
11:18
"Места для вставки из 1С [Параметр 1С]. (Это для текстовой части)."
То, есть например: идет текст: "бла - бла-бла и [ЗдесьМестоДляПараметрав квадратныхСкобках]?
И просто квадратные скобки делать в Ворд?
4 nlira
 
17.02.17
11:29
просто с квадратными скобками не отработало. Может в квадратные скобки и в ворде указать где-то еще, что это именно параметр?
5 osa1C
 
17.02.17
11:35
(3) Вот этой строчкой кода
РезультатЗамены = Замена.Execute("[Дата]", , , , , , , , , Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy"), 2);

[Дата] заменяется на ТекущаяДата() из 1С (замена идет целиком, вместе с квадратными скобками). Так что скобки просто для того, чтобы вам как разработчику в макете было видно куда будет вставка
6 osa1C
 
17.02.17
11:37
(4) Раз не нравятся квадратные скобки поставьте <Параметр1С> или любой удобный для вас символ
7 osa1C
 
17.02.17
11:39
8 osa1C
 
17.02.17
11:41
(4) Вот картинка Макета, который в Word, как раз для этого кода
http://radikal.ru/lfp/s016.radikal.ru/i335/1702/20/eb0341505ac3.png/htm
9 Масянька
 
17.02.17
11:42
(0) Довольно неудачный пример (по ссылке).
Если перерыли инет - плохо рыли. Здесь же (на мисте) уже много раз выкладывали рабочий (более удачный) способ. Как раз через квадратные скобки). Ищите.
10 osa1C
 
17.02.17
11:43
(9) Да причем тут квадратные скобки =)))
11 Масянька
 
17.02.17
11:49
(10) Для чего? ТС не понимает, что есть параметр для замены.
12 drcrasher
 
17.02.17
11:55
(0) а просто сформировать табдок и записать его аки DOC по религиозным убеждениям нельзя?
13 osa1C
 
17.02.17
12:02
(12) не комильфо получится
14 nlira
 
17.02.17
12:11
(5) и правда что, замена же идет.
15 osa1C
 
17.02.17
12:44
(14) Получается или нет?
16 nlira
 
17.02.17
13:16
нет, (2) сделала, ругается.
У меня код ниже, все равно не меняет значением из 1С DateDoc.

Код:

Word = Новый COMОбъект("Word.Application");

Макет = ЭтотОбъект.ПолучитьМакетСервер();  

имяВременногоФайла = "D:\Тест Ворд\111.doc";
Макет.Записать(имяВременногоФайла);
ТекДок = Word.Documents.ADD(имяВременногоФайла);
Документ = Word.ActiveDocument();
   Замена = Документ.Content.Find;  
  
   СтруктураДанныхДок = ВернутьСтрутуру();
      
   РезультатЗамены = Замена.Execute("[DateDoc]", , , , , , , , ,СокрЛП(Строка(СтруктураДанныхДок.дата)), 2);
   РезультатЗамены = Замена.Execute("[Sotrudnic]", , , , , , , , ,СокрЛП(Строка(СтруктураДанныхДок.Сотрудник)), 2);

ТекДок.Fields.Update();
Word.ActiveWindow.View.ShowFieldCodes = False;
Word.Visible=Истина;

Word.Activate();
17 nlira
 
17.02.17
13:19
результатЗамены почему-то  = ЛОЖЬ
18 Масянька
 
17.02.17
13:20
(16) Я бы тоже ругалась...

    // формируем файл
    мWord = СоздатьОбъект("Word.Application");

    мWord.Visible = 0;
    мNewDoc = мWord.Documents;
    мШаблон = СокрЛП(Строка(КаталогШаблонов + мШаблон));
    мДок = мNewDoc.Add(мШаблон, 0, 0, 1);  
    
    // верхний колонтитул
    мКолонтитул = мДок.Sections.Item(1).Headers.Item(1).Range;
    мКолонтитул.Find.Execute("[ПечНомерДоговора]",0,0,,,,,,,мНомерДоговора,2);
    мКолонтитул.Find.Execute("[ПечДатаДоговора]",0,0,,,,,,,Нрег(СокрЛП(мДатаДоговора)),2);
        
    мОбъект = мДок.Content;
    // подставляем значения по тексту договора - признак замены []
    мОбъект.Find.Execute("[ПечНомерДоговора]",0,0,,,,,,,мНомерДоговора,2);
    мОбъект.Find.Execute("[ПечДатаДоговора]",0,0,,,,,,,Нрег(СокрЛП(мДатаДоговора)),2);
    мОбъект.Find.Execute("[ПечПокупатель]",0,0,,,,,,,СокрЛП(мПокупатель),2);
    мОбъект.Find.Execute("[ПечРуководитель]",0,0,,,,,,,мПечОтветственноеЛицо,2);
    мОбъект.Find.Execute("[ПечОснование]",0,0,,,,,,,СокрЛП(мОснование),2);
19 osa1C
 
17.02.17
13:31
(18) Это же код из клюшек )))
20 Масянька
 
17.02.17
13:34
(19) А разница в чем?
21 osa1C
 
17.02.17
13:41
(20) да не в чем... просто увидел и то не сразу :)))
22 Кирпич
 
17.02.17
13:58
Еще можно сделать шаблон в RTF, а не DOC и делай что хочешь. Он же текстовый формат.
23 Кирпич
 
17.02.17
13:59
И не надо Word 2013 покупать
24 nlira
 
17.02.17
14:09
не, (18)  не получатеся. В конце сделала
мWord.Visible = Истина;

мWord.Activate();

и открывается шаблон с незаполненными значениями
25 nlira
 
17.02.17
14:12
мWord = Новый COMОбъект("Word.Application");

    мWord.Visible = 0;
    мNewDoc = мWord.Documents;
    мШаблон = "D:\Тест Ворд\111.dotx";
    мДок = мNewDoc.Add(мШаблон, 0, 0, 1);  
    

// верхний колонтитул
СтруктураДанныхДок = ВернутьСтрутуру();

    мКолонтитул = мДок.Sections.Item(1).Headers.Item(1).Range;
    мКолонтитул.Find.Execute("[DateDoc]",0,0,,,,,,,СокрЛП(Строка(СтруктураДанныхДок.дата)),2);
    мКолонтитул.Find.Execute("[Sotrudnic]",0,0,,,,,,,СокрЛП(Строка(СтруктураДанныхДок.Сотрудник)),2);
        
    мОбъект = мДок.Content;
    // подставляем значения по тексту договора - признак замены []

    мОбъект.Find.Execute("[DateDoc]",0,0,,,,,,,СокрЛП(Строка(СтруктураДанныхДок.дата)),2);
    мОбъект.Find.Execute("[Sotrudnic]",0,0,,,,,,,СокрЛП(Строка(СтруктураДанныхДок.Сотрудник)),2);
мWord.Visible = Истина;
////
мWord.Activate();
26 nlira
 
17.02.17
14:13
ладно, пойду в типовых ковыряться. Там есть возможность печатать и в ворд микросовта и в ворд open offica
27 nlira
 
17.02.17
14:19
хотелось красиво парой строчек обойтись - заодно научиться готовить Active document -ничего не получается. Это получается 1С подразумевает работу только в 2010 и ниже офисе? ХМ, 1С83 и не работает с микрософт 2013. Раз в вставке объекта пусто.
28 Масянька
 
17.02.17
14:44
(25) А сами данные для заполнения есть?
29 Масянька
 
17.02.17
14:46
У меня (лично) в конце:

    // записываем файл
    мДок.SaveAs(мИмяФайла);
    
    ИмяФайла = СокрЛП(мИмяФайла);
    
    // активируем Word
    мWord.Visible = 1;
    мWord.Application.WindowState = 2;
    мWord.Application.WindowState = 1;
30 Кирпич
 
17.02.17
15:04
Оставлю на всякий случай примерчик с RTF

&НаКлиенте
Функция StrToRTF(Стр)
    результат = "";
    длина = СтрДлина(Стр);
    Для номер=1 по длина цикл
        результат = результат + "\u"+ СтрЗаменить(Строка(КодСимвола(Стр,номер)),Символы.НПП,"")+"?";
    КонецЦикла;
    возврат результат;
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)    
    
    Шаблон = Новый ТекстовыйДокумент();
    Шаблон.Прочитать("c:\temp\Шаблон.rtf",КодировкаТекста.ANSI);
    Текст = Шаблон.ПолучитьТекст();
    НовыйТекст = СтрЗаменить(Текст,"[Name]",StrToRTF("Иванов Иван Иванович"));
    Шаблон.УстановитьТекст(НовыйТекст);
    Шаблон.Записать("c:\temp\ГотовыйДокумент.rtf",КодировкаТекста.ANSI);
    
КонецПроцедуры
31 Кирпич
 
17.02.17
15:15
Ну еще вариант - использовать формат docx, который есть zip архив. Достать из него document.xml, переписать и засунуть обратно.
А весь этот гемор с Word.Application это дичь.
32 nlira
 
17.02.17
15:31
(31) ясно