Подключаемые печатные формы с .DOCX макетом без Word'а

11.06.19

Учетные задачи - Печатные формы

Данная обработка является подключаемой печатной формой в docx, своего рода шаблоном для удобного и быстрого выпуска новых печатных форм на основе docx макета. При этом не требуется установленный word.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Пример подключаемой печатной формы.
.epf 85,24Kb ver:2.1
90 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

ДЛЯ ЧЕГО/КОМУ ЭТО НУЖНО:

Если в вашей компании есть некий корпоративный стиль, дизайнеры и их не устраивает как выглядят ваши отчеты сверстаные на табличных документах в 1с - они могут вам предложить использовать другой выходной формат. Первыми на ум приходит pdf, html и word.

  1. pdf макеты не очень удобны в редактировании.
  2. html это скорее для вебсервисов и отчетов на почту.
  3. Остается word.

Эта обработка призвана послужить шаблоном для создания подключаемой печатной формы с участием docx макета (внимание, просто ".doc" - обладает совершенно отличным, бинарным, протоколом и в статье не рассматривается), при этом не используя COMОбъект("Word.Application").

Она может может выдавать Word документ ко всем выделенным через CTRL || SHIFT объектам. Параметры задаются на макете довольно просто - выделяются определенным цветом, а также потдерживается обращение через точку прям в макете: Сотрудник.ФизическоеЛицо.Фамилия  (в будующем планирую добавить возможность склонения и форматирования параметра прям в макете). В обработку без изменений включена функция daСклонение, за что огромное спасибо её создателю - Михаилу Андропову, её создателю.

 

ЕСЛИ ЛЕНЬ ЧИТАТЬ И НАДО ДЕЛАТЬ:

  1. Изменяете имя и синоним обработки
  2. Изменяете тип данных реквизита СсылкаНаОбъект
  3. Заменяете макет макет_docx своим docx макетом, где фон параметров выделен цветом RED
  4. В модуле объекта редактируете процедуру ПолучитьПараметрыЗаполнения под себя (возвращает структуру, где ключи соответсвуют названиям параметров в макете.
  5. Сохраняете, пользуете, you are looking sweet now *__*

 

ЧТО К ЧЕМУ:

В обработке, в модуле объекта есть две процедуры и функции, с которых следует начать её рассмотрение

  • ПолучитьИнформациюОбОбработке

Функция возвращает структуру со всеми необходимыми значениями для подключения её как дополнительной обработки.

Все данные берутся из метаданных обработки (Имя, Синоним, Комментарий), Назначение обработки берется из массива типов реквизита СсылкаНаОбъект (в публикации это Справочник.Сотрудники и Документ.Увольнение)

 

  • ПолучитьПараметрыЗаполнения

Функция на входе получает ссылку на объект отправленный на печать, а возвращает структуру со всеми необходимыми параметрами для заполнения макета (Ключ значения в структуре должен соответствовать параметру в макете). По сути именно в этой функции вы делаете необходимые запросы для заполнения результирующей структуры, которая будет выведена на печать.

 

Как работает формирование документа после вызова на печать:

  1. Типовой механизм БСП получает информацию об обработке из экспортной функции СведенияОВнешнейОбработке()
  2. Запускает на клиенте в модуле основной формы экспортную процедуру Печать
  3. Процедура обращается на сервер и запускает функцию модуля объекта СформироватьДокументы (возвращает массив двоичных данных для сохранения на клиенте)
  4. Получаем данные для заполнения печатной формы из функции ПолучитьПараметрыЗаполнения
  5. Начинаем заполнение макета в функции возвращающей двоичные данные и имя документа - ЗаполнитьМакет
  6. Извлекаем макет в папку с временными файлами (разархивируя docx на составные xml файлы)
  7. Перебираем полученные xml файлы в поисках параметров, разбирая DOM с помощью разыменователя и выражения XPath "descendant::w:r/w:rPr/w:highlight[@w:val='{ВАШ ЦВЕТ}']/../../w:t"
  8. Найденные узлы с параметрами макета заполняем из созданой ранее структуры с параметрами.
  9. Собираем назад docx документ из xml файлов.
  10. Отдаем данные на клиент, сохраняем во временные файлы, открываем.

Возможно это звучит несколько запутано, но по факту вам требуется лишь сделать необходимые запросы в функции ПолучитьПараметрыЗаполнения и вернуть результат в структуре с параметры совпадающими с параметрами макета. Параметры макета должны быть выделены цветом (в моем случае это RED, ну или другим удобным вам способом, в этом случае измените выражение XPath). 

Весь код открыт, пока разрабатывалось только под управляемые формы, но не вижу проблем переделать под legacy.

Внешних зависимостей быть не должно, испытывалось на версии 8.3.10, по сути должно работать из более ранней, но Я большой любитель СтрШаблон() и СтрРазделить() - в будующем постараюсь заменить их на скопированные из общего модуля БСП СтроковыеФункцииКлиентСервер.

 

UPD: К сожалению Инфостарт не дает бесплатно выложить обработку, поэтому прикрепляю листинг (ну или напишите мне):

 
 Сниппет модуля формы

//////////////////////////////////////////////////////////////
#Область Объявление_констант

#КонецОбласти
//////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////
#Область При_открытии

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ЗаполнитьПоУмолчанию();
КонецПроцедуры  // ПриСозданииНаСервере()

&НаСервере
Процедура ЗаполнитьПоУмолчанию()
	Попытка
		Запрос	= Новый Запрос(СтрШаблон(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 Ссылка ИЗ %1"
		, Метаданные.НайтиПотипу(РеквизитФормыВЗначение("Объект").Метаданные().Реквизиты.СсылкаНаОбъект.Тип.Типы()[0]).ПолноеИмя()));
		Выборка	= Запрос.Выполнить().Выбрать();
		Если Не Выборка.Количество() Тогда Возврат КонецЕсли;
		Выборка.Следующий();
		Объект.СсылкаНаОбъект	= Выборка.Ссылка;
	Исключение
	КонецПопытки;
КонецПроцедуры  // ЗаполнитьПоУмолчанию()

#КонецОбласти
//////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////
#Область Сформировать_документ
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, МассивОбъектов = Неопределено) Экспорт	
	Если ТипЗнч(ИдентификаторКоманды) = Тип("КомандаФормы") И (Объект.СсылкаНаОбъект = Неопределено Или Объект.СсылкаНаОбъект.Пустая()) Тогда
		// Если Печать вызвана из формы обработки, но СсылкаНаОбъект не заполнена
		Сообщение		= Новый СообщениеПользователю;
		Сообщение.Текст	= "Заполните данный реквизит.";
		Сообщение.Поле	= "Объект.СсылкаНаОбъект";
		Сообщение.УстановитьДанные(Объект.СсылкаНаОбъект);		
		Сообщение.Сообщить();
		Возврат;		 
	ИначеЕсли ТипЗнч(ИдентификаторКоманды) = Тип("КомандаФормы") Тогда
		// Если Печать вызвана из формы обработки
		МассивОбъектов	= Новый Массив;
		МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);		
	ИначеЕсли ТипЗнч(МассивОбъектов) = Тип("Массив") И МассивОбъектов.Количество() Тогда
		// Если Печать вызвана из модуля объекта (подключаемая печатная форма)
				
	Иначе
		// Такого быть не должно
		ВызватьИсключение "Команда формы ""Печать"" вызвана не из модуля объекта и не по кнопке.";
		Возврат;
	КонецЕсли;
	МассивДокументов	= ПечатьНаСервере(МассивОбъектов);
	Если ТипЗнч(МассивДокументов) <> Тип("Массив") Или Не МассивДокументов.Количество() Тогда Возврат КонецЕсли;
	ВыбратьКаталогЗаписиФайлов(МассивДокументов);
