Заполнение шаблона Word на сервере, без использования MS Office (docx -> zip -> xml). Предусмотрен вывод табличных частей

05.11.19

Разработка - Инструментарий разработчика

Шаблон в Word, управляемые формы. Создание заполнение документа Word (docx -> zip -> xml) по шаблону на сервере без использования MS Office. Предусмотрен вывод табличных частей.

Скачать файлы

Наименование Файл Версия Размер
Версия 1.0.2 Исправлено: Пропадали пробелы. В отдельных случаях результат не открывался WORD.
.epf 34,35Kb
286
.epf 34,35Kb 286 Скачать
Версия 1.0.1 Шаблон в Word. Без использования MS Office. Предусмотрен вывод таблиц
.epf 34,24Kb
143
.epf 1.0.1 34,24Kb 143 Скачать

Обработать шаблон документа Word на сервере это проблема, с которой уверен сталкивались многие. Библиотека стандартных подсистем делает обработку шаблона на клиенте, а это исключает веб интерфейс и рабочие места, где нет MS Office. При попытке в Word открыть шаблон файла под серверным пользователем, возникают проблемы с доступом. Не отрицаю существования таких настроек на сервере, при которых это возможно, но в моем случае речь шла о массовом продукте. 

Чтобы избавиться от всех прелестей этой прекрасной пары 1с+Word, решил отказаться от Word, хотя над первым может тоже стоило подумать?

Формат MS Word (docx)  - это по сути zip архив с набором xml файлов (Office Open XML). Меняя определенные файлы xml, можно добиться заполнения своего шаблона.

Всю красоту парсинга XML,  из 1с уверен, вы сможете или уже смогли оценить в своей работе.

О решении:

Результатом решения стал общий модуль осуществляющий всю работу по заполнению шаблона.

Общий модуль, для простоты скачивания поместил в модуль обработки.

Процедура ответственная за заполнение шаблона:

ОбработатьФайлDocx(ФайлШаблона,ПараметрыЗаполнения, ШаблоныКЗамене)

  • ФайлШаблона  - (тип: "Строка") Путь к файлу шаблону.
  • ПараметрыЗаполнения  - (тип: "Структура") содежащую символ начала, окончания шаблона.
  • ШаблоныКЗамене - (тип: "Таблица значений") с параметрами, содержащую колонки:  ИмяПараметраВWord - строка с именем шаблона который будет заменен. Результат - Содержит значение на которое будет заменен шаблон.

 

Колонка «Результат»  из «ШаблоныКЗамене»  может иметь тип: "Строка" или "Массив" (содержащий строки).

  • Колонка «Результат» тип "Строка" - заменяет шаблон. 
  • Колонка «Результат» тип "Массив" (содержащий строки). - заменяет шаблон. перечисляет строки через ";", Но если он использован в word таблице, то добавляет строки (если значений в массиве больше чем одно) и расставляет значения. 

Пример 1:

ШаблоныКЗамене имеет строки:

