Работа с MS Word из 1С "для самых маленьких"

Публикация № 488556 12.05.16

Разработка - Практика программирования

MS WORD

Данная статья - попытка собрать сведения по работе (на начальном уровне) с MS Word в одном месте. На infostart.ru и других сайтах полно похожего материала, и при наличии должной усидчивости это все можно найти. Хотелось собрать основные моменты в одном месте.

Публикация - своего рода памятка, содержащая примеры кода для:

1. заполнение шаблона Word данными из 1С;
2. заполнение колонтитулов Word данными из 1С;
3. заполнение таблицы в Word данными из 1С;

Начало работы

В большинстве случаев перед нами ставится следующая задача: 
Нужно открыть документ Word, заполненный данными из 1С.

Для этого нам нужно подготовить шаблон документа Word. Не путайте это с Word Template, специальные файлы Word, которые содержат настройки документов для многократного использования. Нам нужен обычный вордовский документ с расширениеми *.docx или *.doc.  А далее поместить этот документ в макет с двоичными данными.

Попытка
 //Получаем макет из двоичных данных
   Шаблон = ПолучитьМакет(ДополнительныеПараметры.ВидДоговора);
 ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
   Шаблон.Записать(ИмяФайла);
 //Создаем COM-объект для работы с Word
   ОбъектВорд = Новый COMОбъект("Word.Application");
   ОбъектВорд.Documents.add(ИмяФайла);
 //В Word можно открывать в одном приложении несколько документов, поэтому ОбъектВорд.Application.Documents - это коллекция открытых документов.
 //В нашем случае документ открыт всегда один
   ДокументВорд = ОбъектВорд.Application.Documents(1);
   ДокументВорд.Activate();
   Исключение Сообщить("Ошибка при запуске приложения "+ОписаниеОшибки());
 КонецПопытки;
//Разумеется, получение COM-объекта нужно поместить в попытку. Мало ли, что-то пойдет не так.

Читатель может справедливо заметить, что используется модальный вызов, и погрозить автору пальцем. И будет прав.

//Создадим структуру параметров документа
 ПараметрыДокумента = ПодготовитьСтрукутруПараметров();
 //Заполним структуру параметров документа
 ЗаполнитьСтруктуруПараметров(ПараметрыДокумента);

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

Углубимся немножко в принципы работы Word...

Каждый документ Word разделен на разделы, которые состоят из страниц.

Для каждого раздела есть возможность создавать свою нумерацию элементов, уникальные колонтитулы и настройки параметров страницы. Так, например, чтобы повернуть одну из страниц (вывести на печать как альбомную), нужно создать под неё отдельный раздел.


Каждая страница Word разделена на несколько областей:

  • Верхний колонтитул 
  • Основной текст
  • Нижний колонтитул

Нужно заметить, что в каждом разделе может быть уникальный колонтитул для первой страницы.

//Объект, содержит весь основный текст из всех разделов 
ДокументВорд.Content
//Объект содержит коллекцию разделов документа
ДокументВорд.Sections
//В каждом разделе есть своя коллекция для верхних колонтитулов
ДокументВорд.Sections(1).Headers
//И своя коллекция для нижних колонтитулов
ДокументВорд.Sections(1).Footers
//При этом, если стоит галочка "Уникальный колонтитул для первой страницы", то коллекции Headers и Footers будут содержать два элемента

 

Заполнение пользовательских параметров

При обращении к этим коллекциям мы можем выполнять в них поиск и получать встроенные объекты, например, таблицы.

Теперь мы более-менее поняли, как обращаться к областям Word, можем в них пошуровать и выполнить замену наших параметров:

//Переберем все параметры и заменим их в документе
Для каждого Параметр Из ПараметрыДокумента Цикл
  ВыполнитьЗамену(ДокументВорд.Content, Параметр.Ключ, Параметр.Значение);
//Ищим вхождения параметра в верхнем колонтитуле
  ВыполнитьЗамену(ДокументВорд.Sections(1).Headers.Item(1).Range(), Параметр.Ключ, Параметр.Значение);
//Ищим вхождения параметра в нижнем колонтитуле первой и последующих страниц               
  ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(1).Range(), Параметр.Ключ, Параметр.Значение);    
  ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(2).Range(), Параметр.Ключ, Параметр.Значение);
КонецЦикла;

//Выполнить поиск и замену Функция
ВыполнитьЗамену(знач Object, Параметр, Значение)
  Object.Find.Execute(Параметр,,,,,,,,,Значение,2)
КонецФункции

 

Рассмотри подробнее метод Execute. Его параметры идентичны диалоговуму окну при замене/поиске непоседресвенно из MS Word: 

А вот и основные параметры (вольный перевод справки MSDN):

  1. Искомый текст - Строка - Текст для замены. Текст может содержать специальные параметры. Например, ^p - абзац, ^t - табуляция
  2. Чувствительность к регистру - Булево - Если истина, то поиск будет осуществляться с учетом регистра
  3. Слова целиком - Булево - Если истина, то ищутся слова целиком. Вхождение слов не учитываются. Например, при поиске слова дом будет пропущено слово домашний
  4. Использовать подстановочные знаки - Булево - Если истина, то используются встроенные регулярные выражения.
  5. Искать похожие - Булево - Если истина, то результат поиска будет содержать похожие слова
  6. Искать все формы - Булево - Если истина, то результат поиска будет содержать различные формы слов.
  7. Поиск сначала - Булево - Если истина, то будет осуществляться с начала до конца документа
  8. Охват - WdFindWrap - Опредяляет направление поиска
  9. Формат - Format - Формат искомого текста
  10. Строка замены - Строка - Строка, на которую будет заменен исходный текст
  11. Количество замен - WdReplace - Определяет сколько раз выполнять замену
  12. и т.д.

WdReplace - Constant Value:
wdReplaceAll 2 
wdReplaceNone 0 
wdReplaceOne 1

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

//УправлениеПечатьюMSWordКлиент c незначительными изменениями для конфигурации УПП 1.3
Функция ВыполнитьЗамену(знач Object, Параметр, Значение)
  СтрокаПоиска = "[" + Параметр + "]";
  СтрокаЗамены = Строка(Значение);
//Необходимо выделить областей, в которой мы осуществляем замену
  Object.Select();
//Получаем выделенную область
  Selection = Object.Application.Selection;
//Найдем все вхождения параметра и заменим его на нужное нам значение
  FindObject = Selection.Find;
  FindObject.ClearFormatting();
  Пока FindObject.Execute(СтрокаПоиска) Цикл
    Если ПустаяСтрока(СтрокаЗамены) Тогда
      Selection.Delete();
    Иначе
      Selection.TypeText(СтрокаЗамены);
    КонецЕсли;
  КонецЦикла;
//Отменим выделение
  Selection.Collapse();
КонецФункции

Уже получив выделенную область можно отредактировать стиль текста, шрифт и т.д.

//Редактирование шрифта
 Selection.Font
//Редактирование цвета
 Selection.HighlightColorIndex

Также есть второй подход, использующий такой объект Word, как поля. Мне он не очень нравится, т.к. в больших документах, порядка 100 страниц, эти поля начинают глючить (исчезать, не подставлять нужные значения) и прочая ерунда. Ну по крайней мере в Word 2007. Но я его все равно приведу:  

При подготовке шаблона в тело документа необходимо навставлять полей с типом DOCVARIABLE (можно вставлять горячими клавишими Ctrl+F9).

Доступ к таким полям можно получить следующим нехитрым образом:

ДокументВорд.Variables.Item(НазваниеПараметра).Values

Заполнение таблиц по шаблону

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

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

К таблицам можно получить доступ через области документа.

//Получаем доступ к первой таблице в основном тексте
 Таблица = ДокументВорд.Content.Tables(1)

Далее, получив таблицу, мы работаем с ней по привычной схеме - строки, столбцы.

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

//Данные для заполнения
  ПараметрыТЧ = ПараметрыДокумента.ПриложениеТЧ;
//Нужно оставить шапку и первую строку нетронутой Итератор = 2;
  Таблица = ДокументВорд.Content.Tables(3);
  Для каждого Строка Из ПараметрыТЧ Цикл
//По умолчанию добавляет строку выше первой
    Таблица.Rows.Add();
    ЗаполнитьСтрокуТаблицы(Таблица, Итератор, Строка,"ПП,НоменклатураНаименование,ЕдИзмерения,ЦенаСтрокой",ПараметрыТЧ );
    Итератор = Итератор + 1;
  КонецЦикла;
