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

22.03.24

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

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

Скачать файл

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

Наименование SM По подписке [?]
Внешняя печатная форма в формате Word (.docx, .doc) с помощью средств БСП
.epf 132,80Kb
227
227
0 SM
Скачать

Дисклеймер. Предыдущая версия этой статьи описывала формирование 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

См. также

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

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

10000 руб.

02.09.2020    141506    777    391    

804

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

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

18000 руб.

06.10.2023    11762    31    6    

62

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

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

5400 руб.

17.05.2024    14443    36    29    

81

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

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

10000 руб.

10.11.2023    7406    27    4    

51

SALE! %

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

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

3600 2880 руб.

14.01.2013    182215    1105    0    

876

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

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

5000 руб.

07.02.2018    101261    243    97    

304

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

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

2400 руб.

24.09.2019    24580    17    15    

34

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

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

3000 руб.

27.08.2019    19534    7    8    

42
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Rehim 22.03.24 17:21 Сейчас в теме
Классно! И полезно
2. qwed557 30 23.03.24 17:15 Сейчас в теме
Все хорошо, только задание областей если совсем по БСП-шному делать, надо делать через УправлениеПечатью.ДобавитьОписаниеОбласти(
rusrus; KamranV21; +2 Ответить
6. KamranV21 170 24.03.24 21:14 Сейчас в теме
(2) Большое спасибо за замечание. Пример переработан, чтобы соответствовать последним стандартам БСП, и сейчас в нем уже используется указанная вами процедура.
3. Opiumforme 9 24.03.24 08:30 Сейчас в теме
Автор, мне интересно, как быстро формируется печатка?
Последний раз использовал эти методы ещё года 4 назад и работало это очень медленно. В итоге пришёл к выводу, что через метод execute всё гораздо легче. Что то изменилось или всё так же медленно?
4. alfanika 483 24.03.24 14:48 Сейчас в теме
(3) Используем в ЗУП. Есть допустимая задержка секунды 3. Зато печатная форма как надо и такую форму execute не даст.
7. KamranV21 170 24.03.24 21:14 Сейчас в теме
(3) До этого момента в статье приводился пример с формированием Word на стороне клиента. В нем, действительно, наблюдалась задержка - небольшая, но тем не менее заметная. Сейчас пример в статье переработан так, чтобы офисный документ полностью формировался на стороне сервера, что существенно сказалось на скорости его вывода. Замеров не делал, но по ощущениям разница очевидная.
5. metatron_rus 24.03.24 16:59 Сейчас в теме
Все хорошо, но не заполняется табличная часть. Строки добавляет, но не заполняет данными.
Прикрепленные файлы:
Реализация.docx
8. KamranV21 170 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Чел 237 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Чел 237 12.04.24 11:48 Сейчас в теме
(14) Сделать пустой файл Word с нужными страницами, с нужной ориентацией. Расставить теги. Что не так?
16. user916073 12.04.24 13:05 Сейчас в теме
(15) В макете всё красиво. При выводе из 1С ориентация на всех страницах становится одинаковой.
17. waider 55 05.06.24 09:05 Сейчас в теме
Лайк за Хаби. Аж прослезился)
18. nano1c 172 17.06.24 19:11 Сейчас в теме
поставил плюс, скачал, разобрался, но блин это совсем не то что нужно - это уже устарело прописывать тэги {v8 } - сейчас встроен конструктор ворд-шаблонов через [] с поддержкой формул, вот это бы реализовать! То есть берем ворд шаблон готовый из того же ЗУП и сразу во внешнюю и там его дополняем - это для случая если нам не хватает мощности конструктора вордовских форм.
gamletspb; +1 Ответить
19. succub1_5 89 24.06.24 10:18 Сейчас в теме
Здравствуйте, а как несколько раз вывести с открытием wordа?
Т.е. программно в цикле формирую несколько документов (печатных форм), у каждой уникальный ИД в АдресХранилищаОфисныйДокумент и имя файла, но когда word открывается, то там только последний документ.
P.S. из документа Разовые начисления - нужно для каждого сотрудника (из ТЧ начисления) свой файл создать/открыть.
20. Batman 165 24.06.24 20:13 Сейчас в теме
(19) А именно отдельный файл нужно открыть, да? Я решал похожую задачу, с Заказчиком организационно решили, что файл будет один, просто каждая строка документа это будет с начала страницы в файле Word. Я к тому, что мне тоже интересно техническое решение Вашего вопроса, но может, подойти к решению вопроса не с технической, а с организационной стороны? Почему именно отдельный файл нужен?
Оставьте свое сообщение