ИмяПараметраВWord = «массив 1» , Результат(массив) содержит два значения: ("Значение 1 массив 1"; "Значение 2 массив 1" ,

ИмяПараметраВWord =  «массив 2», Результат(массив) содержит три значения:("Значение 1 массив 2";"Значение 2 массив 2";"Значение 3 массив 2") :

Пример шаблона в таблице word:

<массив 1>

<массив 2>

 

Результат:

Значение 1 массив 1

Значение 1 массив 2

Значение 2 массив 1

Значение 2 массив 2

 

Значение 3 массив 2

 

Пример 2:

ШаблоныКЗамене имеет строку:

ИмяПараметраВWord = «МассивЧленыКомиссии» ; Результат(массив) содержит значения: ("Прохоров Сергей Петрович"; "Петров Адрей Федорович"; "Смирнов Антон Викторович")

 

Шаблон:

Члены комиссии

   

<МассивЧленыКомиссии>

 

Результат:

Члены комиссии

   

Прохоров Сергей Петрович

     

Петров Адрей Федорович

     

Смирнов Антон Викторович

 

Жду ваших комментариев и предложений.

Модуль можете использовать для коммерческого использования, однако прошу не удалять ссылку на мои реквизиты.

 

1C отчет шаблон word на сервере сервер xml docx таблица

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122154    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7292    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3537    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177749    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99347    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18113    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28109    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23602    15    15    

32
Вознаграждение за ответ
Показать полностью
Отзывы
15. andrewbc 329 22.03.19 15:55 Сейчас в теме
Дорогой мой человек, спасибо огромное!

Сам начал было этим заниматься, но времени катастрофически в обрез.
Спас.
11 шаблонов за 1 сутки (с учетом адаптации кода под свою задачу - порядка 80-ти рассчитываемых параметров, включая несколько таблиц).
Все отрабатывает шикарно.

Замечания / предложения:
1. В ячейке таблицы только в первой строке остается перенос строк, в остальных перевод строки заменяется на пробел. (Понял, что не доработаны параграфы для дополнительных строк). Считаю, небольшая недоработка.
2. Нужно было вывести картинку - я не стал заморачиваться, в папке "\word\media\" просто перезаписывал файл "image1.jpeg". Понимаю, что нужно через таблицу связей обрабатывать, но времени нет. Может, есть решение?

А в остальном - все ок.
Могу прислать разумную рублевую благодарность после сдачи своего проекта (стукни в личку).
user1027191; Светлый ум; citisoft; AlexK_2012; Alien_job; jONES1979; +6 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4670 04.10.17 23:49 Сейчас в теме
В конфигурации, разработанной нашей конторой по заказу одного госучреждения, прямое потрошение парсинг шаблонов Word для генерации договоров и прочего барахла работает с 2013 года. Только механизм вставки таблиц там довольно слабый. Скорее его нет, чем есть.
2. Automatik 914 07.10.17 07:17 Сейчас в теме
Спасибо! Наверняка пригодится для моей публикации https://infostart.ru/public/595984/
3. sytkosa 119 20.11.17 03:32 Сейчас в теме
С макетами сформированными в формате docx отличным от 2010 office будет работать? Например в макете созданным и сохраненным в 2016 word?
7. artms 282 27.09.18 09:04 Сейчас в теме +10 $m
4. Dimasik2007 430 15.02.18 15:59 Сейчас в теме
(0) Автору спасибо, формируется все быстро. Интгерировал с подсистемой "Печать" БСП. Также добавил возможность вставки картинки в документ (реализовал заменой картинки-эталона в папке media). Тестировал на 2010 офисе.
5. websamson 306 07.06.18 10:27 Сейчас в теме
Спасибо, работает! Только добавьте в описание, что в макете после параметров нужно добавлять пробел, иначе параметр не отображается на печати.
6. XelOla 17 11.09.18 14:59 Сейчас в теме
(5)
макете после параметров нужно добавлять пробел, иначе параметр не отображается на печати.

как это
8. artms 282 27.09.18 09:08 Сейчас в теме
(6) В Word пробел может записываться в XML специальным тегом (не всегда) . В некоторых ситуациях такое возникало, ошибку исправил, но пока не опубликовал решение в виду низкой популярности статьи. Проблема решается в шаблоне удалением строки и добавлением новой или копированием такой, где проблема не возникала.
28. artms 282 26.12.19 09:07 Сейчас в теме
20. artms 282 05.08.19 17:38 Сейчас в теме
9. KRIHA 111 12.11.18 11:05 Сейчас в теме
Спасибо вам большое, гражданин, за проделанную работу. Считаю ваше решение красивым, до сих пор в восторге от волшебства:

Функция СоединитьШаблоны(Теги,ПараметрыЗаполнения)

Всех благ!
P.S.
Использовал в https://infostart.ru/public/937082/
10. allexx 39 24.11.18 16:55 Сейчас в теме
Все хорошо работает. Одна только проблема - это ориентация Ландшафт. На последующих страницах можно вставлять разрывы, а вот как первую страницу заставить быть ландшафтной? Для себя выкрутился с помощью MSWord.Application.Selection.PageSetup.Orientation = 1, но это не совсем правильно. Остальные в портрете все делают что ли?
11. artms 282 21.12.18 15:53 Сейчас в теме
(10) Тестировал в ландшафте, проблем не возникло. Однако возможно рассматривается случай совмещения различных ориентации в одном документе, такой случай не тестировал.
12. allexx 39 22.12.18 15:19 Сейчас в теме
Может быть от версий офиса зависит, но я вроде на разных пробовал и результат один и тот же. Вот такая же проблема описывается https://answers.microsoft.com/en-us/msoffice/forum/all/selectioninsertfile-does-not-preserve-pagesetup/a393e023-6b92-4a91-a58d-3bd55c29c441
Когда дальше стал тестировать, то выяснилось, что и размеры полей берутся по умолчанию, а не из подготовленного документа.
13. artms 282 18.01.19 08:52 Сейчас в теме
(12) Нужны примеры, для исправления, но рейтинг разработки низкий нет смысла поддерживать.
14. user864530 05.02.19 12:25 Сейчас в теме
Вопрос? Как обработка работает с нижним и верхним колонтитулом и вставка разрывы страниц для изменения ориентации страницы в документе.
15. andrewbc 329 22.03.19 15:55 Сейчас в теме
Дорогой мой человек, спасибо огромное!

Сам начал было этим заниматься, но времени катастрофически в обрез.
Спас.
11 шаблонов за 1 сутки (с учетом адаптации кода под свою задачу - порядка 80-ти рассчитываемых параметров, включая несколько таблиц).
Все отрабатывает шикарно.

Замечания / предложения:
1. В ячейке таблицы только в первой строке остается перенос строк, в остальных перевод строки заменяется на пробел. (Понял, что не доработаны параграфы для дополнительных строк). Считаю, небольшая недоработка.
2. Нужно было вывести картинку - я не стал заморачиваться, в папке "\word\media\" просто перезаписывал файл "image1.jpeg". Понимаю, что нужно через таблицу связей обрабатывать, но времени нет. Может, есть решение?

А в остальном - все ок.
Могу прислать разумную рублевую благодарность после сдачи своего проекта (стукни в личку).
user1027191; Светлый ум; citisoft; AlexK_2012; Alien_job; jONES1979; +6 Ответить
16. artms 282 28.03.19 15:13 Сейчас в теме
(15) Спасибо за отзыв.
Извини за недоработки. Пока обновлений нет из-за низкой популярности модуля, возможно будут позднее.
17. as7bs 285 24.07.19 13:00 Сейчас в теме
Добрый день. Подскажите, а можно ли реализовать в цикле вывод повторяющегося текста на отдельных листах? Нужно после основного текста вывести несколько приложений, в каждом текст(Заголовок) и таблица. Количество приложений заранее неизвестно.
18. as7bs 285 24.07.19 19:24 Сейчас в теме
(17) Реализовал, програмно обрабатывая шаблон файла после его загрузки в обработку, точнее ТегиСШаблонами полученные из шаблона файла. В цикле вставляю данные находящиеся между определенными метками в шаблоне(НачалоПовтораПриложений и ОкончаниеПовтораПриложений). Если есть более правильный или красивый вариант буду рад если расскажете.
19. artms 282 29.07.19 09:43 Сейчас в теме
(18) Добрый день. Такая задача не стояла. Делал бы аналогично. Разница могла быть только в реализации.
21. Euroset1 11 06.11.19 11:27 Сейчас в теме
Автору однозначно плюс за, по сути, мануал а ля "быстрый старт" по работе с Open XML. За этим способом, будущее, кстати. Не знаю, почему он так редок в использовании. Например, задача по рассылке сервером по расписанию кадровых документов сотрудникам решается только этим способом.
o.nikolaev; +1 Ответить
22. artms 282 06.11.19 15:35 Сейчас в теме
(21) На самом деле речь шла не о мануале, а о модуле, который решает проблемы: разбиение строки шаблона в xml, и заполнение таблиц Word.
23. Euroset1 11 06.11.19 20:41 Сейчас в теме
(22) если отказаться от спецсимволов и вводить в шаблон теги монотонно без копипоста и за один раз типа ДатаПолученияДоговора или НомерСтроки, то этот текст будет лежать в одном теге гарантированно. Мне норм. Не вижу основания использовать скобки для тегов теперь, обладая этими экспериментальными данными =)
24. artms 282 13.11.19 17:21 Сейчас в теме
(23) 1. Увы это не так, зависит от настроек авто форматирования, выделения ошибок и ещё чего то, что ещё не выяснил.
2. И опять же упустили момент вывода таблиц (могу добавлять строки из массива).
3. По Т.З. на создание модуля нужно было дать возможность через БСП изменять макет клиенту, увы ваш вариант на это не способен. Клиент легко разделит вам шаблон. Пробовал указанный способ, но увы Word и другие редакторы, обожают разбивать целые слова на части, что делает сложным настройку даже разработчику (потратил на эту схему прямой замены много часов, поскольку сложно найти обрубок шаблона в xml, а затем убрать лишние теги, которых часто не оправдано много).
29. odinassdeveloper 28.01.20 15:59 Сейчас в теме
(24)
увы Word и другие редакторы, обожают разбивать целые слова на части