//Структура шаблонов содержит Наименование колонок и их порядок
  Процедура ЗаполнитьСтрокуТаблицы(Таблица, НомерСтроки, ЗначениеЗаполнения, СтруктураШаблонов,ТаблицаЗначений)
    МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураШаблонов,",");
    Итератор = 1;
    Для каждого Строка Из МассивСтрок Цикл
      Если ТаблицаЗначений.Колонки.Найти(Строка) = Неопределено И Строка <> "ПП" Тогда
        Итератор = Итератор + 1;
        Продолжить;
   //Не забываем, что Шапка тоже строка, а при нумерации нам нужно её исключить
      ИначеЕсли Строка = "ПП" Тогда
        Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(НомерСтроки-1);
        Итератор = Итератор + 1;
        Продолжить;
      КонецЕсли;
      Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(ЗначениеЗаполнения[Строка]);
      Итератор = Итератор + 1;
   КонецЦикла;
КонецПроцедуры

 

Вот, в принципе, и все. Основные вопросы, возникающие при работе с Word, я постарался осветить. Надеюсь, данный обзор поможет вам в работе =)

Спасибо за советы и комментарии:
v3rtermonkbest

Критика только приветствуется. Чем больше замечаний, тем лучше будет гайд =)

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. maXon777 116 12.05.16 10:30 Сейчас в теме
Прекрасный обзор! Спасибо!

Очень понравился подход с программным заполнением таблицы путем добавления строк!
AhtungG; Rustam10; +2 Ответить
58. gurd 5 18.12.19 16:35 Сейчас в теме
А что если сделать закладки и циклом делать обход закладок и заполнять текст закладки? Например:

СтруктураДанных - это может быть как структура, так и соответствие

ДокументВорд = Ворд.Application.Documents(1);
Закладки = ДокументВорд.Bookmarks;
Для Каждого Закладка Из Закладки Цикл
	Закладка.Range.Text = СтруктураДанных[Закладка.Name];
КонецЦикла;
59. Сурикат 351 18.12.19 18:18 Сейчас в теме
(58)

Да, так тоже можно.
Не уверен, что если параметр встречается два раза закладки, отработают корректно (редко с ними работал).

И большинство пользователей увы тоже =(

Можно сделать кроссплатформенно и заменять значения напрямую в docx, не используя COM-объек => не требуется установки word
DOCX - это ZIP-архив с xml
60. gurd 5 18.12.19 22:11 Сейчас в теме
(59) да в этом с закладки может быть неудобно - если параметр несколько раз встречается то закладку в несколько мест с одним именем на вставить.
2. GOOD256 75 12.05.16 13:52 Сейчас в теме
3. pvl_mksv 20 12.05.16 14:25 Сейчас в теме
4. gradi 5 12.05.16 16:44 Сейчас в теме
В ворд2013 глюков с DOCVARIABLE не замечал.
jollyk; Dizel; LevV; +3 Ответить
7. Сурикат 351 12.05.16 23:17 Сейчас в теме
(4) gradi,
На небольших документов действительно все хорошо работает (на небольших я имею ввиду несколько десятков страниц). Когда количество приближается к 100 возможно непонятное поведение параметров. По использованию полей во мне больше говорит пользователь, который в свое время много с ними мучился =)
5. DJDUH 17 12.05.16 17:14 Сейчас в теме
Самая "засада" MSWord - это вставить значение в шейпы или иные надписи и картинки - сколько не игрался так и не получилось, найти выход - находит нужное, а значение вставить фига(
8. Сурикат 351 12.05.16 23:22 Сейчас в теме
(5) DJDUH,
К сожалению или к счастью с таким не сталкивался =)
Могу только посоветовать покурить MSDN в части свойств и методов указанных вами коллекций. Если получиться, дайте знать. Добавлю к публикации =) Ну или сами созреете для написания кратенького гайда =)
9. gradi 5 13.05.16 13:15 Сейчас в теме
(5) DJDUH, у вас не получалось именно вставить значение или добиться его отображения в документе?
6. director04 3643 12.05.16 20:25 Сейчас в теме
Поставил плюс за краткость. И хотел бы еще одни плюс за заголовок.
Хотя,... есть тут пара засранцев, которые обязательно нагадят, что де "все это всем давно известно..."
Спасибо, плюс
10. nni93 13.05.16 15:30 Сейчас в теме
11. AndMax 2 17.05.16 14:43 Сейчас в теме
Коротко и красиво, спасибо, +
12. stilet 50 18.05.16 11:05 Сейчас в теме
Подскажите, может кто нибудь сталкивался - как изменить цвет фона у какого нибудь набора символов (скажем двух или трех слов)
13. Сурикат 351 18.05.16 11:36 Сейчас в теме
(12) stilet, а он у вас все время разный?
15. v3rter 18.05.16 12:27 Сейчас в теме
(12) stilet, если выделенного текста желтым, то
Selection.Range.HighlightColorIndex = wdYellow
adhocprog; +1 Ответить
14. v3rter 18.05.16 12:24 Сейчас в теме
Базовый метод работы с Word - записываем макрос с нужными действиями, читаем его, читаем хелп к нужным командам, чистим макрос от лишних действий и параметров, копируем в 1С, добавляя "ДокументВорд." перед командами.

По поводу параметров - был и есть старый дедовский метод, когда параметр вставлялся в виде текста типа [Мой_параметр], {Мой_параметр}, [{(%%Мой_параметр%%)}] - на выбор, затем командной поиска и замены самого ворда параметры меняются на значения.

Кстати, проверяли: Application.Visible = False вначале и Application.Visible = True в конце действий ускоряет или нет?
Zhilyakovdr; gradi; monkbest; +3 Ответить
20. Сурикат 351 22.05.16 14:09 Сейчас в теме
(14) v3rter,
Application.Visible = False вначале и Application.Visible = True в конце действий не ускоряет процесс. Проверил =)
16. sudmorsh 57 18.05.16 16:18 Сейчас в теме
Очень полезно, спасибо ;)
17. v3rter 18.05.16 16:40 Сейчас в теме
Записал в ворде макрос замены текста во всем документе, кроме колонтитулов.

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "что"
.Replacement.Text = "на что"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.EscapeKey
Показать

Возможно, будет полезен.

Из хелпа:
WdReplace
Constant Value
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1
Сурикат; +1 Ответить
18. monkbest 112 19.05.16 08:07 Сейчас в теме
(17) v3rter, зачем искать в цикле?
я делаю так
ТекДок.Content.Find.Execute("%параметр%,,,,,,,,,"мой текст",2);

меняет сразу во всем документе, работает гораздо быстрее, чем искать в цикле
Andreyyy; Rustam10; Daynestro07; zhernikov; gigapevt; Сурикат; +6 Ответить
19. v3rter 19.05.16 10:04 Сейчас в теме
(18) monkbest, ну так я на это и намекал. Ждём от автора версию 2.0
21. isanka 23.05.16 14:02 Сейчас в теме
Спасибо за труды.
Для старта очень познавательно.
Вопрос.
как прочитать текст содержащийся в полученной таблице ?
и как заполнять таблицы в ворде данными не переписывая строки самой таблицы, а просто заполняя ее данными?
(пробовала заполнять в цикле (Таблица.Cell(ИндексСтрока+1,ИндексСтолбец+1).Range().InsertAfter(Текст),
так очень долго, да и местами таблицы уже частично заполнены, может есть возможность загрузить данные в таблицу с заранее известным количеством строк и столбцов?
или это из области фантастики?)


23. Сурикат 351 23.05.16 18:12 Сейчас в теме
(21) isanka,
Мне другие способы не знакомы. Можно заполнять же только некоторые ячейки. Обращение по номеру строки/столбца это позволяет.
Поищите как word с ADO дружит =) В Excel ADO дает неплохой прирост производительности. Если найдете, дайте знать =) Добавим в публикацию =))
24. v3rter 24.05.16 16:16 Сейчас в теме
(21) isanka, Попробуйте Таблица.Cell(ИндексСтрока+1,ИндексСтолбец+1).Range().Text или Таблица.Cell(ИндексСтрока+1,ИндексСтолбец+1).Range.Text

