Работа с Ворд через СОМ-Объект

0. 26 15.02.21 06:00 Сейчас в теме
Статья представляет собой еще один велосипед на тему формирования документов на основе шаблонов через СОМ-Объект. Как и все другие велосипеды, этот написан потому, что другие велосипеды - плохие. В действительности, если погуглить, мы получим огромное количество ссылок на советы в стиле "сделай так и будет тебе счастье". Но почему "так", зачем "так", какие есть альтернативы - авторы советов не раскрывают. Хуже того, половина найденных таким способом рецептов окажутся откровенно вредными. Судя по тому, как вредные рецепты копируются из совета в совет, большинство разработчиков, из тех, что переписываются на форумах, просто воспроизводят то, что когда-то нагуглили сами. Ну да, работает - не трогай :-)

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. gubanoff 50 15.02.21 12:25 Сейчас в теме
(0) С СОМ объектом все хорошо. Только работает нестабильно, тормозит, зависит от версии Word, требует наличия Word на машине, не работает на Linux.
Лис Р; +1 Ответить
2. Spektr 766 15.02.21 20:09 Сейчас в теме
Недавно видел еще один способ - Variables https://infostart.ru/public/669785/
3. biimmap 111 16.02.21 17:18 Сейчас в теме
Хорошая статья. Недавно долбался с опен офисом... Который не требует наличия офиса))) Не хватало подобного материала. Пришлось самому писать). В профиле можно увидеть если интересно кому.
4. moff 6 16.02.21 20:58 Сейчас в теме
А популярный кроссплатформенный способ формирования .docx с помощью БСП почему проигнорирован?
5. Yashazz 3752 17.02.21 09:05 Сейчас в теме
(4) Потому что не надо связываться с БСП, граблей не оберёшься.
10. moff 6 17.02.21 12:40 Сейчас в теме
(5) о каких именно граблях идет речь? зачем строить свои грабли, когда 95% потребностей по формированию печатных форм по шаблонам .docx легко закрываются функционалом БСП?
19. Yashazz 3752 17.02.21 18:03 Сейчас в теме
(10) Затем, что свои грабли с очередным релизом, который главбух вечерком грузанул через сервис 1С, внезапно не сломаются. А в БСП любят менять смысл, состав и порядок параметров, переименовывать и переносить функции и модули) Словом, встанете пару раз на оные грабли - познаете дзен))
11. Sindbad_M 26 17.02.21 15:19 Сейчас в теме
(4)
Потому, что БСП работает не через COM, а непосредственно модифицирует .docx. А это совсем за рамками заявленной в статье темы.

БСП - пример готового решения, а не инструмента. Об этом в статье упоминание есть. По сути, БСП предоставляет широкий, но ограниченный функционал по заполнению шаблона с помощью подстановочных полей-параметров. Если потребуется выйти за рамки возможностей этого функционала -- тупик. Можно начинать разработку собственного инструмента с нуля. И на данный момент широта функционала лишь повторяет функционал встроенных в конфигурацию макетов печатных форм. Из мануала даже не понять, можно ли использовать предопределенное оформление разных столбцов при заполнении таблицы: https://its.1c.ru/db/bsp314doc#content:4:1:issogl3_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%­BA%D0%B0_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%BD%D1%8B%D1%85_%D­1%84%D0%BE%D1%80%D0%BC_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB­%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B­C%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2_%D0%B2_%D1%84%D0%BE%D1­%80%D0%BC%D0%B0%D1%82%D0%B5_%D0%BE%D1%84%D0%B8%D1%81%D0%BD%D­1%8B%D1%85_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%­D0%BE%D0%B2_office_open_xml
18. Sindbad_M 26 17.02.21 16:47 Сейчас в теме
(4)
Потому, что БСП работает не через COM, а непосредственно модифицирует .docx. А это совсем за рамками заявленной в статье темы.

БСП - пример готового решения, а не инструмента. Об этом в статье упоминание есть. По сути, БСП предоставляет широкий, но ограниченный функционал по заполнению шаблона с помощью подстановочных полей-параметров. Если потребуется выйти за рамки возможностей этого функционала -- тупик. Можно начинать разработку собственного инструмента с нуля. И на данный момент широта функционала лишь повторяет функционал встроенных в конфигурацию макетов печатных форм. Из мануала даже не понять, можно ли использовать предопределенное оформление разных столбцов при заполнении таблицы: https://its.1c.ru/db/bsp314doc#content:4:1:issogl3_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%­BA%D0%B0_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%BD%D1%8B%D1%85_%D­1%84%D0%BE%D1%80%D0%BC_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB­%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B­C%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2_%D0%B2_%D1%84%D0%BE%D1­%80%D0%BC%D0%B0%D1%82%D0%B5_%D0%BE%D1%84%D0%B8%D1%81%D0%BD%D­1%8B%D1%85_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%­D0%BE%D0%B2_office_open_xml
6. Yashazz 3752 17.02.21 09:07 Сейчас в теме
Предпочитаю обходиться без шаблонов, так оно более предсказуемо. https://infostart.ru/1c/articles/391493/
7. Yashazz 3752 17.02.21 09:08 Сейчас в теме
А вообще, неплохой обзор, и вовсе даже не велосипед. Некоторые неочевидные моменты хорошо разъяснены.
8. DmitryKSL 155 17.02.21 09:25 Сейчас в теме
Только вместо

ШаблонВорд.Bookmarks("Закладка1").Select();
ШаблонВорд.Application.Selection.TypeText("Текст для закладки №1.");
Нужно использовать

Range = ШаблонВорд.Bookmarks("Закладка1").Range;
Range.Text = "Текст для закладки №1.";
Теперь вы знаете почему и, вообще, готовы к статьям из Интернета :-)

Так и не понял почему?
Замечу, оба варианта удаляют закладку, на место которой вставляется текст

Не удаляют. Можно повторно вставить текст в закладку.
12. Sindbad_M 26 17.02.21 15:29 Сейчас в теме
(8)
Так и не понял почему?

Потому, что использование объектов Selection делает невозможной работу пользователя с Вордом во время заполнения шаблона. А объекты Range пользователю не мешают.
(8)
Не удаляют. Можно повторно вставить текст в закладку.

Удаляют. НО можно повторно вставить закладку в текст. И в статье как раз это написано.
13. DmitryKSL 155 17.02.21 15:43 Сейчас в теме
(12) Возможно нюанс в чем-то другом. Т.к.
использование объектов Selection делает невозможной работу пользователя с Вордом во время заполнения
не проявляется.
Например могу формировать для документа с табличной частью десятки документов word (для каждой строки по одному), и это не мешает мне работать с открытым документом.
Удаляют

У меня это не так, все закладки остаются.
16. Sindbad_M 26 17.02.21 16:14 Сейчас в теме
(13)
Дальше надо смотреть код. Это касается и Selection и закладок.
В статье описано, опасность работы с Selection проявляется тогда, когда пользовательский документ открыт в том же экземпляре Ворда, что и СОМ-Объект. Она выше, если обращаться к свойству ActiveSelection приложения и почти не заметна, если обращаться к свойству Selection окна документа.

Фразу про количество документов, связанных с количеством строк, честно говоря, не понял.
9. DmitryKSL 155 17.02.21 09:47 Сейчас в теме
Пользователь передает разработчику файл с образцом документа, который хочет получать из информационной системы в автоматизированном режиме. Точно, значит без явных указаний пользователя разработчик не меняет по своему усмотрению ни одного элемента форматирования, ни шрифт, ни размер, ни поля, ни колонтитулы. НИЧЕГО не меняет. Совершенно ничего. На выходе пользователь должен получить документ неотличимый от документа, созданного собственноручно.

Т.е. я просто должен вставить в нужные места текст и рассчитывать что ничего на странице не разъедется? Это так не работает, практически никогда.
14. Sindbad_M 26 17.02.21 15:44 Сейчас в теме
(9)
вставить в нужные места текст и рассчитывать что ничего на странице не разъедется? Это так не работает, практически никогда.

Это так работает практически всегда. Просто потому, что повторяет действия пользователя при ручном заполнении шаблонов -- пользователь стирает неактуальный текст, заменяя его новым, актуальным. Зависит, конечно, от качества шаблона. Если пользователь зашлифовал шаблон для себя любимого, то и автоматическое заполнение пройдет как по маслу.
Да и что может "разъехаться"? Это же Ворд, текст перенесется на новую строку и/или страницу с учетом заданного форматирования абзацев.
15. DmitryKSL 155 17.02.21 16:09 Сейчас в теме
(14)
Да и что может "разъехаться"? Это же Ворд, текст перенесется на новую строку и/или страницу с учетом заданного форматирования абзацев

Вот простейший пример. Если заполнять город автоматически, то например, Санкт-Петербург сильно длинее чем Москва и блок под дату сдвинется на строку ниже, что по мнению пользователя означает разъедется. Я то знаю что надо вставить таблицу, настроить выравнивание в ячейках, убрать видимость границ и тогда это будет заполняться как надо. Но ни один пользователь еще ни разу не дал такой шаблон, чтобы ничего не переделывать самому.
Прикрепленные файлы:
17. Sindbad_M 26 17.02.21 16:41 Сейчас в теме
(15)
Но ни один пользователь еще ни разу не дал такой шаблон, чтобы ничего не переделывать самому.

А зачем это пользователю? Ведь вы же за них это делаете.
Впрочем, я не имел в виду такую степень занудства.
Имелось в виду, что разработчик, вместо того чтобы взять и сделать, начинает диктовать пользователю что и как теперь будет в шаблоне. Вроде такого:
- ну и что, что в образце написано "А.С. Пушкин", теперь будет "Пушкин А.С."
- ну и что, что средний столбец был выделен курсивом, теперь вся таблица будет одним шрифтом
- ну и что, что в образце "уважаемый/ая" с привязкой к полу. Переделайте образец на унисекс.
20. DmitryKSL 155 17.02.21 18:38 Сейчас в теме
(17)Т.е по существу сказать нечего?
21. Sindbad_M 26 17.02.21 20:21 Сейчас в теме
(20) По существу я раскрыл мысль с "ничего не менять". В конечном итоге, самый лучший вариант - запросить у пользователя, действительно ли он хочет, чтобы при подстановке "Санкт-Петербург" съезжала дата на новую строчку? Если съезжающая дата - не лучший для пользователя вариант, подсказать способы улучшения шаблона (таблица, символ табуляции), но за пользователя правки не вносить.
22. user747134 19.02.21 20:05 Сейчас в теме
У объекта Fields есть метод Unlink(), который заменяет каждое поле на его последний результат, https://docs.microsoft.com/ru-ru/office/vba/api/word.fields.unlink.
Можно делать так:
Документ.Fields.Update();
Документ.Fields.Unlink(); // для каждого из полей документа заменить вхождение поля на значение этого поля
Sindbad_M; +1 Ответить
23. G_100268594770204174954 26.04.21 11:55 Сейчас в теме
Анатолий, как с Вами связаться?
24. Sindbad_M 26 26.04.21 12:54 Сейчас в теме
(23) Например, через личные сообщения. Кликнуть по нику, затем по кнопке "написать".
25. G_100268594770204174954 26.04.21 14:55 Сейчас в теме
На пропускает сообщения в ЛС
27. Sindbad_M 26 27.04.21 09:39 Сейчас в теме
(25) Действительно. Оказывается ЛС доступно только для пользователей имеющих более двадцати комментариев на форуме. Напишите A-точка-G-точка-VASILIEV-собачка-мэил-точка-ру
Оставьте свое сообщение
Вопросы с вознаграждением