вы имеете ввиду, что в исходном шаблоне *.docx текст типа "Оплата заказ не позднее [ДатаПолученияДоговора]" может быть раскидан частями по нескольким узлам XML в зависимости от того, как пользовтель оформлял шаблон?
30. artms 282 29.01.20 12:44 Сейчас в теме
(29) Не только. В Word есть проверка на грамматику и часть слова может быть выделена в отдельный блок, самим Word(ом).
25. o.nikolaev 211 19.11.19 18:41 Сейчас в теме
Подскажите, а если надо выполнять подстановку в колонтитулах, то аналогичным образом надо вначале разбирать xml в таблицу значений, а потом собирать?
26. artms 282 22.11.19 14:25 Сейчас в теме
(25) Такая задача не стояла, но посмотрел что необходимо сделать. Сейчас собирается разбирается только файл document.xml, а колонтитулы находятся в header1.xml,header2.xml,header3.xml. Предлагаю проверять наличие и менять аналогично document.xml файлы header1.xml,header2.xml,header3.xml.
По договоренности, могу сделать указанную доработку.
27. o.nikolaev 211 24.11.19 16:50 Сейчас в теме
(26) Спасибо. В конечном счете, все-таки стал использовать функции БСП. Если кому интересно, то в БСП 3.0 куча ошибок, которая нормально с форматом Open Office работать не позволяла. Но. С помощью расширения часть функций была взята из 3.01. После этого работа с шаблонами подстановки вида {v8 НомерДокумента} и пр. заработала нормально. Даже с заголовками, даже с фигурами и текстом в фигурах.

Но, при выводе многострочного блока - например табличной части - подглючивает, выдает сообщение типа "Документ неожиданно поврежден. Восстановить его средствами Microsoft Word?" при выборе "Да", вроде все открывается нормально. Причем в БСП 3.1 эта ошибка происходит прямо на демо-базе БСП. Но тем не менее, документ, в конечном счете, формируется без видимых повреждений.
31. archt 10 12.05.20 13:30 Сейчас в теме
Я правильно понимаю: установленный Microsoft Word не нужен?
Код открыт?
32. artms 282 15.05.20 17:12 Сейчас в теме
(31) Да все верно. "Модуль можете использовать для коммерческого использования, однако прошу не удалять ссылку на мои реквизиты."
33. archt 10 15.05.20 21:28 Сейчас в теме
34. suepifanov 940 07.09.20 13:49 Сейчас в теме
Подскажите пожалуйста - у меня в строке таблице в одной ячейке нужно использовать 2 параметра, например <МассивНоменклаутра> <МассивПроизводитель>. В таком случае первая строка выводится корректно, а вот дальше выводится только последний параметр <МассивПроизводитель>.
Это баг, или использование таких конструкций и не предполагалось?
35. artms 282 10.09.20 11:10 Сейчас в теме
(34) Для вывода колонки таблицы нужен массив с готовыми значениями. Вам следует подготовить одну переменную массив с собранными значениями или выводить только одно значение, которое будет выведено только в первой строке тогда там может быть и две переменные.
36. Ivon 673 28.10.20 19:05 Сейчас в теме
Спасибо, хорошая обработка. В процессе использования нашел некоторые моменты:
1) самый основной - нельзя передать разрыв строки.Символы.ПС не работает, Символ(11) выдает ошибку XML.Так же пробовал другие варианты - рабочего не нашел.
2) иногда параметр разбивается на 3 части в разных тегах: скобки отдельно, имя параметра внутри скобок отдельно. В результате такой параметр в шаблоне не определяется и не заполняется, хотя с этим и можно бороться разными методами
38. Ivon 673 29.10.20 15:23 Сейчас в теме
(36) Запилил разрыв строки по Символы.ПС.
Ваш код в функции ЗаполнитьШаблоны
			// Добавим сведенья для вставки параграфов вместо символов перевода строки.
			МассивСПереводамиСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекстКОбработке,Символы.ПС);
			Если МассивСПереводамиСтрок.Количество() Тогда
				РезультатСтрока.Текст = МассивСПереводамиСтрок[0];
			Иначе
				РезультатСтрока.Текст = ТекстКОбработке;
			КонецЕсли;
			Для СчП = 1 по МассивСПереводамиСтрок.Количество() -1  Цикл
				ПараграфыКДобавлению.Добавить(МассивСПереводамиСтрок[СчП]);
			КонецЦикла;
Показать

заменил следующим кодом
			// Добавим сведенья для вставки параграфов вместо символов перевода строки.
			МассивСПереводамиСтрок = РазобратьСтроку(ТекстКОбработке,Символы.ПС, Ложь, Истина);
			РезультатСтрока.Текст = МассивСПереводамиСтрок[0];
			Если МассивСПереводамиСтрок.Количество() > 1 Тогда
				Для СчП = 1 по МассивСПереводамиСтрок.Количество() - 1  Цикл
					СтрокаРазрыв = Результат.Добавить();
					СтрокаРазрыв.Имя = ТегРазрывСтроки();
					СтрокаРазрыв.Атрибуты = Новый Соответствие;
					СтрокаРазрыв.ТипУзла = ТипУзлаXML.НачалоЭлемента;
					СтрокаРазрыв.Текст = "";
					СтрокаРазрывКонец = Результат.Добавить();
					СтрокаРазрывКонец.Имя = ТегРазрывСтроки();
					СтрокаРазрывКонец.Атрибуты = Неопределено;
					СтрокаРазрывКонец.ТипУзла = ТипУзлаXML.КонецЭлемента;
					СтрокаРазрывКонец.Текст = "";
					СледСтрока = Результат.Добавить();
					СледСтрока.Имя = ТегРазрывСтроки();
					СледСтрока.Атрибуты = Новый Соответствие;
					СледСтрока.ТипУзла = ТипУзлаXML.Текст;
					СледСтрока.Текст = МассивСПереводамиСтрок[СчП];
				КонецЦикла;
			КонецЕсли;
Показать

Поскольку функции РазложитьСтрокуВМассивПодстрок у меня нет, а в интернете есть разные варианты этой функции, я заменил ее на свою функцию РазобратьСтроку
Функция РазобратьСтроку(_Строка, _Разделитель, _УдалятьПустые = Истина, _Массив = Ложь) Экспорт
	Если _Массив Тогда
		Результат = Новый Массив;
	Иначе
		Результат = Новый СписокЗначений;
	КонецЕсли;
	Если НЕ _Разделитель = Символы.ПС Тогда
		_т = СтрЗаменить(_Строка, _Разделитель, Символы.ПС);
	КонецЕсли;
	СтрокаИДПустыхСтрок = СтрЗаменить(Строка(Новый УникальныйИдентификатор()) + Строка(Новый УникальныйИдентификатор()), "-", "");
	Если не _УдалятьПустые Тогда
		_т = СтрЗаменить(_Строка, Символы.ПС, СтрокаИДПустыхСтрок + Символы.ПС + СтрокаИДПустыхСтрок);
	КонецЕсли;
	Для Строк = 1 по СтрЧислоСтрок(_т) Цикл
		СтрЗначение = СтрЗаменить(СтрПолучитьСтроку(_т, Строк), СтрокаИДПустыхСтрок, "");
		Если СтрДлина(СтрЗначение) = 0 Тогда
			Если не _УдалятьПустые Тогда
				Результат.Добавить(СтрЗначение);
			КонецЕсли;
		Иначе
			Результат.Добавить(СтрЗначение);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
КонецФункции
Показать

СтрокаИДПустыхСтрок добавляется к Символы.ПС с двух сторон из-за того, что СтрЧислоСтрок не учитывает строки нулевой длины.
39. Ivon 673 30.10.20 11:43 Сейчас в теме
Нашел у себя ошибку в функции РазобратьСтроку
Код
    Если не _УдалятьПустые Тогда
        _т = СтрЗаменить(_Строка, Символы.ПС, СтрокаИДПустыхСтрок + Символы.ПС + СтрокаИДПустыхСтрок);
    КонецЕсли;

нужно заменить на
    Если не _УдалятьПустые Тогда
        _т = СтрЗаменить(_т, Символы.ПС, СтрокаИДПустыхСтрок + Символы.ПС + СтрокаИДПустыхСтрок);
    КонецЕсли;
41. Ivon 673 30.10.20 13:59 Сейчас в теме
(38) В общем, там еще в одном месте косяк с функцией.
Вот окончательный код (я надеюсь)
Функция РазобратьСтроку(_Строка, _Разделитель, _УдалятьПустые = Истина, _Массив = Ложь) Экспорт
	Если _Массив Тогда
		Результат = Новый Массив;
	Иначе
		Результат = Новый СписокЗначений;
	КонецЕсли;
	Если _Разделитель = Символы.ПС Тогда
		_т = _Строка;
	Иначе
		_т = СтрЗаменить(_Строка, _Разделитель, Символы.ПС);
	КонецЕсли;
	СтрокаИДПустыхСтрок = СтрЗаменить(Строка(Новый УникальныйИдентификатор()) + Строка(Новый УникальныйИдентификатор()), "-", "");
	Если не _УдалятьПустые Тогда
		_т = СтрЗаменить(_т, Символы.ПС, СтрокаИДПустыхСтрок + Символы.ПС + СтрокаИДПустыхСтрок);
	КонецЕсли;
	Для Строк = 1 по СтрЧислоСтрок(_т) Цикл
		СтрЗначение = СтрЗаменить(СтрПолучитьСтроку(_т, Строк), СтрокаИДПустыхСтрок, "");
		Если СтрДлина(СтрЗначение) = 0 Тогда
			Если не _УдалятьПустые Тогда
				Результат.Добавить(СтрЗначение);
			КонецЕсли;
		Иначе
			Результат.Добавить(СтрЗначение);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
КонецФункции
Показать
37. Ivon 673 29.10.20 14:14 Сейчас в теме
Переделал функцию ЗаполнитьШаблоны. В вашей реализации, если в параметр подставляется большой текст, то функция в цикле лопатит каждую букву уже замененного текста так как у вас перебор строки идет от первой буквы к последней. Изменил алгоритм, чтобы строка перебиралась с конца, в результате получил прирост в скорости заполнения.
У вас вот так:
		Если РезультатСтрока.ТипУзла = ТипУзлаXML.Текст  Тогда
			
			ТекстКОбработке = РезультатСтрока.Текст;
			
			Для СчП = 1 по СтрДлина(ТекстКОбработке) Цикл
				Если Сред(ТекстКОбработке,СчП,1) =  ПараметрыЗаполнения.РазделительЛевый Тогда
					НомерСимволаНачало = СчП;
				КонецЕсли;
				Если Сред(ТекстКОбработке,СчП,1) =  ПараметрыЗаполнения.РазделительПравый Тогда
					
					ШаблонКЗамене = Сред(ТекстКОбработке,НомерСимволаНачало,СчП-НомерСимволаНачало+1);
					ШаблонКПоиску = Сред(ТекстКОбработке,НомерСимволаНачало+1,СчП-НомерСимволаНачало-1);
Показать

Я сделал вот так
			ТекстКОбработке = РезультатСтрока.Текст;
			ДлинаСтроки = СтрДлина(ТекстКОбработке);
			Для СчП = 0 по ДлинаСтроки - 1 Цикл
				Если Сред(ТекстКОбработке,ДлинаСтроки - СчП,1) =  ПараметрыЗаполнения.РазделительПравый Тогда
					НомерСимволаКонец = ДлинаСтроки - СчП;
				КонецЕсли;
				Если Сред(ТекстКОбработке,ДлинаСтроки - СчП,1) =  ПараметрыЗаполнения.РазделительЛевый Тогда
					НомерСимволаНачало = ДлинаСтроки - СчП;
					ШаблонКЗамене = Сред(ТекстКОбработке, НомерСимволаНачало,НомерСимволаКонец-НомерСимволаНачало+1);
					ШаблонКПоиску = Сред(ТекстКОбработке,НомерСимволаНачало+1,НомерСимволаКонец-НомерСимволаНачало-1);
Показать
40. ylyas 25 30.10.20 12:06 Сейчас в теме
ни фига не понимаю.. зачем вы придумываете велосипед.
1С уже все реализовала за вас. Надо только разобраться как этим пользоваться.
Простой шаблон у меня получилось заполнить. где есть одна большая область.
А вот как получать и заполнять вложенные области я пока не смог разобраться...
42. Ivon 673 30.10.20 14:00 Сейчас в теме
(40) Вы про обычные печатные формы на основе табличного документа?
44. ylyas 25 30.10.20 17:16 Сейчас в теме
(42)
я говорю про вывод вордовского документа параметрами подстановки без использования COM-а.
идет разбор document.xml и других вспомогательных файлов
Все уже написано, господа!!
43. suepifanov 940 30.10.20 14:21 Сейчас в теме
(40) в типовой бсп был другой способ, не разбор хмл. В свежей версии что-то поменялось?
45. ylyas 25 30.10.20 17:18 Сейчас в теме
(43)
я сам был не реально удивлен, когда столкнулся с этим вопросом и нашел такой интересный ответ.
Они даже расширение файла сами определяют по сигнатурам двоичных данных!!!
Кто то в 1с пришел прям из системных языков программирования как будто ))
57. user1434357 3 28.12.20 20:56 Сейчас в теме
(47)
(45)
(44)

Почитал статью на ИТС ниже, честно говоря не совсем понял как конкретно можно создать печатную форму. Именно для веб-клиента или фреша такой способ подойдет? Есть еще информация по теме? И где ты в итоге нашел ответ? уточни пжл
58. user1434357 3 28.12.20 22:47 Сейчас в теме
(45)
И еще такой момент, вроде из БСП получается распечатать шаблон, но только в EI. В Хроме никак. Или у меня что-то не то? Сначала выходила ошибка, что каталог для сохранения файла не указан, я в модуле дописал его, после этого выходит ошибка "Расширение для работы с файлами не подключено". Прямо из коробки в любом браузере не получится распечатать макет?
46. FatPanzer 30.10.20 17:31 Сейчас в теме
47. ylyas 25 30.10.20 17:34 Сейчас в теме
(46)
ну вот коллеги не знали.. я им рассказываю ))
48. suepifanov 940 30.10.20 17:42 Сейчас в теме
(47) поискал на итс, не нашел информации.
Год назад где-то писал печать КП - в итоге отказались из-за тормозов. Если теперь печатается разбором, то очень круто)
51. suepifanov 940 30.10.20 18:34 Сейчас в теме
(50)
Многие документы и списки программы имеют свои печатные формы. Печатные формы могут формироваться в виде табличных документов или офисных документов в формате Office Open XML. Внешний вид и состав печатных форм можно настраивать, не внося изменений в программу. У документа или списка могут быть также внешние печатные формы.

Печатные формы в виде табличного документа можно сохранить в папку на компьютере или отправить по почте как вложения в любом из популярных форматов, включая документы Microsoft Word, OpenOffice.org Writer, PDF/A, HTML, Microsoft Excel, в формате табличного документа 1С:Предприятие MXL). При этом не требуется, чтобы эти программы были установлены на компьютере.
52. FatPanzer 30.10.20 18:40 Сейчас в теме
(50) Работает как обычный разбор XML и поиск областей, области в Worde надо размечать, как и в табличном документе...

А я тут пытаюсь уйти от разметки и прийти к полностью динамическому формированию, включая допвозможности, которых в жестком размеченном шаблоне не добиться...
https://infostart.ru/public/1293794/
Пока полет нормальный.
53. Ivon 673 30.10.20 19:50 Сейчас в теме
(49) Посмотрел. Мне не подходит. У меня самописная конфа, которая у некоторых работает на версии ниже 8.3.10. Плюс к этому туда надо еще и интегрировать БСП.
54. FatPanzer 30.10.20 19:55 Сейчас в теме
(53) На самом деле БСП там сбоку припека - только для управления автоматическими подключаемыми командами печати. А так-то там есть и API по которому можно передав свои параметры своим кодом получить итоговые двоичные данные вордовского файла. То есть можно легко свой клиентско-командный обвес нарисовать рядом на это ядро.
55. matashin 10.11.20 20:52 Сейчас в теме
ЗаполнитьШаблоны работает неправильно, если в 1 строке несколько параметров и при вставке значения строка сильно увеличивается в размере, Цикл то не в курсе, что длина строки изменилась.
56. matashin 10.11.20 21:44 Сейчас в теме
Не меняя направления обхода поправил ошибку, не работает обработка шаблона, если параметры идут один за другим и при вставке первых строка становится значительно длиннее исходного значения (цикл обхода кончается раньше, чем строка, заменил цикл Для на цикл Пока)

			
ТекстКОбработке = РезультатСтрока.Текст;
			
			НачатьСНачала = Ложь;
			СчП = 1;
			Пока СчП <= СтрДлина(ТекстКОбработке) Цикл
					
				Если Сред(ТекстКОбработке,СчП,1) =  ПараметрыЗаполнения.РазделительЛевый Тогда
					НомерСимволаНачало = СчП;
				КонецЕсли;
				Если Сред(ТекстКОбработке,СчП,1) =  ПараметрыЗаполнения.РазделительПравый Тогда
					
					ШаблонКЗамене = Сред(ТекстКОбработке,НомерСимволаНачало,СчП-НомерСимволаНачало+1);
					ШаблонКПоиску = Сред(ТекстКОбработке,НомерСимволаНачало+1,СчП-НомерСимволаНачало-1);
					
					МассивСтрок = ШаблоныКЗамене.НайтиСтроки(Новый Структура("ИмяПараметраВWord",ШаблонКПоиску));
					
					Если МассивСтрок.Количество() Тогда
						
						ТекстРезультат = МассивСтрок[0].Результат;
						Если ТипЗнч(МассивСтрок[0].Результат) = Тип("Массив") Тогда
							Если ФлСтрокаТаблицы И (МассивСтрок[0].Результат.Количество()>1) Тогда
								
								// Первую строку заполняем как обычный строковый результат.
								ТекстРезультат = МассивСтрок[0].Результат[0];
								
								// Остальные заносим в ТЗ к заполнению.
								Для СчСтрок = 2 по МассивСтрок[0].Результат.Количество() Цикл
									Если ТаблицаСтрокКДобавлению.Количество() < СчСтрок-1 Тогда
										ТаблицаСтрокКДобавлению.Добавить();
									КонецЕсли;
									ТаблицаСтрокКДобавлению[СчСтрок - 2]["Колонка"+КолВоКолонокВСтроке] = МассивСтрок[0].Результат[СчСтрок -1];
								КонецЦикла;
								
							Иначе
								ТекстРезультат ="";
								
								Для Каждого ЭлементМассива из МассивСтрок[0].Результат Цикл
									ТекстРезультат = ТекстРезультат + ?(ТекстРезультат ="","","; ")+ ЭлементМассива;
								КонецЦикла;
								
							КонецЕсли;
						КонецЕсли;
						
						ТекстКОбработке = СтрЗаменить(ТекстКОбработке,ШаблонКЗамене,ТекстРезультат);
					Иначе
						
						Сообщить("Параметр:" + ШаблонКЗамене+"  не указан в настройке.");
						ТекстКОбработке = СтрЗаменить(ТекстКОбработке,ШаблонКЗамене,"");
						
					КонецЕсли;
					
					Если НомерСимволаНачало <> 0 Тогда
						СчП = НомерСимволаНачало;
						НачатьСНачала = Истина;
						НомерСимволаНачало = 0;
					КонецЕсли;
					
				КонецЕсли;
				
				Если НачатьСНачала Тогда
					НачатьСНачала = Ложь;
				Иначе	
					СчП = СчП + 1;
				КонецЕсли; 
				
			КонецЦикла;
Показать
59. zannv 85 23.01.21 23:33 Сейчас в теме
Есть ли решение для случая, когда параметр - это картинка?
60. artms 282 11.02.21 15:47 Сейчас в теме
(59) В случае когда необходимо вставить картинку можно сделать заготовку с картинкой, имена идентичные, вставляются копированием. У меня уже реализовано. Но пока не делал обновление.
61. Алексей777 92 28.04.21 15:38 Сейчас в теме
Приветствую, Михаил. Интересно, в БСП АПИ по работе с данной серией формата (Office Open XML) менее универсальный и охватывающий возможности редактирования, чем в Вашем решении? Или Ваше решение превосходит в функциональности и возможностях АПИ БСП (текущих версий)?
62. Алексей777 92 28.04.21 15:39 Сейчас в теме
В, частности, вставки картинки, например, :).
63. Алексей777 92 28.04.21 18:22 Сейчас в теме
Посмотрел АПИ БСП и вывел на его основе под свои потребности печатные формы .docx. Тоже, отлично у 1С написано: https://its.1c.ru/db/bsp314doc - Глава 4. - Печать.
64. Алексей777 92 28.04.21 18:30 Сейчас в теме
Первый раз прочитал комменты по диагонали :). Сейчас, перечитал и увидел, что выше Ребята уже писали про ф-л из БСП.
65. Алексей777 92 28.04.21 18:31 Сейчас в теме
Всё равно, Автору - РЕСПЕКТ и Спасибо, за труд!
66. BigB 191 25.03.22 07:10 Сейчас в теме
Скачал обработку версии 1.0.2.
При нажатии кнопки "Вывести макет" всегда пишет:
Параметр:<ПримерОшибки>  не указан в настройке.

Проверил Макет. Нет там такого поля.
Не пойму откуда лезет эта ошибка.
Версия платформы: 8.3.18.1741
Версия Word 2016: 16.0.4266.1001 (64-разрядная)
67. artms 282 20.04.22 11:45 Сейчас в теме
(66) То что в Word можно много скрыть это верно. Поэтому предлагаю деля макет на части найти ту часть где есть эта ошибка или самому переименовать документ в zip и посмотреть состав файла по моему document.xml
68. alk68 04.05.22 10:18 Сейчас в теме
Параметры для таблиц он разбирает по типу Параметр:[ J ] не указан в настройке.

Как это вылечить? в чем может быть причина. При чем что интересно. Если я поменяю "[" "]" на "{" "}" то он склеит параметры но при этом выводит только первую строку из таблицы. Кто нибудь сталкивался с подобной проблемой. Спасибо
69. artms 282 05.06.22 13:24 Сейчас в теме
(68) Да вылечить можно указав параметр, возможно поможет удалить добавить таблицу. Дело в том что сам док это xml с тегами возможно тутда вкралось что то из-за новведений в форматировании.
70. Snap) 02.11.22 15:19 Сейчас в теме
Все отлично работает, но появилась задача заполнения сложной таблицы, где в одной ячейке может динамический формироваться несколько горизонтальных ячеек. Кто нибудь сталкивался с таким ?
71. owner2005 4 24.07.23 21:22 Сейчас в теме
Во-первых большое спасибо автору за труд и качественный код.

Вопрос такой- как сделать разрыв страницы, добавить тег и получить разрыв, без добавления лишних стилей и строчек в settings.xml?
Всё, что есть уже просмотрел по этой теме..

Кац предлагает сдаться.
73. user1027191 29.08.23 12:22 Сейчас в теме
(71) Наверное уже поздновато, но я просто в шаблоне через ctrl+enter добавлял разрыв.
75. owner2005 4 29.08.23 22:29 Сейчас в теме
(73) Штука в том что шаблон может тоже
динамически формироваться и разрывы необходимо устанавливать в произвольных местах шаблона. Каждый раз в разных.
72. user1027191 08.08.23 15:57 Сейчас в теме
Добрый день. Шикарная штука, но столкнулся с проблемой при переносе в собственный документ. Нумерация тегов сбилась на тип "строка", вместо "число", в итоге формировался документ с хаотично расставленными тегами. Моя ошибка была в том, что я перенёс перенёс нужный код в модуль объекта новосозданного документа, а реквизит "номер" строкового типа там уже был.... Дело было в этом куске:

Функция СоединитьШаблоны(Теги,ПараметрыЗаполнения)
	
	Результат = Теги.Скопировать();
	Результат.Колонки.Добавить("Номер");
	
	Номер = 0;
	Для каждого Тег Из Результат Цикл
		Номер = Номер + 1;
		Тег.Номер = Номер;
	КонецЦикла;

//Продолжается код функции...

КонецФункции

Показать


Заменил на:

Функция СоединитьШаблоны(Теги,ПараметрыЗаполнения)
	
	Результат = Теги.Скопировать();
	Результат.Колонки.Добавить("Номер");
	
	НомерТега = 0;
	Для каждого Тег Из Результат Цикл
		НомерТега = НомерТега + 1;
		Тег.Номер = НомерТега;
	КонецЦикла;

//Продолжается код функции...

КонецФункции

Показать


Косяк, конечно, мой, но вдруг кому поможет, и сэкономит время.
74. user1027191 29.08.23 14:49 Сейчас в теме
Если кому-то нужно всобачить своё изображение. Извращение, конечно, но на скорую руку...

&НаСервере
    Функция ВывестиМакетНаСервере() 

        //До этого момента стандартный код функции
	
	//Преобразуем наш временный .docx файл в .zip 
	НовыйЗИП = СтрЗаменить(ВременныйФайл,"docx","zip");
	ПереместитьФайл(ВременныйФайл,НовыйЗИП); 
	
	
	//Находим каталог, где творится волшебство 
	ДиректорияАрхивирования = Лев(НовыйЗИП,СтрНайти(НовыйЗИП,"\",НаправлениеПоиска.СКонца));
	
	//Создаём в нём дополнительный каталог
	СоздатьКаталог(ДиректорияАрхивирования+"DA");
	
	//Извлекаем в него наш .zip 
	Архив = Новый ЧтениеZipФайла(НовыйЗИП,"");
        Архив.ИзвлечьВсе(ДиректорияАрхивирования+"DA",РежимВосстановленияПутейФайловZIP.Восстанавливать);
	
	//Заменяем изображение (Объект.ФайлШапки - путь к файлу, который нужно подменить)
	КопироватьФайл(Объект.ФайлШапки,ДиректорияАрхивирования+"DA"+"\word\media\image1.jpg");
	
	//Снова архивируем
	НовыйАрхив = Новый ЗаписьZipФайла(ДиректорияАрхивирования+"DA"+"\DI.zip","",,МетодСжатияZIP.Копирование);
	НовыйАрхив.Добавить(ДиректорияАрхивирования+"DA\*.*",РежимСохраненияПутейZIP.СохранятьОтносительныеПути, 
        РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);	
	НовыйАрхив.Записать();
	
	//Возвращаем временный файл, меняя расширение с .zip на .docx
	КопироватьФайл(ДиректорияАрхивирования+"DA"+"\DI.zip",ВременныйФайл);
	
	//Удаляем лишнее
	УдалитьФайлы(ДиректорияАрхивирования+"DA");  
	УдалитьФайлы(НовыйЗИП);
	
	//Дальше стандартный код
	
	//Результат - Структура имеет параметр "АдресХранилища" и параметры файла такие как размер, расширение
	Результат = ОбработкаОбъект.ОбработатьФайлDocx(
	ВременныйФайл,
	ПараметрыЗаполненияШаблона,
	ДанныеКВыводу
	);
	
	Возврат Результат;

КонецФункции
Показать
Оставьте свое сообщение