Вход | Регистрация



Вопрос по взаимодействию 1С и WinWord

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

|-------------------|
|                   |
|   ,,,             |
|   ....            |
|   !!!!            |
|          |-----|  |
|          |  А  |  |
|          |-----|  |
|                   |
|-------------------|
   Cyberhawk
 
5 - 27.09.18 - 21:36
Так если так делать, то и количество страниц изменится
   Сияющий в темноте
 
6 - 27.09.18 - 21:40
Можно сделать макрос на VbScript и запускать его как приложение.
можно макроч сохранить в одном документк Word и подписать,а из макроса открывать другие документы и обрабатывать,тогда нужно будет просто открыть шаблон.
просто,из 1с в word,это через обмен данными между процессами,очень медленная хрень.
   Бертыш
 
7 - 27.09.18 - 21:49
(5) Так вроде бы там у ворда есть возможность что бы текст проходил через область А насквозь, то есть наложение как два слоя. Тогда количество страниц то не поменяется
   Cyberhawk
 
8 - 27.09.18 - 21:55
Обтекание текстом - это не про это
   Бертыш
 
9 - 28.09.18 - 15:49
(8) Но оно для моих целей и задач вполне подходит. А насчет обработки документа мне нужно как при удалении строк из таблицы значений действовать с хвоста. Разобраться бы как перебрать все станицы последовательно с последней. Фактически в каждую страницу нужно вставлять надпись с прозрачностью и режимом обтекания перед текстом
   Cyberhawk
 
10 - 28.09.18 - 17:19
Слова "обтекание" и "перед" несовместимы, с таким подходом к мыслеизъяснению далеко не уедешь
 
 Рекламное место пустует
   Бертыш
 
11 - 28.09.18 - 20:10
(10) Можно Вам один вопрос задать? Как через Word.Application получить номер последней страницы и перебрать их все программно с начала до конца стучась из 1С в WinWord по OLE. Вы как знаток раскажите, а дальше я уж как-нибудь сам
   Cyberhawk
 
12 - 28.09.18 - 21:46
МСДН в помощь
   Бертыш
 
13 - 28.09.18 - 23:12
(12) То есть даже Вы ничего не знаете. Что ж я Вас услышал
   palsergeich
 
14 - 28.09.18 - 23:38
(13) Зря Вы так. Я когда решал нетривиальную задачу с Вордом - единственное что помогло - курение MSDN. Да решения в сети были, но они или вообще не работали или работали не совсем так как надо.
   antndr
 
15 - 29.09.18 - 00:06
(4) Может попробовать колонтитулами поиграться, идея конечно такая себе, но как минимум ими можно программно управлять.
   palsergeich
 
16 - 29.09.18 - 00:13
(15) Колонтитулы не обтекаются текстом
   antndr
 
17 - 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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует