|
Выгрузка из 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) ясно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |