Чтение примечаний из файла с расширением «docx» без применения COM-объекта

28.02.24

Разработка - Универсальные функции

Добрый день, задачка возникла при внедрении 1С «Документооборот 3.0». Заказчику потребовалось реализовать чтение примечаний из прикрепленного к согласованию Word файла и помещение его в результат согласования при исполнении задачи «Согласовать».

Перед этим, в базе «Документооборот 3.0» был поставлен запрет на загрузку файлов с расширением «doc», так как для его чтения требуется COM объект, что для нас было недопустимо, ну и «doc» устарел слегка.

По заветам профессионалов платформы – «решил задачку, поделись решением» - выкладываю алгоритм, вдруг кому пригодится:

Не секрет, что есть у файла с расширением «docx», поменять это самое расширение на «zip», то мы получим архив с файлами «xml». Так вот примечания хранятся в отдельном файле «comments.xml».
 

//Конвертирует в zip документ docx и читает файл comments.xml из разархивированной папки
//
// Параметры:
//  ДвоичныеДанныеФайла	 - Двоичные данные - Двоичные данные файла Word, который необходимо прочитать
// 
// Возвращаемое значение:
// Строка - Все примечания, которые есть в документе строкой 
//
Функция ИнициализироватьXMLИзDocx(ДвоичныеДанныеФайла)
	
	ПутьКФайлу = ПолучитьИмяВременногоФайла("docx");
	ДвоичныеДанныеФайла.Записать(ПутьКФайлу);
	
	КопироватьФайл(ПутьКФайлу, СтрЗаменить(ПутьКФайлу, "docx", "zip"));
	ИмяФайлаСПутемZIP = СтрЗаменить(ПутьКФайлу, "docx", "zip");
	
	ВременнаяПапкаДляРазархивирования = ПолучитьИмяВременногоФайла("");
	
	Архив = Новый ЧтениеZipФайла();
	Архив.Открыть(ИмяФайлаСПутемZIP);
	Архив.ИзвлечьВсе(ВременнаяПапкаДляРазархивирования, РежимВосстановленияПутейФайловZIP.Восстанавливать);
	Архив.Закрыть(); 
	
	//В этом отдельном файле хранятся примечания скопом
	Файл = Новый Файл(ВременнаяПапкаДляРазархивирования + "/word/comments.xml");
	
	СтрокаПримечания = "";	
	Если Файл.Существует() Тогда		
		СтрокаПримечания = XMLComments(ВременнаяПапкаДляРазархивирования + "/word/comments.xml");		
	КонецЕсли;
			
	УдалитьФайлы(ВременнаяПапкаДляРазархивирования);
	УдалитьФайлы(ПутьКФайлу);
	УдалитьФайлы(ИмяФайлаСПутемZIP);
	
	Возврат СтрокаПримечания;
	
КонецФункции

Функция поиска по тегам "XMLComments":
 


//Ищет теги примечания и берет текстовое значение в указанном файле.Учитываются комментарии только начинающиеся со знака "#"
//
// Параметры:
//  ПутьКФайлу	 - 	Строка  - Путь к xml файлу, который нужно прочитать
// 
// Возвращаемое значение:
// Строка  - прочитанные значения (текст примечаний через перенос строки)
//
Функция XMLComments(ПутьКФайлу)
	
	Файл = Новый ЧтениеXML;
	Файл.ОткрытьФайл(ПутьКФайлу);
	
	МассивПримечания = Новый Массив;
	
	НачалсяКомментарий = Ложь;
	Пока Файл.Прочитать() Цикл			
		Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента И Файл.Имя="w:comment" Тогда
			НачалсяКомментарий = Истина;
			СтрокаПримечаний = "";
			Продолжить;
		КонецЕсли;
		
		Если НачалсяКомментарий И Файл.ТипУзла = ТипУзлаXML.Текст Тогда
			СтрокаПримечаний = СтрокаПримечаний + Файл.Значение;
		КонецЕсли;
		
		Если Файл.ТипУзла = ТипУзлаXML.КонецЭлемента И Файл.Имя="w:comment" Тогда
			НачалсяКомментарий = Ложь;
			МассивПримечания.Добавить(СтрокаПримечаний);
		КонецЕсли;		
	КонецЦикла;
	
	Файл.Закрыть();
	
	Возврат СтрСоединить(МассивПримечания, Символы.ПС + Символы.ПС);
	
КонецФункции

М.б. кому-нибудь будет полезно. 

Если подобные темы работы с файлами Вам интересны, то могу выложить код вставки штрихкода в документ "pdf" и "docx" автоматом после согласования. При этом "docx" блокируется на редактирование паролем.

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

Чтение Word без Com docx Документооборот Чтение файла Без Com xml Документооборот 3.0.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3704    Abysswalker    9    

45

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

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

14.05.2025    6935    DeerCven    15    

59

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    50303    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    7451    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    63374    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9303    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1898897 29.02.24 09:26 Сейчас в теме
Интересная тема. Также любопытна реализация вставки штрихкода в документ, делал аналогичную вещь, хочется посмотреть и на ваше решение.
Natalia29; +1 Ответить
2. Luis-Gomer 60 01.03.24 11:50 Сейчас в теме
(1) Спасибо за отзыв, за выходные составлю - выложу.
3. MrShvets 23.05.24 07:49 Сейчас в теме
(2) Тоже интересно посмотреть на приемы работы с pdf.
Natalia29; +1 Ответить
4. NikVeega 06.08.24 10:12 Сейчас в теме
Публикация классная, с учетом того, что мало где написано про работу с docx без word. А на какой текст или строку ссылается примечание удается получить?? потому что просто примечания не всегда информативно, без указания места!
5. Sindbad_M 136 19.11.24 12:08 Сейчас в теме
(4)
Точку в тексте документа, к которой относится примечание, получить не сложно. У элемента w:comment есть атрибут w:id - уникальный в пределах документа идентификатор комментария.

Можно просмотреть файл document.xml, в нем будут элементы w:commentReference с атрибутом w:id, для каждого комментария свой элемент w:commentReference. Если комментарий соответствует какой-то области текста, то в document.xml помимо элемента w:commentReference также будут элементы w:commentRangeStart и w:commentRangeEnd, соответствующие началу и концу текстовой области.
NikVeega; +1 Ответить
6. Now 21 14.11.25 15:49 Сейчас в теме
(4) Посмотрите как построена работа с офисными документами в типовых конфигурациях, например, в Управление торговлей, 11.5.22.xxx, конкретно функции и процедуры МакетИзДвоичныхДанныхСКД(), ИнициализироватьСтруктуруМакетаСКД()
NikVeega; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация