При разработке печатных форм часто возникает задача вывода сложных текстовых документов: договоров, доверенностей, соглашений или путевых листов. Переносить форматирование длинного связного текста из Microsoft Word в стандартный табличный документ 1С (MXL) бывает трудоемко, поскольку табличная модель ячеек и колонок нарушает исходное оформление абзацев. Разберем основные подходы к решению этой задачи: от прямой печати по шаблонам Word через механизмы платформы до заполнения документов с помощью COM-объектов и закладок.
Один из самых распространенных методов работы с файлами .doc и .docx — автоматизация приложения Word через COM-объект Word.Application. В исходном документе-шаблоне расставляются уникальные текстовые метки (например, [ПечНомерДоговора], [ПечПокупатель]), которые программа находит и заменяет нужными значениями из информационной базы.
Рассмотрим по шагам реализацию этого механизма в управляемом приложении на стороне клиента:
Word.Application.Documents.Add().Content) документа.Find.Execute() для подстановки значений.Посмотрим на пример кода процедуры:
&НаКлиенте
Процедура СформироватьДокументПоШаблону(Команда)
// Подключаемся к установленному на клиенте Word
Попытка
мWord = Новый COMОбъект("Word.Application");
Исключение
Предупреждение("Не удалось инициализировать Microsoft Word. Проверьте установку офисного пакета.");
Возврат;
КонецПопытки;
мWord.Visible = 0;
мNewDoc = мWord.Documents;
// Путь к исходному неизменяемому файлу шаблона
ПутьКШаблону = "C:\WORDFORMS\ШаблонДоговора.doc";
мДок = мNewDoc.Add(ПутьКШаблону, 0, 0, 1);
// Заполнение параметров в верхнем колонтитуле
мКолонтитул = мДок.Sections.Item(1).Headers.Item(1).Range;
мКолонтитул.Find.Execute("[ПечНомерДоговора]", 0, 0,,,,,,, "№ 123/2024", 2);
мКолонтитул.Find.Execute("[ПечДатаДоговора]", 0, 0,,,,,,, "15 марта 2024 г.", 2);
// Заполнение параметров в основном теле документа
мОбъект = мДок.Content;
мОбъект.Find.Execute("[ПечНомерДоговора]", 0, 0,,,,,,, "№ 123/2024", 2);
мОбъект.Find.Execute("[ПечДатаДоговора]", 0, 0,,,,,,, "15 марта 2024 г.", 2);
мОбъект.Find.Execute("[ПечПокупатель]", 0, 0,,,,,,, "ООО ""Торговый Дом""", 2);
мОбъект.Find.Execute("[ПечРуководитель]", 0, 0,,,,,,, "Иванов И. И.", 2);
мОбъект.Find.Execute("[ПечОснование]", 0, 0,,,,,,, "Устава", 2);
// Формируем уникальное имя результирующего файла
ТекДатаСтр = Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss");
ИмяФайлаРезультата = "C:\WORDFORMS\Договор_" + ТекДатаСтр + ".doc";
// Сохраняем заполненный файл, не повреждая шаблон
мДок.SaveAs(ИмяФайлаРезультата);
// Делаем окно приложения видимым и активируем его
мWord.Visible = 1;
мWord.Application.WindowState = 2; // Минимизировать
мWord.Application.WindowState = 1; // Развернуть на весь экран
КонецПроцедуры
Важное ограничение метода Find.Execute(): заменяемое строковое значение не должно превышать 255 символов. Если требуется вставить большой фрагмент текста, многострочный абзац или таблицу, рекомендуется использовать механизм закладок (Bookmarks).
Разберем более гибкий способ заполнения шаблона. В самом документе Word через меню Вставка → Закладка расставляются именованные метки. В коде 1С мы обращаемся напрямую к этим закладкам по их именам и передаем произвольный текст без ограничения по количеству символов.
Посмотрим на пример заполнения через коллекцию Bookmarks:
&НаКлиенте
Процедура ЗаполнитьЧерезЗакладки()
Попытка
Ворд = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Не удалось запустить Word: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Ворд.DisplayAlerts = 0; // Отключаем служебные диалоговые окна
ФайлШаблона = "C:\WORDFORMS\ШаблонУведомления.dot";
Док = Ворд.Documents.Add(ФайлШаблона);
// Подстановка данных по именам закладок
Док.Bookmarks("ИсходящийНомер").Range.Text = "Исх. № 45/08";
Док.Bookmarks("Контрагент").Range.Text = "ООО ""Вектор""";
Док.Bookmarks("Адрес").Range.Text = "101000, г. Москва, ул. Примерная, д. 10";
Док.Bookmarks("СуммаДолга").Range.Text = Формат(150450.50, "ЧДЦ=2; ЧГ=3 0");
Док.Bookmarks("Подписант").Range.Text = "Генеральный директор Петров П. П.";
ИмяДляСохранения = "C:\WORDFORMS\Уведомление_45.rtf";
Попытка
Док.SaveAs(ИмяДляСохранения);
Ворд.Visible = 1;
Исключение
Сообщить("Ошибка при сохранении документа: " + ОписаниеОшибки());
Док.Close(0);
Ворд.Quit(0);
КонецПопытки;
КонецПроцедуры
Чтобы не привязываться к жестким локальным путям на диске (например, C:\WORDFORMS\), шаблоны документов удобно хранить непосредственно в конфигурации или базе данных:
.doc / .dot.ПолучитьМакет().ПолучитьИмяВременногоФайла("doc") и выгружаем в него двоичные данные методом Записать().Word.Documents.Add().УдалитьФайлы().Если задача требует отказаться от внешних офисных приложений и выводить форму встроенными средствами 1С, документ Word можно сконвертировать в табличный документ следующими способами:
.html). В 1С создаем объект ТабличныйДокумент и считываем файл методом ТабличныйДокумент.Прочитать(ПутьКФайлу, ТипФайлаТабличногоДокумента.HTML). Полученный результат точно сохраняет пропорции таблиц, объединения ячеек и шрифты. Затем его можно скопировать в макет и разметить именованные секции.