Внешняя печатная форма в формате Word (.docx, .doc) с помощью средств БСП

22.03.24

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

Задача по выводу документа Word из внешней печатной формы достаточно проста и тривиальна, однако, как показывает практика, многие разработчики по-прежнему сталкиваются с рядом проблем при ее решении. Эта статья призвана сэкономить ваше время при решении подобных задач - мы вместе пройдемся по всем основным моментам разработки таких обработок, а для тех, кому не терпится сразу же опробовать все в действии, к статье прилагается готовый шаблон внешней печатной формы.

Скачать исходный код

Наименование Файл Версия Размер
Внешняя печатная форма в формате Word (.docx, .doc) с помощью средств БСП
.epf 132,80Kb
160
.epf 132,80Kb 160 Скачать бесплатно

Дисклеймер. Предыдущая версия этой статьи описывала формирование Word документов средствами БСП на стороне клиента. В новых же версиях БСП (в статье приводится пример на конфигурации с БСП 3.1.9.232) этот подход уже считается устаревшим, поэтому данная статья и все приведенные в ней примеры также были переработаны, чтобы соответствовать новым стандартам. 

Начинаем с того, что создаем новую внешнюю обработку, в модуле объекта которой прописываем стандартную экспортную функцию "СведенияОВнешнейОбработке"
 

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	ПараметрыРегистрации.Вставить("Версия", "0.1");
	ПараметрыРегистрации.Наименование = НСтр("ru = 'Внешняя печатная форма Word'");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Внешняя печатная форма Word'");
	НоваяКоманда.Идентификатор = "ВнешняяПечатнаяФормаWord";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
		
	Возврат ПараметрыРегистрации;
	
КонецФункции


Теперь первое, что нам нужно будет сделать, это подготовить шаблон Word документа. Этот процесс напоминает тот, который мы делали бы, если бы формировали обычную печатную форму - нам нужно выделить в нашей печатной форме различные области, такие как "Шапка", "Строка" и "Подвал", а внутри каждой из этих областей у нас будет содержаться некий текст с параметрами к подстановке.

В БСП заложен функционал, который позволяет решить эти задачи довольно легко и быстро.

Начнем с выделения областей. Для этого в БСП используется подход, напоминающий открывающиеся/закрывающиеся теги HTML или XML. В нашем документе Word нам нужно будет обрамить наши области специальными тегами, которые будут выглядеть следующим образом:
 

{v8 Область.ИмяМоейОбласти}
...
{/v8 Область.ИмяМоейОбласти}


В Word это будет выглядеть примерно так:
 


Эти теги позволят нам обращаться к этим областям позже в коде, но при выводе Word документа они, разумеется, будут удалены.

Теперь перейдем к параметрам печатной формы. Тут все еще проще. Параметр в Word документе должен иметь следующий вид:
 

{v8 ИмяПараметра}



 

После того как наш шаблон будет полностью готов, мы должны будем загрузить его в виде макета двоичных данных в нашу обработку:


Теперь в модуле объекта нашей обработки пропишем стандартную для внешних печатных форм процедуру "Печать":
 

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ВнешняяПечатнаяФормаWord") Тогда
		СформироватьДокументWord(КоллекцияПечатныхФорм, МассивОбъектов);
	КонецЕсли;
	
КонецПроцедуры


Вся же основная логика работы с Word документом - его объявление, определение и вывод областей, а также подстановка параметров - будет осуществлена в процедуре "СформироватьДокументWord".
 

Процедура СформироватьДокументWord(КоллекцияПечатныхФорм, МассивОбъектов) Экспорт
			
	Если МассивОбъектов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Ссылка = МассивОбъектов[0]; 
	
	ТипМакета = "DOC"; // Эта переменная уже устарела, и необходимость ее использования отпадет в новых версиях БСП, однако пока (БСП 3.1.9.232) она все еще нужна.
	
	// Получаем структуру со сведениями о нашей печатной форме из коллекции печатных форм. В эту же структуру позже будет помещен сформированный нами документ Word.    
	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ВнешняяПечатнаяФормаWord");
	ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
	
	// Инициализируем макет документа Word на основании подготовленного заранее шаблона.
	ДвоичныеДанныеМакета = ПолучитьМакет("ПФ_DOC_Макет");
	СсылкаНаМакет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, ТипМакета, "ВнешняяПечатнаяФормаWord");
	
	// Инициализируем печатную форму Word (docx), используя сформированный на прошлом этапе макет.
	ПечатнаяФормаWord = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, СсылкаНаМакет.НастройкиСтраницыМакета, СсылкаНаМакет);
	
	// Подготовим параметры нашей печатной формы.
	СтруктураПараметров = ПолучитьТабличнуюЧастьДокумента(Ссылка);
	
	// Приступаем к заполнению нашего документа. Начинаем с объявления областей.
	СтруктураОбластей = Новый Структура;
	УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "Заголовок", "Общая");
	УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "Данные", "СтрокаТаблицы");
	УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "Подвал", "Общая");
	
	// Получение областей, заполнение их параметров и вывод на документ Word. 
	
	// 1. Вывод заголовка документа.
	ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.Заголовок);
	УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров.ПараметрыШапки);
	
	// 2. Вывод табличной части.
	ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.Данные);
	УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров.МассивТоваров);  
	
	// 3. Вывод подвала документа.
	ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.Подвал);
	УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаWord, ОбластьМакета, Новый Структура);
			
	// Формируем итоговый документ Word и помещаем его во временное хранилище, которое позже передаем структуре "ПечатнаяФорма".
	АдресХранилищаОфисныйДокумент = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаWord);
	
	// Очищаем ссылки - это необходимо для удаления временных файлов, созданных за кадром на предыдущих этапах.  
	УправлениеПечатью.ОчиститьСсылки(ПечатнаяФормаWord, Ложь);
	УправлениеПечатью.ОчиститьСсылки(СсылкаНаМакет);
	
	ОфисныеДокументы = Новый Соответствие;
	ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, НСтр("ru = 'Внешняя печатная форма Word'"));
	ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
	
КонецПроцедуры


Ниже пропишем содержание вспомогательной функций, используемой для получения параметров к подстановке:
 

Функция ПолучитьТабличнуюЧастьДокумента(Ссылка)

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

	Возврат Новый Структура("ПараметрыШапки, МассивТоваров", ПараметрыШапки, МассивТоваров);

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


3. Заключение

Вот, собственно, и все. Согласитесь, совсем нетрудно. Для удобства к статье также прилагается файл внешней обработки, чтобы вы смогли сразу протестировать весь описанный в статье функционал.

Протестировано на конфигурации Управление торговлей, редакция 11.5.16.74 (БСП 3.1.9.232)

Word внешняя обработка печатная форма БСП docx doc

См. также

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

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

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

10000 руб.

02.09.2020    131013    710    390    

758

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

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

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

18000 руб.

06.10.2023    9378    27    6    

49

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

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

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

10000 руб.

10.11.2023    5506    14    2    

39

SALE! %

PowerTools

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

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

3600 2880 руб.

14.01.2013    179929    1095    0    

868

OneDebugger - инструмент для отладки кода без использования режима конфигуратора

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

5400 руб.

17.05.2024    6213    13    12    

37

Бустер Конвертации данных 3 (Infostart Toolkit)

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 руб.

07.10.2021    15435    3    12    

38

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

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

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

5000 руб.

07.02.2018    100349    240    97    

299

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

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

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

3000 руб.

27.08.2019    18860    7    8    

42
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Rehim 22.03.24 17:21 Сейчас в теме
Классно! И полезно
2. qwed557 30 23.03.24 17:15 Сейчас в теме
Все хорошо, только задание областей если совсем по БСП-шному делать, надо делать через УправлениеПечатью.ДобавитьОписаниеОбласти(
rusrus; KamranV21; +2 Ответить
6. KamranV21 160 24.03.24 21:14 Сейчас в теме
(2) Большое спасибо за замечание. Пример переработан, чтобы соответствовать последним стандартам БСП, и сейчас в нем уже используется указанная вами процедура.
3. Opiumforme 9 24.03.24 08:30 Сейчас в теме
Автор, мне интересно, как быстро формируется печатка?
Последний раз использовал эти методы ещё года 4 назад и работало это очень медленно. В итоге пришёл к выводу, что через метод execute всё гораздо легче. Что то изменилось или всё так же медленно?
4. alfanika 480 24.03.24 14:48 Сейчас в теме
(3) Используем в ЗУП. Есть допустимая задержка секунды 3. Зато печатная форма как надо и такую форму execute не даст.
7. KamranV21 160 24.03.24 21:14 Сейчас в теме
(3) До этого момента в статье приводился пример с формированием Word на стороне клиента. В нем, действительно, наблюдалась задержка - небольшая, но тем не менее заметная. Сейчас пример в статье переработан так, чтобы офисный документ полностью формировался на стороне сервера, что существенно сказалось на скорости его вывода. Замеров не делал, но по ощущениям разница очевидная.
5. metatron_rus 24.03.24 16:59 Сейчас в теме
Все хорошо, но не заполняется табличная часть. Строки добавляет, но не заполняет данными.
Прикрепленные файлы:
Реализация.docx
8. KamranV21 160 24.03.24 21:22 Сейчас в теме
(5) Да, действительно наблюдалась такая проблема. Дело было в лишних отступах рядом с тегами областей. Вообще, заметил, что БСП очень капризно определяет области в docx документах - один лишний или, наоборот, недостающий отступ, и область не определяется. Сейчас пример переработан. Пожалуйста, скачайте новую версию обработки и попробуйте еще раз.
metatron_rus; +1 Ответить
9. metatron_rus 24.03.24 22:08 Сейчас в теме
10. Andronav 25.03.24 11:21 Сейчас в теме
Подкажите, используя БСП можно созданный word макет сохранить в PDF формате? Если да, то как это сделать?
11. Дмитрий74Чел 235 03.04.24 19:40 Сейчас в теме
(10) Не думаю чтоб был в БСП такой функционал. Можно программно вызвать word, открыть в нем файл и сохранить как pdf. Но это будет работа с word через com, минуя БСП.
12. Tarlich 116 03.04.24 23:29 Сейчас в теме
Вся работа "падает" на программиста , и при любом желании пользователем что то изменить продеться открывать конфигуратор
13. rusrus 50 04.04.24 11:38 Сейчас в теме
Не раскрыта тема с колонтитулами:

....
УправлениеПечатью.ДобавитьОписаниеОбласти(Области, "НижнийКолонтитул", "НижнийКолонтитул"); 
....
ОбластьМакета = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["НижнийКолонтитул"]);
sokolovrk; KamranV21; +2 Ответить
14. user916073 04.04.24 16:33 Сейчас в теме
При помощи такого метода не удалось реализовать такой случай: нужно было в одном документе сделать первые страницы в портретном расположении листа, потом одну в альбомном, а потом несколько снова в портретном. Такая штука в договоре с приложениями у нас использовалась.
15. Дмитрий74Чел 235 12.04.24 11:48 Сейчас в теме
(14) Сделать пустой файл Word с нужными страницами, с нужной ориентацией. Расставить теги. Что не так?
16. user916073 12.04.24 13:05 Сейчас в теме
(15) В макете всё красиво. При выводе из 1С ориентация на всех страницах становится одинаковой.
Оставьте свое сообщение