Имя: Пароль:
1C
 
Вопрос по взаимодействию 1С и WinWord
, ,
0 Бертыш
 
27.09.18
18:52
Стоит задача обработать DOC овский и/или DOCX овский документ и перебирая все страницы в нём вставить на каждую строницу обтекаемое текстовое поле с надписью. Собственно тупо прошу примера кода. Пробовал через OpenXML дабы не обязательно было заказчику иметь WinWord для вставки текстового поля, но что то пошло не так. Теперь вот прошу подсказки в части связи 1С с WinWord по COM/OLE
1 Cyberhawk
 
27.09.18
18:57
"задача обработать DOC овский" + "Пробовал через OpenXML" = ?
2 Бертыш
 
27.09.18
19:08
(1) Ну до DOC овского тупо не добрался.
Вот наёшл в сети константу с помощью которой вроде бы можно подцепить у документа количество страниц. wdActiveEndPageNumber
Однако пока не понятно как её юзать с документом из 1С
Вообще в старых версиях WinWord и VBA как-то всё было более понятно - запустил запись макросов и на выходе получил практически работающий через OLE кусок кода. А сейчас записал макрос. Открыл его в VBA и хрен чего поймёшь как это использовать из стороннего приложения
3 Cyberhawk
 
27.09.18
20:58
Покажи на картинке, что и куда вставить надо
4 Бертыш
 
27.09.18
21:34
Не знаю как показать на картинке. Есть документ а в нём текст по всем листам. Далее в документ в каждую страницу нужно вставить стандартную обтекаемую надпись с текстом. На схеме А. Эта надпись должна появиться на каждом листе файла. Для этого надобно перебрать как то как я понимаю все страницы файла и тупо на каждую программно вставить область А

|-------------------|
|                   |
|   ,,,             |
|   ....            |
|   !!!!            |
|          |-----|  |
|          |  А  |  |
|          |-----|  |
|                   |
|-------------------|
5 Cyberhawk
 
27.09.18
21:36
Так если так делать, то и количество страниц изменится
6 Сияющий в темноте
 
27.09.18
21:40
Можно сделать макрос на VbScript и запускать его как приложение.
можно макроч сохранить в одном документк Word и подписать,а из макроса открывать другие документы и обрабатывать,тогда нужно будет просто открыть шаблон.
просто,из 1с в word,это через обмен данными между процессами,очень медленная хрень.
7 Бертыш
 
27.09.18
21:49
(5) Так вроде бы там у ворда есть возможность что бы текст проходил через область А насквозь, то есть наложение как два слоя. Тогда количество страниц то не поменяется
8 Cyberhawk
 
27.09.18
21:55
Обтекание текстом - это не про это
9 Бертыш
 
28.09.18
15:49
(8) Но оно для моих целей и задач вполне подходит. А насчет обработки документа мне нужно как при удалении строк из таблицы значений действовать с хвоста. Разобраться бы как перебрать все станицы последовательно с последней. Фактически в каждую страницу нужно вставлять надпись с прозрачностью и режимом обтекания перед текстом
10 Cyberhawk
 
28.09.18
17:19
Слова "обтекание" и "перед" несовместимы, с таким подходом к мыслеизъяснению далеко не уедешь
11 Бертыш
 
28.09.18
20:10
(10) Можно Вам один вопрос задать? Как через Word.Application получить номер последней страницы и перебрать их все программно с начала до конца стучась из 1С в WinWord по OLE. Вы как знаток раскажите, а дальше я уж как-нибудь сам
12 Cyberhawk
 
28.09.18
21:46
МСДН в помощь
13 Бертыш
 
28.09.18
23:12
(12) То есть даже Вы ничего не знаете. Что ж я Вас услышал
14 palsergeich
 
28.09.18
23:38
(13) Зря Вы так. Я когда решал нетривиальную задачу с Вордом - единственное что помогло - курение MSDN. Да решения в сети были, но они или вообще не работали или работали не совсем так как надо.
15 antndr
 
29.09.18
00:06
(4) Может попробовать колонтитулами поиграться, идея конечно такая себе, но как минимум ими можно программно управлять.
16 palsergeich
 
29.09.18
00:13
(15) Колонтитулы не обтекаются текстом
17 antndr
 
29.09.18
00:40
(16) Вариант опять же теоретический, можно попробовать записать макрос, в котором интерактивно будет добавляться необходимые действия)
18 Бертыш
 
29.09.18
08:01
(17) Действия то да. Мысль то здравая. Для записи процесса вставки поля и в поле текста, для записи перехода по страницам тоже ничего. Вот как получить номер последней страницы в документе.
19 Бертыш
 
29.09.18
08:09
(14) Такой была моя изначальная идея. Я пытался генерировать и/или корректировать колонтитулы на уровне OpenXML для DOCX. Мало того что походу выяснилсь что у меня не получилось с OpenXML, но и возникла здавая мысль, поскольку я то это делаю не для себя, а для заказчика, у заказчика в документах может быть свой колотитул с каковым моя вставка неизбежно будет конфликтовать
20 Бертыш
 
29.09.18
08:22
(14) Я оплачиаю и пользуюсь Office 365/ Сейчас вот попытался попасть в MSDN, но, как в известном анекдоте, "Вышел снова на дерибасовскую". Мне бы очень помогла бы ссылка на свойства метод для получения последней страницы в документе, на получение количества страниц в документе.
Мне попалась в сети идея на предмет получения количества страниц на базе которой я попытался наваять следующий код
идея выглядела как
= selection.information(wdActiveEndPageNumber)
поиск дал то что
wdActiveEndPageNumber равно 3
Однако в коде
    wa=Новый COMОбъект("Word.Application");
    wa.Documents.Open(ИмяФайла);
    Сообщить("Страниц="+wa.Selection.Information(3));//ActiveDocument.
    wa=Неопределено;
сообщает что страниц 1
и как я не бился
Благно вчера наконец то мне предоставили доступ на компьютер на котором в 1С работает отладчик. Однако моя попытка погулять отладчиком по свойствам wa приводит к тому что 1С тупо виснет.
21 Бертыш
 
29.09.18
08:24
То есть сообщает что 1 страница хотя страниц тьма тьмущая.
22 Бертыш
 
29.09.18
11:28
Урааааа
Догуглился до получения количества страниц и прочая
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=636
wa.ActiveDocument.ComputeStatistics(2)

Теперь будет легче. Остальное дело техники
23 Бертыш
 
02.10.18
11:44
Выскочила проблема со вставкой надписи  документ (обтекаемой прозрачной)
То есть на мою версию перевода адресации конструкции
VBA

    Application.Templates( _
        "C:\Users\Бертыш\AppData\Roaming\Microsoft\Document Building Blocks\1049\16\Built-In Building Blocks.dotx" _
        ).BuildingBlockEntries(" Простая надпись").Insert Where:=Selection.Range, _
         RichText:=True
На язык 1С система ругается в плане того что (" Простая надпись") не найдена в шаблоне. Толи проблема в кирилце через OLE, толи в руках моих
24 Бертыш
 
08.10.18
15:35
+23 При чём оно ругается и при переносе макроса из того документа DOCX в другой документ на ActiveDocument.Shapes("Надпись 2").Select

Всё ещё воюю. А с колонтитулами на уровне архива DOCX неполучилось. Проблемы строго говоря две:
1)Непонимание какие там в XML файле существующего footer-а должны быть идентификаторы при вставке штампа в существующий footer. Если колонтитула изначально нет, то делов то... засунуть файл xml из макета с прописыванием его всюду где это необходимо. Тут конечно есть некий обходной манёвр... Сохранять все файлы для целей вставки штампа в формате HTML с последующей вставкой штампа. Однако тут с точки зрения требования заказчика (штамп на каждой странице) возникает другая проблема. Может быть титульный лист, а может и не быть. Может быть отдельный колонтитул для первой страницы, а может сам документ не иметь дополнительных колонтитулов,а может будет. Может быть отдельный колонтитул для чётных, а отдельный для нечетных страниц (помимо колонтитула для первой страницы). И вот как понять как на всех страницах документа включая титульный отметится штампом не вполне понятно.
25 Бертыш
 
10.10.18
01:20
В общем вот решение которое в оконцовке найдено и взято за основу. Размещаю исключительно ради всех тех несчастных кто будет страдать и идти моим путём. Просьба к модераторам придумать во что переобозвать мой топик чтобы название более адекватно отражала суть проблемы которую я пытался решить, дабы при поисковой выдаче она отображалась ищущему.
В общем решение вот http://www.msofficeforums.com/word-vba/19239-add-text-box-each-page-word-doc.html