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

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

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

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

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

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

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

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

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

Всех благ!
P.S.
Использовал в https://infostart.ru/public/937082/
10. allexx 38 24.11.18 16:55 Сейчас в теме
Все хорошо работает. Одна только проблема - это ориентация Ландшафт. На последующих страницах можно вставлять разрывы, а вот как первую страницу заставить быть ландшафтной? Для себя выкрутился с помощью MSWord.Application.Selection.PageSetup.Orientation = 1, но это не совсем правильно. Остальные в портрете все делают что ли?
11. artms 234 21.12.18 15:53 Сейчас в теме
(10) Тестировал в ландшафте, проблем не возникло. Однако возможно рассматривается случай совмещения различных ориентации в одном документе, такой случай не тестировал.
12. allexx 38 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 234 18.01.19 08:52 Сейчас в теме
(12) Нужны примеры, для исправления, но рейтинг разработки низкий нет смысла поддерживать.
14. user864530 05.02.19 12:25 Сейчас в теме
Вопрос? Как обработка работает с нижним и верхним колонтитулом и вставка разрывы страниц для изменения ориентации страницы в документе.
15. andrewbc 291 22.03.19 15:55 Сейчас в теме
Дорогой мой человек, спасибо огромное!

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

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

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


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

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

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

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

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

нужно заменить на
    Если не _УдалятьПустые Тогда
        _т = СтрЗаменить(_т, Символы.ПС, СтрокаИДПустыхСтрок + Символы.ПС + СтрокаИДПустыхСтрок);
    КонецЕсли;
41. Ivon 659 30.10.20 13:59 Сейчас в теме
(38) В общем, там еще в одном месте косяк с функцией.
Вот окончательный код (я надеюсь)
Функция РазобратьСтроку(_Строка, _Разделитель, _УдалятьПустые = Истина, _Массив = Ложь) Экспорт
	Если _Массив Тогда
		Результат = Новый Массив;
	Иначе
		Результат = Новый СписокЗначений;
	КонецЕсли;
	Если _Разделитель = Символы.ПС Тогда
		_т = _Строка;
	Иначе
		_т = СтрЗаменить(_Строка, _Разделитель, Символы.ПС);
	КонецЕсли;
	СтрокаИДПустыхСтрок = СтрЗаменить(Строка(Новый УникальныйИдентификатор()) + Строка(Новый УникальныйИдентификатор()), "-", "");
	Если не _УдалятьПустые Тогда
		_т = СтрЗаменить(_т, Символы.ПС, СтрокаИДПустыхСтрок + Символы.ПС + СтрокаИДПустыхСтрок);
	КонецЕсли;
	Для Строк = 1 по СтрЧислоСтрок(_т) Цикл
		СтрЗначение = СтрЗаменить(СтрПолучитьСтроку(_т, Строк), СтрокаИДПустыхСтрок, "");
		Если СтрДлина(СтрЗначение) = 0 Тогда
			Если не _УдалятьПустые Тогда
				Результат.Добавить(СтрЗначение);
			КонецЕсли;
		Иначе
			Результат.Добавить(СтрЗначение);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
КонецФункции
Показать
37. Ivon 659 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 659 30.10.20 14:00 Сейчас в теме
(40) Вы про обычные печатные формы на основе табличного документа?
44. ylyas 25 30.10.20 17:16 Сейчас в теме
(42)
я говорю про вывод вордовского документа параметрами подстановки без использования COM-а.
идет разбор document.xml и других вспомогательных файлов
Все уже написано, господа!!
43. suepifanov 451 30.10.20 14:21 Сейчас в теме
(40) в типовой бсп был другой способ, не разбор хмл. В свежей версии что-то поменялось?
45. ylyas 25 30.10.20 17:18 Сейчас в теме
(43)
я сам был не реально удивлен, когда столкнулся с этим вопросом и нашел такой интересный ответ.
Они даже расширение файла сами определяют по сигнатурам двоичных данных!!!
Кто то в 1с пришел прям из системных языков программирования как будто ))
57. user1434357 1 28.12.20 20:56 Сейчас в теме
(47)
(45)
(44)

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

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

А я тут пытаюсь уйти от разметки и прийти к полностью динамическому формированию, включая допвозможности, которых в жестком размеченном шаблоне не добиться...
https://infostart.ru/public/1293794/
Пока полет нормальный.
53. Ivon 659 30.10.20 19:50 Сейчас в теме
(49) Посмотрел. Мне не подходит. У меня самописная конфа, которая у некоторых работает на версии ниже 8.3.10. Плюс к этому туда надо еще и интегрировать БСП.
54. FatPanzer 13 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 61 23.01.21 23:33 Сейчас в теме
Есть ли решение для случая, когда параметр - это картинка?
60. artms 234 11.02.21 15:47 Сейчас в теме
(59) В случае когда необходимо вставить картинку можно сделать заготовку с картинкой, имена идентичные, вставляются копированием. У меня уже реализовано. Но пока не делал обновление.
61. Алексей777 68 28.04.21 15:38 Сейчас в теме
Приветствую, Михаил. Интересно, в БСП АПИ по работе с данной серией формата (Office Open XML) менее универсальный и охватывающий возможности редактирования, чем в Вашем решении? Или Ваше решение превосходит в функциональности и возможностях АПИ БСП (текущих версий)?
62. Алексей777 68 28.04.21 15:39 Сейчас в теме
В, частности, вставки картинки, например, :).
63. Алексей777 68 28.04.21 18:22 Сейчас в теме
Посмотрел АПИ БСП и вывел на его основе под свои потребности печатные формы .docx. Тоже, отлично у 1С написано: https://its.1c.ru/db/bsp314doc - Глава 4. - Печать.
64. Алексей777 68 28.04.21 18:30 Сейчас в теме
Первый раз прочитал комменты по диагонали :). Сейчас, перечитал и увидел, что выше Ребята уже писали про ф-л из БСП.
65. Алексей777 68 28.04.21 18:31 Сейчас в теме
Всё равно, Автору - РЕСПЕКТ и Спасибо, за труд!
Оставьте свое сообщение
Вопросы с вознаграждением