КонецПроцедуры  // Печать()

&НаСервере
Функция ПечатьНаСервере(МассивОбъектов) Экспорт
	МодульОбъекта		= РеквизитФормыВЗначение("Объект");
	Возврат МодульОбъекта.СформироватьДокументы(МассивОбъектов);
КонецФункции  // ПечатьНаСервере() 

// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
#Область Сохранить_файлы_на_диск
&НаКлиенте
Процедура ВыбратьКаталогЗаписиФайлов(МассивДокументов)
	ДополнительныеПараметры					= Новый Структура("МассивДокументов", МассивДокументов);
	
	ВыбранныеКаталоги						= Новый Массив;
	ВыбранныеКаталоги.Добавить(КаталогВременныхФайлов());
	
	// Вариант сохраненния во "временные файлы" (Папка %temp% в Windows)
	СохранитьФайлыВКаталог(ВыбранныеКаталоги, ДополнительныеПараметры);	
	Возврат;
	
	// Вариант выбора каталога пользователем 	
	Режим									= РежимДиалогаВыбораФайла.ВыборКаталога;
	ДиалогВыбораКаталога					= Новый ДиалогВыбораФайла(Режим);
	ДиалогВыбораКаталога.Заголовок			= СокрЛП("Выберите путь для сохранения файл" + ?(МассивДокументов.Количество()>1, "ов", "а"));
	ДиалогВыбораКаталога.МножественныйВыбор	= Ложь;
	ДиалогВыбораКаталога.ПолноеИмяФайла		= "";
	ДиалогВыбораКаталога.Каталог			= "";
	ДиалогВыбораКаталога.Расширение			= "";
	ОписаниеОповещения						= Новый ОписаниеОповещения("СохранитьНаДискФайлЗаписьФайла"
												, ЭтаФорма
												, ДополнительныеПараметры);
	ДиалогВыбораКаталога.Показать(ОписаниеОповещения);	
КонецПроцедуры  // ВыбратьКаталогЗаписиФайлов()

&НаКлиенте
Процедура СохранитьФайлыВКаталог(ВыбранныеКаталоги, ДополнительныеПараметры) Экспорт
	Если ТипЗнч(ВыбранныеКаталоги) <> Тип("Массив")
	Или ВыбранныеКаталоги.Количество() <> 1 
	Или ТипЗнч(ДополнительныеПараметры) <> Тип("Структура")
	Или Не ДополнительныеПараметры.Свойство("МассивДокументов")
	Или ТипЗнч(ДополнительныеПараметры.МассивДокументов) <> Тип("Массив")
	Или Не ДополнительныеПараметры.МассивДокументов.Количество() 
	Тогда Возврат КонецЕсли;

	Для Каждого Документ Из ДополнительныеПараметры.МассивДокументов Цикл
		Если Не Документ.Свойство("ДД") 
		Или Не Документ.Свойство("ИмяДокумента") 
		Или ТипЗнч(Документ.ДД) <> Тип("ДвоичныеДанные")
		Или ТипЗнч(Документ.ИмяДокумента) <> Тип("Строка")
		Или ПустаяСтрока(Документ.ИмяДокумента) 
		Тогда Продолжить КонецЕсли;
		ПолныйПутьФайла	= СтрЗаменить(ВыбранныеКаталоги[0] + "\\" + Документ.ИмяДокумента, "\\", "\");
		Документ.ДД.Записать(ПолныйПутьФайла);
		ЗапуститьПриложение(ПолныйПутьФайла); // Если требуется - открываем документы после сохранения
	КонецЦикла; // Для Каждого Документ Из ДополнительныеПараметры.МассивДокументов
	// ЭтаФорма.Закрыть(Истина);
КонецПроцедуры  // СохранитьФайлыВКаталог()
#КонецОбласти
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
#КонецОбласти
//////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////
#Область Заполнение_констант

#КонецОбласти
//////////////////////////////////////////////////////////////
 
 Сниппет модуля объекта

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда


//////////////////////////////////////////////////////////////
#Область Объявление_переменных
Перем ЦветВыделенияПараметров;
#КонецОбласти
//////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////
#Область Основная_информация_об_обработке
// ОСНОВНАЯ ИНФОРМАЦИЯ НАЧАЛО 
Функция ПолучитьИнформациюОбОбработке() Экспорт
	Инф								= Новый Структура;
	// Наименование обработки (имя для регистрации в справочнике внешних отчетов и обработок)
	Инф.Вставить("Наименование",	Метаданные().Синоним);
	// Идентификатор без пробелов и знаков препинания
	Инф.Вставить("Идентификатор",	Метаданные().Имя);				
	// Дополнительная информация
	Инф.Вставить("Информация",		СтрЗаменить(СтрШаблон("%1 %2 (%3 г.)", Метаданные().Синоним, Метаданные().Комментарий, Формат(ТекущаяДата(), "ДФ='d MMM yyyy'")), "  ", " "));
	// Версия для удобства версирования (1.0, 1.1, и т.д.)
	Инф.Вставить("Версия",			Метаданные().Комментарий);
	// Варианты: "ДополнительнаяОбработка", "ДополнительныйОтчет", "ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов"
	Инф.Вставить("Вид",				"ПечатнаяФорма");
	// в безопасном режиме не доступна COM технология, загрузка внешних компонент, доступ к файловой системе, доступ к Интернету.
	Инф.Вставить("БезопасныйРежим", Ложь);
	// Использование. Варианты: "ОткрытиеФормы", "ВызовКлиентскогоМетода", "ВызовСерверногоМетода"	
	Инф.Вставить("Использование",	"ВызовКлиентскогоМетода");
	// Показывать оповещение. Варианты Истина, Ложь	
	Инф.Вставить("Оповещение",		Истина);
	// Модификатор	
	Инф.Вставить("Модификатор",		""); 	
	// Указываем назначение к которому делаем внешнюю печ. форму
	МассивНазначений	= Новый Массив;
	УказанныеТипы		= ЭтотОбъект.Метаданные().Реквизиты.СсылкаНаОбъект.Тип.Типы();	// Возьмем типы из реквизита "СсылкаНаОбъект"
	Для Каждого УказанныйТип ИЗ УказанныеТипы Цикл
		ОбъектМетаданных = Метаданные.НайтиПотипу(УказанныйТип);
		Если ОбъектМетаданных = Неопределено Тогда Продолжить; КонецЕсли;
		МассивНазначений.Добавить(ОбъектМетаданных.ПолноеИмя());		
	КонецЦикла;
	Инф.Вставить("Назначение",		МассивНазначений);
	Возврат Инф;	
КонецФункции  // ПолучитьИнформациюОбОбработке()
// ОСНОВНАЯ ИНФОРМАЦИЯ КОНЕЦ

// ПОДГОТОВКА РЕГИСТРАЦИИ НАЧАЛО
// ВСЕ ДАННЫЕ ПО РЕГИСТРАЦИИ ЗАПОЛНЯЮТСЯ В ФУНКЦИИ ПолучитьИнформациюОбОбработке() 
Функция СведенияОВнешнейОбработке() Экспорт 
	Инф						= ПолучитьИнформациюОбОбработке();
	ТаблицаКоманд			= ПолучитьТаблицуКоманд();	
	ПараметрыРегистрации	= Новый Структура;
	МассивНазначений		= Новый Масси                            

Вступайте в нашу телеграмм-группу Инфостарт

обработка word docx печатнаяформа макет печать внешняя зуп

См. также

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм. Обновление версии от 21.04.26

22570 руб.

06.10.2023    41211    120    54    

129

Печатные формы Учет рабочего времени Учет ОС и НМА Бухгалтер 1С:Предприятие 8 1С:ERP Управление предприятием 2 1C:ERP Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Программа для автоматизации учета путевых листов в 1С - расширение, добавляющее в конфигурацию "ERP", документ Путевой лист и печатные формы установленных образцов для легковых и грузовых авто, расчет и списание нормативного количества топлива, отчет "Реестр путевых листов" с отбором по автомобилю и по водителю (через настройки) Позволит контролировать расход топлива, потому что сразу будет виден сверхнормативный расход.

25620 руб.

23.07.2025    6310    17    0    

15

Печатные формы Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Транспорт, автопарки, такси Бухгалтерский учет Платные (руб)

Учет путевых листов выполнен в виде расширения. Предназначен для учета путевых листов в конфигурации БП 3.0., УТ 11.5 и КА 2.5 Печатная форма: Типовая межотраслевая форма № 3. Утверждена постановлением Госкомстата России от 28.11.97 № 78. Типовая межотраслевая форма № 4-П от 18.09.2008 г. N 152 с учетом изменений указанных в Приказе Министерства транспорта Российской Федерации №368 от 11 сентября 2020 г. №368, Типовая межотраслевая форма № ЭСМ-7, и др. ЭСМ-2, 4-С, 3 спец., 6 спец., ПЛ для Автомобильного крана.

5000 руб.

14.10.2019    47175    338    216    

239

Печатные формы Пакетная печать 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Печать (приемо - сдаточных актов) ПСА, заявления, журнала покупок и реализаций. Подходит для фреш.

6100 руб.

10.09.2025    2274    14    2    

14

Печатные формы Логистика, склад и ТМЦ Бухгалтер 1С:Предприятие 8 1С:Комплексная автоматизация 2.х Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

13420 руб.

27.06.2023    8878    29    2    

30

Печатные формы НДС 22% 1С 8.3 1С:Управление торговлей 10 1С:Управление производственным предприятием Бухгалтерский учет Налоговый учет Платные (руб)

Решение для работы с новой графой 5б в УПД и Счете-фактуре с 01.04.2026 года для конфигураций 1С:УТ 10.3, 1С:УПП 1.3 и 1С:КА 1.1. Обеспечивает корректную печать универсальных передаточных документов и счетов-фактур в соответствии с изменениями в статье 169 НК РФ, заполняет обязательные поля - порядковый номер и дату авансового счета-фактуры при зачете предоплаты. Подключается как внешняя печатная форма в конфигурацию 1С, поддерживает все стандартные требования и имеет открытый исходный код для адаптации под ваши бизнес-процессы.

6100 руб.

19.12.2025    6293    50    27    

48

Печатные формы Учет документов Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x Бухгалтерский учет Управленческий учет Платные (руб)

Приложение для быстрого создания макетов печатных документов, заполняемых из 1С:Предприятие, без привлечения программистов и запуска конфигуратора. Шаблон готовится в редакторе MS Word, отлично освоенном офисными служащими. Так, на подготовку нового шаблона договора купли продажи со спецификацией потребуется 25 минут. Приложение будет полезно, если Вы работаете со множеством Word-шаблонов или если Вам надо часто создавать новые шаблоны. Есть сертификат "1С: Совместимо!". Версия ПРОФ доступна в виде расширения.

2000 руб.

05.09.2017    98872    79    107    

111
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. newold2 124 25.07.18 12:31 Сейчас в теме
1 стартмани - это бесплатно?
2. 🅵🅾️🆇 528 25.07.18 12:36 Сейчас в теме
(1) Вы пропустили в публиции следующий абзац:
UPD: К сожалению Инфостарт не дает бесплатно выложить обработку, поэтому прикрепляю листинг (ну или напишите мне):


И вы всегда можете написать мне, Я обязательно отвечу, если в телегу - то практически моментально :3
Адрес в профиле, редактор не позволил мне прикрепить бесплатно и указать контактные данные.
Также инфостарт не разрешает давать линк на гитхаб :c
Leopro23; pro96inf; jONES1979; +3 Ответить
9. jONES1979 15.08.18 08:35 Сейчас в теме
Здравствуйте!
А этот проект есть на гитхаб? Можно ссылку или идентификатор для поиска?
10. 🅵🅾️🆇 528 15.08.18 11:58 Сейчас в теме
(9) Привет. Да, есть.
Ссылки на гит тут, вроде как, запрещено прикреплять.
Но в отдельный репозиторий не выносил, а также никак не могу заставить себя выкладывать на гит именно исходный код, а не бинарники.

Давайте попробуем так, оставлю свой никнейм: PlugFox
И некий относительный путь: ones/Обработки и отчеты/Обработки/RMR СоглашениеОНеразглашенииИнформации.epf

Если что - всегда отвечу в личку.
BigB; pro96inf; jONES1979; +3 Ответить
3. newold2 124 25.07.18 17:53 Сейчас в теме
Каюсь, извиняюсь - действительно пропустил. Подход понравился, сам делал нечто подобное.
4. 🅵🅾️🆇 528 25.07.18 18:10 Сейчас в теме
(3) Можете написать в личку - обязательно поделюсь)
Если есть желание поучаствовать - с радостью приму помощь, нереализованный фичи и улучшения описал в статье.

Обработочку сделал недавно, когда поймал себя на мысли, что каждый раз при создании новой печатной формы, Я делаю одно и тоже) Посему аккуратно все оформил, и преследовал некую модульность и простоту разработки.

По сути чтоб создать на её основе новую печатную форму - потребуется изменить шаблон и подправить код всего в одной функции. Причем если новая печатная форма также будет касаться сотрудника - можно ограничится только редактированием макета.

ЗЫ: есть еще подключаемая, самозаполняемая печатная форма по справкам по сотруднику.
Но код там местами не очень, поэтому выложить могу только обфусцированной, иначе мне будет слегка неуютно)
Прикрепленные файлы:
5. spy-83 199 26.07.18 09:20 Сейчас в теме
картинки из 1с можно вставить в макет word с помощью вашей обработки?
к примеру вывести основное изображение номенклатуры
6. 🅵🅾️🆇 528 26.07.18 09:36 Сейчас в теме
(5) Пока нельзя, но технически в этом нет ничего сложного.
Вордовский файл это по сути архив с xml файлами и вложениями.
Если вставить в шаблон картинку, то она окажется в отдельном каталоге и её можно будет заменить.
7. spy-83 199 26.07.18 10:07 Сейчас в теме
если выводить таблицу из 1с, то заранее неизвестно количество строк, значит заранее не получится вставить саму картинку.
8. 🅵🅾️🆇 528 26.07.18 10:40 Сейчас в теме
(7)
заранее неизвестно количество строк

Исходные файлы xml ворда толком ничем не отличаются от html документа.
Вы же не будете утверждать, что невозможно сверстать веб страничку в 1с?)

заранее не получится вставить саму картинку

Ну как вы обычно выводите картинки в табличный документ?
Вы вставляете некую заготовку, а потом заменяете её на нужное изображение.

Так и здесь. При разархивировании docx получаете изображение которое вставили в документ шаблоном ранее.
Просто заменяете его на двоичные данные из вашего справочника номенклатур/файлов.

Вообще xml документы имеют ссылки между собой и вполне ясно говорят, что и как они подключают.
Если тут есть гуру XDTO - то в теории можно будет научить 1с'ку читать ворд довольно изящно.

Я с радостью бы это все сделал, но у меня очень много другой работы, поэтому данный функционал мной будет реализован в удобной для использования форме, как только это потребуется по работе.
11. Sanek_159 1 30.10.18 11:29 Сейчас в теме
Добрый день.

Подскажите, в обработке при замене параметров и их разделения используется неразрывный пробел. Можно как то сделать обычный пробел?
Если в Процедуре "ЗаполнитьПараметрМакета" где устанавливается "ПараметрМакета" заменить Символы.НПП на " " (пробел), то параметры все открываются слитно с соседними словами.

Неразрывный пробел не подходит, т.к. параметров может быть много и ворд распределяет текст не корректно.
12. 🅵🅾️🆇 528 30.10.18 11:32 Сейчас в теме
(11) Привет, насколько помню, можно подредактировать и сделать более удобно.
Насколько помню, это связано с тем, что редактируя макет Word в Word'е он вставляет туда кучу лишнего мусора и без неразрывного пробела, в некоторых случаях, слова могут слипаться.

Я постараюсь сделать более удобно в дальнейшем, но не в ближайшее время, тк сильно загружен, да еще и пишу огромную статью про inline webhook telegram бота.
13. 🅵🅾️🆇 528 15.11.18 18:12 Сейчас в теме
Исправил "исчезновение" пробелов рядом с переменными
Оно возникало от того, что пропадали пробелы в содержимом "w:r/w:t[@xml:space='preserve']" блоков.

Пример модуля обработки:
http://git.pfx.pw/snippets/1

Обратите внимание на область Работа_с_word
и в частности на добавленную функцию: ЗаполнитьПробелы()
и закоменченное добавление неразрывных пробелов в функции ЗаполнитьПараметрМакета()
14. sytkosa 119 11.06.19 12:52 Сейчас в теме
(13) Привет. Можете пере выложить решение проблемы "исчезновение пробелов".

Заранее спасибо
15. 🅵🅾️🆇 528 11.06.19 13:03 Сейчас в теме
(14) gist.github.com
Перевыложил.
На домашнем сервере, просто, перешел с gitlab на gitea)
pro96inf; +1 Ответить
16. Xershi 1563 11.06.19 13:08 Сейчас в теме
Интересное решение.
Было бы неплохо, если бы вы выделили описание алгоритма работы формирования файла ворда жирным или отдельным пунктом.
А то пока все не прочитал, не понял, что вы тут сделали!

Структуру ворда сами разбирали?
А если нужен устаревший формат?
17. 🅵🅾️🆇 528 11.06.19 13:13 Сейчас в теме
(16)
Было бы неплохо, если бы вы выделили описание алгоритма работы формирования файла ворда жирным или отдельным пунктом.
А то пока все не прочитал, не понял, что вы тут сделали!


К сожалению крайне не хватает времени на публикации.
Да и сейчас я все больше "готовлю" внешние печатные формы с помощью своего другого макета, все автоматизировано и конвеерно.
Может следующая статья будет про это + полуавтоматическое подключение и обновление печатных форм в куче конфигураций одним батником)


Структуру ворда сами разбирали?
А если нужен устаревший формат?


Да, сам, это просто xml, парсю его с помощью XPath выражений.
.doc - не xml, он в корне отличается, это бинарный формат. Сделать нативно средствами 1с тоже можно, но мне явно не до этого сейчас)
sstas007; pro96inf; +2 Ответить
18. Xershi 1563 11.06.19 13:17 Сейчас в теме
(17) ясно, тогда тоже стоит написать про это в ограничениях. Т.к. клиенты разные бывают, стоит устаревший ворд и новый ставить либо нет софта, либо админа.
19. 🅵🅾️🆇 528 11.06.19 13:18 Сейчас в теме
(18)
ясно, тогда тоже стоит написать про это в ограничениях. Т.к. клиенты разные выбают, стоит устаревший ворд и новый ставить либо нет софта, либо админа.


Название статьи, внезапно:
Подключаемые печатные формы с .DOCX макетом без Word'а


А .docx появился в 2007 ворде, если не изменяет память.
2003 ворд - это уже прям раритет, вы в нем очень многое не сможете открыть)))
pro96inf; +1 Ответить
20. Xershi 1563 11.06.19 13:58 Сейчас в теме
(19) название статьи конечно говорит, но чтобы не было лишних вопросов, как у меня допустим. Мало ли там просто букву убрать и заработает!
21. 🅵🅾️🆇 528 11.06.19 14:10 Сейчас в теме
(20) Добавил дополнительно заметочку в статью)
pro96inf; Xershi; +2 Ответить
22. Xershi 1563 11.06.19 14:47 Сейчас в теме
(21) если бегло читать статью внимание падает не на особенности, а на ваше слово "RED". Читающему что и зачем - это просто мусор))
Думаю стоит над акцентами поработать. Но как минимум одним вопросом меньше!
23. 🅵🅾️🆇 528 11.06.19 14:49 Сейчас в теме
(22) Здорово) Спасибо за фидбэк.
Возможно в будущем статьи будут правиться корпоративным редактором, ну или как минимум постараюсь выработать шаблон (пока еще в поиске себя).
29. sergik_nsk 148 15.05.20 13:22 Сейчас в теме
(19) Разобрал код поподробней, оказалось что 1. выделение фоном влечет привязку к разбору xml в данном представленном контексте только для конкретной версии Word, например для 2007 года не работает, а ведь разбор это ключевой момент всей задумки. Возможно если взять в качестве поиска не фон, а например спец шрифт, будет стабильней работать.
30. 🅵🅾️🆇 528 15.05.20 13:32 Сейчас в теме
(29) Там все разбирается.
Параметры после править не надо в ворде, иначе "мусора" натыкает.
Ну и опять же, вы вольны оформить форк и сделать все как хотите, лицензия MiT вам это полностью позволяет)
24. AlexAdm 60 29.11.19 07:38 Сейчас в теме
Добрый день. Заинтересовала данная обработка, можете поделиться?
25. 🅵🅾️🆇 528 29.11.19 12:28 Сейчас в теме
(24) plugfox@gmail.com
telegram: @plugfox
pro96inf; +1 Ответить
26. nayd 10 27.02.20 11:28 Сейчас в теме
Чего-то не хватает в сниппете модуля объекта (в функции daСклонение())

	Пока _ПозЧастиСтроки  0 И СтрДлина(_ТаблицаСлова[_ТаблицаСлова.Количество() - 1].Регистр) > 1 Тогда
			_ТаблицаСлова[_ТаблицаСлова.Количество() - 1].Тег = "."; 
		КонецЕсли;


27. 🅵🅾️🆇 528 27.02.20 11:30 Сейчас в теме
(26) Сейчас вынужден отказаться от такой прекрасной функции как daСклонение. Тк она использует "Вычислить".
Но недавно завезли склонение платформой (еще не проверял на адекватность).
28. sergik_nsk 148 14.05.20 15:19 Сейчас в теме
Посмотрел. Много в коде на мой взгляд лишних данных, может для универсальности, в целом описано понятно, за вклад и за труд плюс однозначно.
31. sergik_nsk 148 15.05.20 13:33 Сейчас в теме
(30) это в 2019 офисе
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:eastAsia="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman" />
<w:b />
<w:sz w:val="24" />
<w:szCs w:val="24" />
<w:highlight w:val="yellow" />
</w:rPr>
<w:t>_______</w:t>

это в 2007
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:eastAsia="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman" />
<w:b />
<w:sz w:val="24" />
<w:szCs w:val="24" />
<w:shd w:val="clear" w:color="auto" w:fill="FF0000" />
</w:rPr>
<w:t>Номер</w:t>
32. backgammon 18.11.21 22:34 Сейчас в теме
Для работы с таблицами добавил код:

Вызов перед вызовом функции СобратьДокумент()
ДобавитьТаблицу(ПутьМакета, ПараметрыЗаполнения.СсылкаНаОбъект);

Естественно для каждой таблицы надо свой код строк будет подставить, который предварительно надо будет вытащить из файла: word\document.xml

Процедура ДобавитьТаблицу(ПутьМакета, СсылкаНаОбъект)
	
	Текст = Новый ЧтениеТекста(ПутьМакета + "\word\document.xml", КодировкаТекста.UTF8);
	РезТекст = Новый ЗаписьТекста(ПутьМакета + "\word\newdocument.xml", КодировкаТекста.UTF8);
	
	Стр = Текст.Прочитать();
	Стр = СтрЗаменить(Стр, "</w:tbl>", ДобавитьСтрокиТаблицы(СсылкаНаОбъект));
	РезТекст.Записать(Стр);

	Текст.Закрыть();
	РезТекст.Закрыть();
	
	УдалитьФайлы(ПутьМакета + "\word\document.xml");
	ПереместитьФайл(ПутьМакета + "\word\newdocument.xml", ПутьМакета + "\word\document.xml");
	
КонецПроцедуры

Функция ДобавитьСтрокиТаблицы(СсылкаНаОбъект)
	
	Результат = "";
	
	Для Каждого стрТаб Из СсылкаНаОбъект.Товары Цикл
		Результат = Результат + "<w:tr w:rsidR=""00081F8F"" w:rsidRPr=""00733D68"" w14:paraId=""4CC71807"" w14:textId=""77777777"" w:rsidTr=""00682457"">
					|	<w:trPr><w:trHeight w:val=""204""/></w:trPr>
					|	<w:tc>
					|		<w:tcPr><w:tcW w:w=""983"" w:type=""dxa""/><w:tcBorders><w:top w:val=""nil""/><w:left w:val=""nil""/><w:bottom w:val=""nil""/><w:right w:val=""single"" w:sz=""4"" w:space=""0"" w:color=""auto""/></w:tcBorders></w:tcPr>
					|		<w:p w14:paraId=""119049F6"" w14:textId=""77777777"" w:rsidR=""00081F8F"" w:rsidRPr=""00733D68"" w:rsidRDefault=""00081F8F"" w:rsidP=""00081F8F""><w:pPr><w:pStyle w:val=""ConsPlusNonformat""/><w:jc w:val=""center""/><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr></w:pPr></w:p>
					|	</w:tc>
					|	<w:tc>
					|		<w:tcPr><w:tcW w:w=""983"" w:type=""dxa""/><w:tcBorders><w:left w:val=""single"" w:sz=""4"" w:space=""0"" w:color=""auto""/></w:tcBorders></w:tcPr>
					|		<w:p w14:paraId=""045D4B3B"" w14:textId=""1FD26757"" w:rsidR=""00081F8F"" w:rsidRPr=""00682457"" w:rsidRDefault=""00682457"" w:rsidP=""00081F8F"">
					|			<w:pPr><w:pStyle w:val=""ConsPlusNonformat""/><w:jc w:val=""center""/><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr></w:pPr>
					|			<w:r><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr><w:t>" + Строка(стрТаб.НомерСтроки) + "</w:t></w:r>
					|		</w:p>
					|	</w:tc>
					|	<w:tc>
					|		<w:tcPr><w:tcW w:w=""5547"" w:type=""dxa""/></w:tcPr>
					|		<w:p w14:paraId=""0A1BD6CD"" w14:textId=""0D592D89"" w:rsidR=""00081F8F"" w:rsidRPr=""00733D68"" w:rsidRDefault=""00733D68"" w:rsidP=""00081F8F"">
					|			<w:pPr><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr></w:pPr>
					|			<w:r w:rsidRPr=""00733D68""><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr><w:t>" + Строка(стрТаб.Номенклатура.Наименование) + "</w:t></w:r>
					|		</w:p>
					|	</w:tc>
					|	<w:tc>
					|		<w:tcPr><w:tcW w:w=""719"" w:type=""dxa""/></w:tcPr>
					|		<w:p w14:paraId=""690C2B12"" w14:textId=""77777777"" w:rsidR=""00081F8F"" w:rsidRPr=""00733D68"" w:rsidRDefault=""00081F8F"" w:rsidP=""00081F8F"">
					|			<w:pPr><w:jc w:val=""right""/><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr></w:pPr>
					|			<w:r w:rsidRPr=""00733D68""><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr><w:t>шт</w:t></w:r>
					|		</w:p>
					|	</w:tc>
					|	<w:tc>
					|		<w:tcPr><w:tcW w:w=""1714"" w:type=""dxa""/></w:tcPr>
					|		<w:p w14:paraId=""12DD3F03"" w14:textId=""5645CA8F"" w:rsidR=""00081F8F"" w:rsidRPr=""00733D68"" w:rsidRDefault=""00733D68"" w:rsidP=""00081F8F"">
					|			<w:pPr><w:jc w:val=""right""/><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr></w:pPr>
					|			<w:r w:rsidRPr=""00733D68""><w:rPr><w:rFonts w:ascii=""Tahoma"" w:hAnsi=""Tahoma"" w:cs=""Tahoma""/><w:sz w:val=""16""/><w:szCs w:val=""16""/></w:rPr><w:t>" + Строка(стрТаб.Количество) + "</w:t></w:r>
					|		</w:p>
					|	</w:tc>
					|</w:tr>
					|";
	КонецЦикла;
	
	Результат = Результат + "</w:tbl>";
	
	Возврат Результат;
КонецФункции
Показать
33. user1887713 22.12.22 11:45 Сейчас в теме
я бы в сторону HTML посмотрел. проще в обслуживании
34. YourAlinochka 27.02.24 19:14 Сейчас в теме
в модуле менеджера документа вот такой код и все работает!!!


#Область ПрограммныйИнтерфейс
// Переопределяет настройки печати для объекта.
//
// Параметры:
//  Настройки - см. УправлениеПечатью.НастройкиПечатиОбъекта.
//
Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
	Настройки.ПриДобавленииКомандПечати = Истина;
