Ссылка на первоисточник.
Поиск в типовых конфигурация 1С по “docx”
БСП 3.0.2
УправлениниеПечатью.ИнициализироватьПечатнуюФорму()
УНФ 1.6.16
ШаблоныПечатиОфисныхДокументов.СФормироватьДокумент()
ДО 2.1.12
АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьФайлMSWordВXML()
Другие ссылки
https://infostart.ru/public/675307/
https://infostart.ru/1c/articles/590918/
0
0
Функция ПолучитьТекстHTML()
МакетHTML = РеквизитФормыВЗначение(«Объект»).ПолучитьМакет(«МакетПечати»);
ОбластьШапка = ПолучитьОбласть(МакетHTML,»Шапка»);
ОбластьШапкаТаблицы = ПолучитьОбласть(МакетHTML,»ШапкаТаблицы»);
ОбластьСтрока = ПолучитьОбласть(МакетHTML,»Строка»);
ОбластьПодвал = ПолучитьОбласть(МакетHTML,»Подвал»);
ПараметрыШапки = Новый Структура(«Номер,Дата,Контрагент»
,«000001»
,«01.01.2016»
,«ООО Рога и Копыта»);
ТекстHTML = ТекстHTML+Символы.ПС
+ ВывестиОбласть(ОбластьШапка,ПараметрыШапки);
ТекстHTML = ТекстHTML+Символы.ПС
+ ВывестиОбласть(ОбластьШапкаТаблицы);
СуммаИтог = 0;
Для Сч= 1 по 10 Цикл
Рандом = Новый ГенераторСлучайныхЧисел(150*Сч);
Артикул = Рандом.СлучайноеЧисло(10000,30000);
Рандом = Новый ГенераторСлучайныхЧисел(15*Сч);
Цена = Окр(Рандом.СлучайноеЧисло(100,30000)/100,2);
Рандом = Новый ГенераторСлучайныхЧисел(Сч);
Количество = Рандом.СлучайноеЧисло(1,20);
Сумма = Окр(Цена*Количество,2);
СуммаИтог = СуммаИтог+Сумма;
ПараметрыСтроки = Новый Структура(«НомерСтроки,Артикул,Товар,Количество,Цена,Сумма»
,Сч
,Артикул
,«Товар такойто «+ Строка(Сч)
,Количество
,Формат(Цена,«ЧДЦ=2»)
,Формат(Сумма,«ЧДЦ=2»));
ТекстHTML = ТекстHTML+Символы.ПС
+ ВывестиОбласть(ОбластьСтрока,ПараметрыСтроки);
КонецЦикла;
ПараметрыПодвала = Новый Структура(«Сумма»,Формат(СуммаИтог,«ЧДЦ=2»));
ТекстHTML = ТекстHTML+Символы.ПС
+ ВывестиОбласть(ОбластьПодвал,ПараметрыПодвала);
Возврат ТекстHTML;
КонецФункции
0 / 0 / 1 Регистрация: 10.03.2015 Сообщений: 4 |
|
1 |
|
1C 8.x Заполнение файла и печать через БСП без Ком Объекта04.08.2020, 12:37. Показов 1906. Ответов 5
Добрый день. Стоит задача отказаться от ComОбъект при печати. Есть файл doc или odt(шаблон документа) в справочнике Файлы, который нужно частично заполнить и вывести на печать без использование ComОбъекта. Как это можно сделать? Что-то не могу найти примеров
0 |
1824 / 1243 / 444 Регистрация: 16.01.2015 Сообщений: 5,449 |
|
04.08.2020, 18:02 |
2 |
YaMax, Посмотри. Кажется это, то что тебе надо
0 |
0 / 0 / 1 Регистрация: 10.03.2015 Сообщений: 4 |
|
04.08.2020, 18:22 [ТС] |
3 |
polax, нет, это не то. У меня есть файл Word изначально, его подтягиваю из справочника. И нужно его заполнить и напечатать без использования com объекта.
0 |
371 / 175 / 74 Регистрация: 04.03.2020 Сообщений: 662 |
|
08.08.2020, 14:09 |
5 |
У ворда есть формат XML Word.
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
09.08.2020, 21:40 |
6 |
Scratchsv, верно, об этом говорит расширение .docx (образно. х — как раз и говорит что формат в XML) Добавлено через 3 минуты Добавлено через 4 минуты Не по теме: кстати в статье есть официальное описание формата, не знаю справится ли с ним 1С((
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
09.08.2020, 21:40 |
6 |
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
2017-12-19T18:36:38+00:00<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать шаблон bill.dotx, который используется в примерах ниже.
Как создавать такие шаблоны самому.
Оглавление (нажмите, чтобы раскрыть)
/// Как создать документ Word на основе шаблона из 1с 8.3, 8.2 &НаКлиенте Функция КакСоздатьДокументWordНаОсновеШаблона(ПутьКШаблону) // В шаблоне уже расставлены поля с определенными // именами, например, org_name, inn, kpp и т.д. // Наша задача - заполнить эти поля и сохранить // этот шаблон в виде вордовкского файла с // расширением docx; // Сам шаблон мы создали по инструкции отсюда: // helpme1s.ru/kak-sozdavat-shablony-word-dlya-ispolzovaniya-v-1s // Или взяли готовым отсюда: // helpme1s.ru/files/ref/bill.dotx ПриложениеВорд = Новый COMОбъект("Word.Application"); ОбъектШаблон = ПриложениеВорд.Documents.Add(ПутьКШаблону); Для Каждого Поле Из ОбъектШаблон.Fields Цикл ПолноеИмяПоля = Поле.Code.Text; // Наши предопределенные поля имеют такой // вид: " MERGEFIELD org_name * MERGEFORMAT". // Наша задача - вытащить из этой конструкции org_name // (ну или другое имя, которое мы задали в ворде). Если (Найти(ПолноеИмяПоля, " MERGEFIELD") = 1) Тогда ПозицияСлеша = Найти(ПолноеИмяПоля, "*"); КороткоеИмяПоля = СокрЛП(Сред(ПолноеИмяПоля, 12, ПозицияСлеша - 12)); ЗначениеПоля = ""; Если КороткоеИмяПоля = "id" Тогда ЗначениеПоля = "1"; ИначеЕсли КороткоеИмяПоля = "bill_date" Тогда ЗначениеПоля = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"); ИначеЕсли КороткоеИмяПоля = "org_name" Тогда ЗначениеПоля = "ООО ""Ромашка"""; ИначеЕсли КороткоеИмяПоля = "inn" Тогда ЗначениеПоля = "1234567890"; ИначеЕсли КороткоеИмяПоля = "kpp" Тогда ЗначениеПоля = "123456789"; Иначе // ... и так все нужные поля КонецЕсли; Если ЗначениеПоля <> "" Тогда Поле.Select(); ОбъектШаблон.Application.Selection.TypeText(ЗначениеПоля); КонецЕсли; КонецЕсли; КонецЦикла; // Запишем файл в папку "Мои документы" пользователя ФайлДляЗаписи = КаталогДокументов() + "helpme1c_ru_word_test.docx"; // Если такой файл уже существует - удалим его. УдалитьФайлы(ФайлДляЗаписи); // Сохраняем шаблон как документ Word с расширением docx. ОбъектШаблон.SaveAs(ФайлДляЗаписи); // Не забываем закрыть приложение Word. ОбъектШаблон.Application.Quit(); Возврат ФайлДляЗаписи; КонецФункции /// Скачать и выполнить эти примеры на компьютере
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать шаблон bill.dotx, который используется в примерах ниже.
Как создавать такие шаблоны самому.
Работа с Word в языке 1С 8.3, 8.2 (в примерах)
<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
Метод позволяет быстро создавать и читать документы Word, Excel и PowerPoint напрямую из 1С: Предприятие 8 без установленного Microsoft Office 2007/2010. Скорость создания документов в несколько раз выше, чем традиционное создание через COM/OLE. Статья продолжает серию примеров применения на практике 1С.Net: Предприятие. В статье используется разработка Open XML SDK. Для работы примера необходимы установленные .Net framework 4.0 и Elisy .Net Bridge 4.0.3 и выше. Пример, сопровождаемый статью, написан для 1С: Предприятие 8.2.13.
Стандарт Office Open Xml
Формат Office Open XML (Open Xml) – это формат XML-файлов, помещенных в zip-архив для представления текстовых документов и документов электронных таблиц, диаграмм, презентаций. Компания Microsoft выступила одним из спонсоров сертификации этого стандарта в 2005 году. Результирующий стандарт ISO/IEC 29500:2008 в четырех частях был опубликован в ноябре 2008 года. Начиная с Microsoft Office 2007, формат Office Open Xml стал основным форматом для представления файлов Word, Excel и PowerPoint. Данный формат поддерживают многие аналогичные популярные системы, такие как: OpenOffice, KOffice, Google Docs, WordPerfect и др.
Для программного доступа Microsoft выпустила .Net-библиотеку, включив ее в Open Xml SDK (текущая версия 2.0). Таким образом, Open Xml SDK является альтернативным программным доступом к созданию и чтению документов MS Office. Основным методом программного доступа к файлам Excel, Word и PowerPoint из 1С: Предприятие всегда оставался доступ через COM/OLE.
Описание примера
Пример состоит из внешний обработки для 1С: Предприятие 8.2.13, состоящей из управляемой формы и макета. Пример написан, чтобы показать создание простого docx-документа. Форма содержит 2 элемента управления: поле для ввода пути к файлу docx и кнопку «Создать», а также строковое свойство ПутьКФайлу, привязанное к полю ввода пути.
В обработку в качестве макета вложена.Net-сборка DocumentFormat.OpenXml.dll большого размера (5Мбайт) из проекта Open Xml SDK. Эта сборка заключает в себе огромную функциональность. Точное количество собранных в нее классов неизвестно, но ориентировочно библиотека состоит из порядка 70 пространств имен в среднем по 50 классов в каждом. То есть получается, что вся функциональность реализована через 3500 классов.
Открытие формы сопровождается вызовом обработчика события ПриОткрытии:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьВнешнююКомпоненту(«Elisy.NetBridge4»);
AddIn = New(«AddIn.ElisyNetBridge4»);
net = AddIn.GetNet();
//net = Новый COMОбъект(«Elisy.NetBridge4»);
if (net.Version.CompareTo(net.New(«System.Version», «4.0.3.0»)) < 0) then
Message(«Требуется версия Elisy .Net Bridge 4.0.3.0 и выше»);
return;
endif;
Макет = ПолучитьМакет(«DocumentFormat_OpenXml_dll»);
ДвоичныеДанные = Base64String(Макет);
assemblyBytes = net.CallStatic(«System.Convert», «FromBase64String», ДвоичныеДанные);
net.CallStatic(«System.Reflection.Assembly», «Load», assemblyBytes);
КонецПроцедуры
Событие инициализирует внешний компонент Elisy .Net Bridge, проверяет его версию: версия должна быть не ниже 4.0.3. В более старых версиях .Net Bridge нет возможности вызова универсальных методов, поэтому с ними работать пример не будет.
Далее из макета извлекается вложенная сборка DocumentFormat.OpenXml.dll, переводится в Base64-кодировку, чтобы .Net framework смог воспринять массив байт. Из Base64-формата сборка превращается в массив .Net-байт, который загружается через вызов Assembly.Load.
В примере для простоты макет-сборка передается на клиент, который осуществляет ее загрузку локально. В реальной базе может стать нереальной передача 5 мегабайтной сборки по сети от сервера многим клиентам. В этом случае обработку выгрузки документов следует перевести на сервер 1С.
За создание документа Word отвечает процедура СоздатьФайл, которая вызывает вспомогательные функции GenerateExtendedFilePropertiesPart1 и GenerateMainDocumentPart1.
&НаКлиенте
Процедура СоздатьФайл(Команда)
parent = net.CallStatic(«DocumentFormat.OpenXml.Packaging.WordprocessingDocument», «Create», ПутьКФайлу, net.New(«DocumentFormat.OpenXml.WordprocessingDocumentType»).Document);
extendedFilePropertiesPart1 = parent.AddNewPart(net.T(«DocumentFormat.OpenXml.Packaging.ExtendedFilePropertiesPart»), «rId3»);
GenerateExtendedFilePropertiesPart1().Save(extendedFilePropertiesPart1);
mainDocumentPart1 = parent.AddMainDocumentPart();
GenerateMainDocumentPart1().Save(mainDocumentPart1);
parent.Dispose();
КонецПроцедуры
Здесь создается файл из реквизита ПутьКФайлу через вызов статического метода WordprocessingDocument.Create. (Если необходима загрузка, то за загрузку файла отвечает еще один статический метод WordprocessingDocument.Open). Заполняются свойства файла в функции формы GenerateExtendedFilePropertiesPart1. И создаются непосредственно элементы документа в функции GenerateMainDocumentPart1. В общем приближении создание элементов документа выглядит так:
body = net.New(«DocumentFormat.OpenXml.Wordprocessing.Body»,
net.New(«DocumentFormat.OpenXml.Wordprocessing.Paragraph»,
net.New(«DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties»,
net.New(«DocumentFormat.OpenXml.Wordprocessing.SuppressAutoHyphens»),
spacingBetweenLines.CloneNode(true),
indentation.CloneNode(true),
justificationCenter.CloneNode(true)
),
net.New(«DocumentFormat.OpenXml.Wordprocessing.Run»,
net.New(«DocumentFormat.OpenXml.Wordprocessing.RunProperties»,
runFonts.CloneNode(true),
net.New(«DocumentFormat.OpenXml.Wordprocessing.Bold»),
net.New(«DocumentFormat.OpenXml.Wordprocessing.BoldComplexScript»)
),
net.New(«DocumentFormat.OpenXml.Wordprocessing.Text», «Office Open XML»)
)
),
net.New(«DocumentFormat.OpenXml.Wordprocessing.Paragraph»,
net.New(«DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties»,
net.New(«DocumentFormat.OpenXml.Wordprocessing.SuppressAutoHyphens»),
justificationBoth.CloneNode(true)
Полный код можно посмотреть в самой внешней обработке-примере. Здесь же необходимо отметить, что таким образом строится иерархия элементов:
Body
Paragraph
ParagraphProperties
SuppressAutoHyphens
SpacingBetweenLines
Indentation
JustificationCenter
Run
RunProperties
RunFonts
Bold
BoldComplexScript
Text
Paragraph
ParagraphProperties
SuppressAutoHyphens
SpacingBetweenLines
Indentation
JustificationCenter
Run
RunProperties
RunFonts
Bold
BoldComplexScript
Text
Это простейшая структура. В более сложных решениях могут быть использованы таблицы, рисунки, гиперссылки и другие элементы.
В результате работы примера получится простой документ Word 2007:
Дальнейшее изучение
Есть огромное количество элементов, которые отвечают за построение Open Xml-документов. Только для документов Word их около 900. А иерархия элементов, из которых состоят документы Microsoft Office 2007/2010, может быть очень разветвленной. Как же во всем этом ориентироваться?
В Open Xml SDK были включены утилиты для сравнения Open Xml-файлов, просмотрщик классов и Document Reflector — генератор C#-кода на основе документов.
Самым полезным инструментом является Document Reflector. Он позволяет открыть документ и, кликнув на элемент Package, получить полный код на языке C#. Несмотря на некоторую избыточность, этот код позволит ориентироваться в том, как программно организовать создание документа. Внешне код, полученный через утилиту Documet Reflector, будет выглядеть так:
private static Document GenerateMainDocumentPart1()
{
var element =
new Document(
new Body(
new Paragraph(
new ParagraphProperties(
new SuppressAutoHyphens(),
new SpacingBetweenLines(){ Line = 240, LineRule = LineSpacingRuleValues.Auto },
new Indentation(){ Left = 709, Hanging = (UInt64Value)425UL },
new Justification(){ Val = JustificationValues.Center },
new ParagraphMarkRunProperties(
new RunFonts(){ Ascii = «Arial», HighAnsi = «Arial», ComplexScript = «Arial» },
new Bold(),
new BoldComplexScript(),
new NoProof())),
new Run(
new RunProperties(
new RunFonts(){ Ascii = «Arial», HighAnsi = «Arial», ComplexScript = «Arial» },
new Bold(),
new BoldComplexScript()),
new Text(«Заголовок»)
){ RsidRunProperties = «00887420» },
new Run(
new RunProperties(
new RunFonts(){ Ascii = «Arial», HighAnsi = «Arial», ComplexScript = «Arial» },
new Bold(),
new BoldComplexScript(),
Заключение
Предложенный метод создания документов Word, Excel и PowerPoint является альтернативным методом программного создания и чтения документов Microsoft Office 2007/2010. Метод дает более производительные результаты по сравнению с генерацией документов через COM/OLE. Есть данные о 10-кратном увеличении производительности при генерации некоторых видов документов. Вторым отличительным моментом является то, что на компьютере не требуется устанавливать дорогостоящий продукт MS Office. По трудоемкости метод не сложнее генерации документов через COM/OLE. Формат Open Xml достаточно распространен и поддерживается многими современными системами.
К статье прилагается пример, наглядно демонстрирующий генерацию простейшего docx-документа. Пример создан на базе 1С версии 8.2, но может быть повторен на более старой версии 8.1. В пример зашита библиотека из проекта Open Xml SDK.
Пример может быть переделан или доработан следующим образом. «Тяжелая» в 5 Мбайт сборка может быть помещена в глобальное хранилище сборок или локально на диск. В этом случае не нужно будет двойное преобразование из base64 в массив байт при инициализации.
Пример может быть доработан и на уровне генерации макета. Код генерации макета может быть вынесен из 1С кода и оставлен в виде C# (результат работы утилиты Document Reflector). Такой подход тоже возможен, так как 1C.Net: Предприятие позволяет компилировать код C# «на лету». Но в зависимости от реализации может потребоваться организация дополнительного домена приложений, чтобы вовремя освобождать память после генерации документа.
Еще один вариант получения макета – это вложение docx- или xlsx-файла в макет и загрузка его через соответствующие статические методы. Таким образом можно получить объект-шаблон и обращаться ко всем его методам и свойствам из 1С: Предприятие.
Дополнительные сведения можно найти здесь:
Общие сведения о формате Office Open Xml на английском
Описание проекта Office Xml SDK
Генерируем OfficeOpenXML-документы за 5 минут
Создание отчётов при помощи Open XML Format SDK
CreateOpenXml.epf (1.87 mb)