Всё это гуглится, но не на русском: https://msdn.microsoft.com/ru-ru/library/office/ff821612.aspx
22. Сурикат 351 23.05.16 18:10 Сейчас в теме
Приношу извинения за небольшие проблемы с форматированием =(( Подвел новый редактор.
25. freud 2 23.11.16 19:54 Сейчас в теме
windows 10 + ms office
1c выдает

ОбъектВорд = Новый COMОбъект("Word.Application")


Не удалось создать объект.
Возможно, отсутствует соответствующее приложение.

в чем причина
asviridovsky; +1 Ответить
26. sssss_aaaaa_2011 23.11.16 20:33 Сейчас в теме
(25) В том, что последние версии оффиса не имеют СОМ-объектов.
27. Сурикат 351 25.11.16 08:38 Сейчас в теме
(25)А где выполняется код? на сервере или на клиенте?
28. HalfZer0 15 02.06.17 12:43 Сейчас в теме
Я требую больше версий слова Стурктура, то есть Струкутра, то есть... ааааа!!!
maXon777; +1 Ответить
29. fish249 03.08.17 09:35 Сейчас в теме
30. MiniGrad2014 10.08.17 21:47 Сейчас в теме
Не помещая документ в макет можно напрямую заполнять поля шаблона ворда?
31. Tanis 29.09.17 09:53 Сейчас в теме
Доброе утро!

Как раз очень нужный вопрос.

Подскажите, плиз. Выполнение заполнения шаблона происходит на стороне клиента (пользователя) или на сервере?

Если есть вариант заполнять именно на сервере, то как это можно реализовать?

Спасибо!
32. Сурикат 351 29.09.17 12:06 Сейчас в теме
На сервере можно заполнять только в том случае, если стоит на нем Word. Иначе только ковыряние в XML.
33. Tanis 29.09.17 15:07 Сейчас в теме
Да. Поставили туда специально Ворд.

А как осуществить это? подскажите, пожалуйста.

Как передать макет на сервер, до его получения пользователем?

Спасибо!
34. tjurikov_ivan 207 29.09.17 15:20 Сейчас в теме
(33) В 1С ДО заполнение шаблонов на сервере происходит через фоновое задание
35. user697645_gonchar.m 29.09.17 15:23 Сейчас в теме
36. Сурикат 351 29.09.17 16:25 Сейчас в теме
Эм...
У вас 1с ДО?

Можно и без фонового задания.
Сохраняете в двоичные данные, а на сервере получаете.

Если нужно пользовательский макет, то двоичные данные сериализуются
37. Tanis 29.09.17 17:13 Сейчас в теме
Хм....

Тогда еще вопрос, а как сохранить этот шаблон в двоичные данные, для передачи на сервер?

Макет сделан как Актив документ.

Word = ЭтотОбъект.ПолучитьМакет("ШаблонВорда").Получить();

При этом сразу ошибка, что мол нет программы....
38. Сурикат 351 29.09.17 17:45 Сейчас в теме
А зачем вам макет active document, если можно сразу сделать двоичные данные и передавать на сервер?
Ведь вы все равно его для заполнения будете на диск сохранять =)
39. Tanis 29.09.17 19:10 Сейчас в теме
Так макет же является - актив документ.

В данном случае сохранение используется. Но могу сказать, что можно воспользоваться без сохранения. )))))
40. Сурикат 351 30.09.17 12:25 Сейчас в теме
(39)

Не используйте актив документ =) Это достаточно ущербная вещь, использование которой не дает никаких преимуществ, а добавляет только проблем.
41. Tanis 30.09.17 18:12 Сейчас в теме
Добрый вечер!

А чем они стали ущербные ((((

Что предлагаете? Держать шаблон на диске или вообще перетаскивать в макет?

Спасибо!
42. Сурикат 351 30.09.17 20:01 Сейчас в теме
Ущербные потому что править их довольно-таки тяжело, неудобный интерфейс. Возможно я что-то не знаю или это субъективно...
Предлагаю редактировать в Word и держать в макете с типом двоичные данные.
43. artms 241 27.10.17 09:07 Сейчас в теме
44. ZMD2065 08.02.18 12:23 Сейчас в теме
Коллеги, добрый день. Столкнулся с тем что в ЗУП 3.1 платформа 8.3.10.2667 при загрузке шаблона word 2013 не подтягиваются колонтитулы и рисунки. Может нужны какие-то специальные настройки в 1С или в word? Подскажите пожалуйста.
61. gucci76 347 29.01.20 22:56 Сейчас в теме
(44) Тоже с этим столкнулся. Хотел с помощью БСП напечатать. Если заменить word2013 на другой, то все нормально будет?
66. gucci76 347 14.02.20 14:23 Сейчас в теме
(61)Проверил.
Не в ворде дело.
Может кто видел пример как выводить колонтитулы?
Все примеры, что находил без них обходились. На сайте ИТС тоже искал - про колонтитулы только упоминание, а примера нет
Делал как мне кажется как в инструкции, но нет колонтитулов, хоть тресни
67. Сурикат 351 14.02.20 16:38 Сейчас в теме
(66)
как мне кажется как в инструкции, но нет колонтитулов, хоть тресни

А что вы хотите в итоге получить?
Заполнить колонтитулы данными или добавить колонтитутул по макету?
68. gucci76 347 14.02.20 18:00 Сейчас в теме
(67) Клиенты дали печатную форму с колонтитулами. Просто их выводить, без заполнения. В верхнем есть эмблема организации в виде картинки.
69. Сурикат 351 14.02.20 18:31 Сейчас в теме
(68)

Тогда зачем вы пытаетесь сделать что-то программно? =)
Запихиваете вашу форму в двоичные данные/ActiveX (если в нем поддерживаются колонтитулы) и их не трогаете =)
70. gucci76 347 14.02.20 22:02 Сейчас в теме
(69)БСП хочу использовать. Я не программно, а так как 1С рекомендует. Может я не в той теме написал. Просто когда по яндексу искал похожие ошибки, то только эту тему нашел.
45. Pavel Rodinchenko 20.02.18 10:54 Сейчас в теме
Спасибо за статью. Очень полезно
46. AlexeyK1 14 20.03.18 13:42 Сейчас в теме
А что же самых маленьких не учим с пеленок за собой убирать?
надо бы добавить уничтожение объектов и файлов.
а так статья хорошая )))

РS а то как открывать учим
//Разумеется, получение COM-объекта нужно поместить в попытку. Мало ли, что-то пойдет не так.

а как в Исключении прибить и почистить нет
47. Сурикат 351 20.03.18 14:21 Сейчас в теме
(46)
Я как-то верю в умные указатели...
Думаете не стоит? =)

Спасибо за замечание =)
48. Forrest_Gump 23.03.18 09:21 Сейчас в теме
Подскажите а чем могут быть "тормоза"???...
простенький шаблон договора 6 страниц... 30 параметров для замены...
Прикрепленные файлы:
49. pchelov 16.04.18 16:59 Сейчас в теме
Метод "Execute" имеет ограничение на длину значения для замены в 255 символов, если будет больше, то появляется исключение. Я написал небольшую процедуру для выполнения замены частями:

Процедура ВыполнитьЗаменуСОграничениемДлиныСтроки(вхДокументВорд, вхШаблонЗамены, вхЗначение)

// Замена значений в ворде имеет ограничение на длину в 255 символов.
// Разобьем значение на куски по 255 знаков

МаксДлинаСтроки = 255;

ИДШаблона = "@"+СтрЗаменить(Новый УникальныйИдентификатор, "-", "");

МаксДлинаСтроки = МаксДлинаСтроки-СтрДлина(ИДШаблона);

ТекШаблон = Строка(вхШаблонЗамены);
НеРазбитоеЗначение = Строка(вхЗначение);

МассивЧастейСтроки = Новый Массив;

Пока СтрДлина(НеРазбитоеЗначение)>0 Цикл

ЧастьНужнойДлины = Лев(НеРазбитоеЗначение, МаксДлинаСтроки);

МассивЧастейСтроки.Добавить(ЧастьНужнойДлины);

НеРазбитоеЗначение = Сред(НеРазбитоеЗначение, МаксДлинаСтроки+1, МаксДлинаСтроки);

КонецЦикла;

Для Каждого ЧастьСтроки Из МассивЧастейСтроки Цикл

вхДокументВорд.Application.Selection.Find.Execute(ТекШаблон,,,,,,,,, ЧастьСтроки+ИДШаблона, 1);

ТекШаблон = ИДШаблона;

КонецЦикла;

вхДокументВорд.Application.Selection.Find.Execute(ТекШаблон,,,,,,,,, "", 1); // Зачистим остатки шаблона

КонецПроцедуры
windsurf; awp; +2 Ответить
50. user608357_elpst 14.08.18 17:00 Сейчас в теме
Добрый день. А не подскажите - можно ли в созданный документ *.docx в нижний колонтитул внести произвольный текст и номер страницы?
51. named_Alexander 20.09.18 12:01 Сейчас в теме
А куда писать этот код ? Мне надо его в Справочник, модуль формы элемента поместить, чтоб Договор заполнялся данными из формы элемента. Создал в нужном мне справочнике макет с двоичными данными, потом в форме элемента создал кнопку и в событиях кнопки вставил код, Но он не работает там. Еще непонятно, где что выполняется, что на клиенте, а что на сервере ? Подскажите пожалуйста 1С УТ 11
52. Сурикат 351 21.09.18 13:36 Сейчас в теме
(51)
В УТ11 сложнее. На сервере или на клиенте у вас Word стоит?
53. named_Alexander 21.09.18 13:47 Сейчас в теме
54. user1132956 20.06.19 06:48 Сейчас в теме
Очень не понятно! решил впервые распечатать из Word, и что в итоге? Добавил файл ворд в макеты через двоичные данные, вставил код, сразу же заругался на "ДополнительныеПараметры.ВидДоговора" - что это такое, откуда брать и зачем? если уж называете статью, для самых меленьких, тогда хоть что-то объясняйте
55. Сурикат 351 20.06.19 09:15 Сейчас в теме
(54)

К сожалению, в одной статье не научить программированию и одновременно работе с word =(

Если бы вы открыли в синтакспомощнике описание метода ПолучитьМакет, то увидели бы, что он принимает в качестве первого параметра имя макета с двочиными данными =)
56. rjkjlptq 15 03.07.19 10:51 Сейчас в теме
Добрый день!
Подскажите, как вывести все значения через запятую в строку без использования таблицы.


Для каждого Параметр Из СтруктураПараметров.ТЧПостояннаяЧасть Цикл

СтруктураПараметров.ДанныеШапка.Площадь = Формат(Параметр.Площадь,"ЧЦ=15; ЧДЦ=1");

КонецЦикла;
57. Сурикат 351 03.07.19 15:50 Сейчас в теме
(56)
как вывести все значения через запятую в строку без использования таблицы.


Несовсем понятно какие данные на входе и какие должны быть на выходе...

P.S.
Возможно вам поможет СтрСоединить()
62. Tasha1C 06.02.20 11:10 Сейчас в теме
За статью +++. Все коротко и ясно!
63. ProkopyukIN 11 13.02.20 11:11 Сейчас в теме
подскажите как мне в клиент серверном режиме сделать.
макет в виде word храниться в Макетах. Заполняется на клиенте, как мне получить шаблон для заполнения по закладкам?

&НаСервере
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Макет = ОбработкаОбъект.ПолучитьМакет("МакетWord");
Возврат Макет;

пробовал получить макет на сервере функцией и вернуть на клиент - active document не передает. неизвестный тип
64. Сурикат 351 13.02.20 12:28 Сейчас в теме
(63)
Вам нужно хранить не в ActiveX макет, а в двоичных данных. В таком случае он спокойно передается на клиент =)
65. ProkopyukIN 11 13.02.20 16:29 Сейчас в теме
(64) я как в таком виде закладки ставить и заполнять данными? по такому же принципу?
71. user1195203 03.07.20 09:50 Сейчас в теме
//Объект, содержит весь основный текст из всех разделов ДокументВорд.Content

Видимо энтер пропущен после "разделов".
Сурикат; +1 Ответить
72. littlekan 05.10.20 09:51 Сейчас в теме
Всем привет!
Подскажите, пожалуйста, как можно вставить текст после таблицы?
Пробовал считать строки таблицы, и потом спускаться на их количество, но получается какая-то ерунда, текст прыгает.
73. vavka 6 20.04.21 19:06 Сейчас в теме
Спасибо! Помог.
ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(2).Range(), Параметр.Ключ, Параметр.Значение);

подходит для формирования параметра на первой странице
74. aleks xantaev 8 28.06.21 17:47 Сейчас в теме
Подскажите как программно удалить водяной знак в ворде? Мне необходимо от различных условий удалять водяной знак.
75. Max_Kammirer 04.08.21 12:13 Сейчас в теме
А кто-то сталкивался с тем, чтобы кодом (программно) можно было отключать Заметки в ворде?
76. isanka 05.08.21 10:03 Сейчас в теме
День Бодрый.
Столкнулась с ошибкой при формировании документов Word из !С.
процедурой
Процедура ПоискИЗаменаВВордеИнУм(ОбъектВорд , Знач ТекстПоиска = "", Знач ТекстЗамены = "")
	
	ТекстЗамены = Строка(ТекстЗамены);
	
	ТекстПоиска = Строка(ТекстПоиска);
	
	Если ПустаяСтрока(ТекстПоиска) И ПустаяСтрока(ТекстЗамены) Тогда
		Возврат;
	КонецЕсли;
	
	ОбъектВорд.Selection.Find.Execute(ТекстПоиска,,,,,,,,,ТекстЗамены,2);
	
КонецПроцедуры
Показать

на строке
ОбъектВорд.Selection.Find.Execute(ТекстПоиска,,,,,,,,,ТекстЗамены,2);

{ОбщийМодуль.РаботаСWordДокументами.Модуль(208)}: Ошибка при вызове метода контекста (Execute)
ОбъектВорд.Selection.Find.Execute(ТекстПоиска,,,,,,,,,ТекстЗамены,2);
по причине:
Произошла исключительная ситуация (Microsoft Word): Слишком длинный строковый параметр.

Кто сталкивался с ограничением строки?
Может видит где ошибка?
в Word 2016.
Спасибо =)
77. SlavaKron 05.08.21 10:28 Сейчас в теме
(76) Попробуйте так:
Процедура ПоискИЗаменаВВордеИнУм(ОбъектВорд , Знач ТекстПоиска = "", Знач ТекстЗамены = "")
    
    ТекстЗамены = Строка(ТекстЗамены);
    
    ТекстПоиска = Строка(ТекстПоиска);
    
    Если ПустаяСтрока(ТекстПоиска) И ПустаяСтрока(ТекстЗамены) Тогда
        Возврат;
	КонецЕсли;
	
	ОбластьДокумента = ОбъектВорд.ActiveDocument.Content;
	ОбластьДокумента.Collapse(1);
	
	Поиск = ОбластьДокумента.Find;
	Поиск.Forward = True;
	Поиск.Text = ТекстПоиска;
	
	Пока Поиск.Execute() Цикл
		ОбластьДокумента.Select();
		ОбъектВорд.Selection.TypeText(ТекстЗамены);
	КонецЦикла;
    
КонецПроцедуры
Показать
78. isanka 05.08.21 10:56 Сейчас в теме
Заработало! ))
Slava Kron - Спасибо! Ты супер
Пошла сравнивать варианты отладке.
Оставьте свое сообщение

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Практика программирования v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    3507    Eugen-S    20    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    9647    Neti    8    

Неочевидные нюансы записи управляемой формы

Практика программирования v8 v8::УФ Платформа 1C v8.2 1cv8.cf Бесплатно (free)

Разберем несколько нюансов записи управляемой формы.

02.04.2021    10999    SeiOkami    52    

Обзор полезных методов БСП 3.1.4

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

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

25.03.2021    34942    rayastar    51    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    84641    Serginio    113    

Звуковое управление в 1С 8.3

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    6652    velemir    31    

Доработка проведения в ERP 2.5. (Регистры накопления, Регистры сведений)

Практика программирования v8 ERP2 БУ Бесплатно (free)

Покажу точки входа для доработки "типового" проведения документов в ERP для регистров оперативного учета. Рассмотрим три основные ситуации: нужно изменить имеющееся проведение документа; нужно сделать записи в существующие регистры; нужно с нуля описать алгоритм проведения в добавленный регистр. Пример реализован на 1С:ERP Управление предприятием 2 (2.5.4.120)

10.01.2021    9918    BuriyLesha    10    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

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

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    8323    comol    31    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    40665    unichkin    74    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

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

30.08.2020    18896    quazare    34    

Серверные вызовы, которые нельзя вызывать

Практика программирования v8 v8::УФ 1cv8.cf Бесплатно (free)

Не баян, а классика. Рассмотрим особенность платформы настолько же древнюю, как сами УФ.

12.05.2020    8895    SeiOkami    34    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    35536    tormozit    106    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    69615    user5300    19    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    61293    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    41490    John_d    22    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    82379    tormozit    131    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    33157    kuzyara    38    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    23245    YPermitin    62    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    11839    Sibars    19    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    53703    tormozit    51    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

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

07.10.2019    38700    HostHost    41    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    51096    Yashazz    56    

О программе Postman для тестирования API и для чего она нужна 1С-нику

Практика программирования Программное обеспечение (software) v8 Бесплатно (free)

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    19380    budidich    31    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    50464    tormozit    74    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    95463    rpgshnik    75    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    74211    ids79    55    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    44394    YPermitin    25    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    17748    m-rv    3    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    29802    YPermitin    81    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    43907    ids79    20    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    143432    ids79    75    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    22979    m-rv    18    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    58041    avalakh    26    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    39683    json    15    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    100753    ids79    16    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    36180    m-rv    23    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    47080    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    33097    YPermitin    14    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    22250    SeiOkami    53    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    30565    itriot11    34    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    80558    ids79    18    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    73506    ids79    28    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

Практика программирования v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    42180    YPermitin    8    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

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

16.05.2019    61232    YPermitin    31    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    41914    ellavs    131    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    31537    ellavs    90    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    40323    YPermitin    53