КонецПроцедуры

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
		
	КомандаПечати = КомандыПечати.Добавить();  
	//КомандаПечати.МенеджерПечати = "Документ.ДоговорКлиента"; 
	КомандаПечати.Идентификатор = "ДоговорКлиента";
	КомандаПечати.Представление = НСтр("ru = 'Договор клиента'");
	///КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь;
	
КонецПроцедуры 

// Формирует печатные формы.
//
// Параметры:
//  МассивОбъектов – Массив – ссылки на объекты, которые нужно распечатать;
//  ПараметрыПечати – Структура – дополнительные настройки печати;
//  КоллекцияПечатныхФорм – ТаблицаЗначений – сформированные табличные документы (выходной параметр)
//  ОбъектыПечати – СписокЗначений – значение – ссылка на объект;
//                                            представление – имя области, в которой был выведен объект (выходной параметр);
//  ПараметрыВывода – Структура – дополнительные параметры сформированных табличных документов (выходной параметр).
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	Сообщить("Печать");
	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ДоговорКлиента");
	Если ПечатнаяФорма <> Неопределено Тогда
		Сообщить("Docx");
	    ПФ = ПечатьДоговорКлиента(МассивОбъектов, ОбъектыПечати);
	    ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Договор клиента'");
	    ПечатнаяФорма.ОфисныеДокументы = ПФ;//ПолныйПутьКМакету = "Документ.ДоговорКлиента.ПФ_MXL_СчетЗаказ";
	КонецЕсли;
	
	
КонецПроцедуры



Функция ПечатьДоговорКлиента(МассивОбъектов, ОбъектыПечати)
	ОД = Новый Соответствие;
	МакетДок = ПолучитьМакет("МакетDOCX");
	
	
	Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДок, Неопределено);
	Если Макет = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	ОпОбл = Новый Структура;
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОпОбл, "Шапка", "Общая");
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОпОбл, "ШапкаТаблицы", "СтрокаТаблицы");               
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОпОбл, "СтрокаТаблицы", "СтрокаТаблицы");
	
	
	зп = Новый Запрос;
	зп.Текст = 
	"ВЫБРАТЬ
	|	ДоговорКлиента.Ссылка КАК Ссылка,
	|	ДоговорКлиента.ВерсияДанных КАК ВерсияДанных,
	|	ДоговорКлиента.ПометкаУдаления КАК ПометкаУдаления,
	|	ДоговорКлиента.Номер КАК Номер,
	|	ДоговорКлиента.Дата КАК Дата,
	|	ДоговорКлиента.Проведен КАК Проведен,
	|	ДоговорКлиента.Заказчик КАК Заказчик,
	|	ДоговорКлиента.Исполнитель КАК Исполнитель,
	|	ДоговорКлиента.Товары.(
	|		Ссылка КАК Ссылка,
	|		НомерСтроки КАК НомерСтроки,
	|		Номенклатура КАК Номенклатура,
	|		Цена КАК Цена
	|	) КАК Товары
	|ИЗ
	|	Документ.ДоговорКлиента КАК ДоговорКлиента
	|ГДЕ
	|	ДоговорКлиента.Ссылка В(&Ссылка)";
	зп.УстановитьПараметр("Ссылка", МассивОбъектов);
	м = ОбщегоНазначения.ТаблицаЗначенийВМассив(зп.Выполнить().Выгрузить());
	
	Для каждого стр из м цикл
		
		ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет);
		
		
		Если ПечатнаяФорма = Неопределено Тогда
			УправлениеПечатью.ОчиститьСсылки(Макет);
			Возврат ОД;
		КонецЕсли;
		
		
		Обл = УправлениеПечатью.ОбластьМакета(Макет, ОпОбл["Шапка"]);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Обл, стр);
		
		
		
		
		
		АдресХранилища = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
		
		УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма);
		
		ОД.Вставить(АдресХранилища, "Проба.docx");
		
		                             
		
	КонецЦикла;
	
	
	
	УправлениеПечатью.ОчиститьСсылки(Макет);
	
	Возврат ОД;
КонецФункции




#КонецОбласти
Показать



в модуле формы вот такой
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// СтандартныеПодсистемы.ПодключаемыеКоманды
		ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
		// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
    ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
Показать


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

Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
	
	Настройки.Вставить("ИспользоватьПодписиИПечати", Ложь);
	Настройки.Вставить("СкрыватьПодписиИПечатиДляРедактирования", Истина);
	
	Настройки.ОбъектыПечати.Добавить(Документы.ДоговорКлиента);
	
КонецПроцедуры
35. Sindbad_M 139 07.10.24 22:10 Сейчас в теме
Как я понял, в коде за замену отдельного параметра отвечает строка
ЗаполнитьПараметрМакета(Узел.ТекстовоеСодержимое, ПараметрыЗаполнения)

Но откуда уверенность, что весь параметр попадет в один единственный узел? Ворд разбивает текст на блоки <w:t></w:t> совершенно произвольным образом.
36. tirli41 4 09.06.26 07:16 Сейчас в теме
отличная обработка, переделал под док в ЕРП. Автору респект.
Для отправки сообщения требуется регистрация/авторизация