Каждый разработчик 1С рано или поздно сталкивается с задачей автоматизации документооборота, когда необходимо сформировать печатную форму договора, соглашения или акта на основе готового шаблона Microsoft Word. Для этого часто используются механизмы БСП (Библиотеки стандартных подсистем) или прямое управление через COM-соединение. Мы расставляем маркеры областей вида {v8 Область.Заголовок}, заполняем параметры, и все идет отлично, пока в дело не вступают таблицы или динамически копируемые области текста.
В этот момент многие сталкиваются с крайне неприятной проблемой: при копировании областей или выводе табличных строк исходный красивый шрифт (например, Times New Roman или Arial) «слетает» на стандартный Calibri 11, а настроенные абзацные отступы и межстрочные интервалы превращаются в хаос. В этой статье мы подробно проанализируем причины такого поведения текстового процессора и разберем несколько надежных способов решения этой проблемы — от простых организационных настроек макета до программного управления стилями из кода 1С.
Чтобы найти правильное решение, давайте сначала разберем физику процесса и поймем, почему MS Word ведет себя подобным образом при работе с механизмами 1С. Выделим три основные причины:
{v8 Область.Заголовок}, и меняет его шрифт на нужный. Однако скрытый символ конца абзаца (обозначаемый знаком ¶) в конце строки часто остается отформатированным как Calibri. При генерации документа и склеивании областей Word ориентируется именно на форматирование скрытого символа конца абзаца. В результате весь абзац автоматически перекрашивается в Calibri.w:r и w:proofErr). При замене параметров 1С может разорвать слово или абзац посреди такой замусоренной структуры, что приводит к сбросу стилей.Теперь, когда причины понятны, рассмотрим подробнее методы устранения этой проблемы.
Вместо того чтобы изменять глобальный шаблон Normal.dot на компьютерах всех пользователей (что практически невозможно в условиях крупного предприятия или при работе в терминальном режиме), мы можем жестко зафиксировать базовые настройки шрифта внутри самого файла-шаблона договора. Давайте разберем этот процесс по шагам:
Результат: Теперь, даже если Word при программном копировании областей потеряет связь с конкретным стилем оформления, он применит настройки по умолчанию из самого документа (которые мы только что настроили), и ваш текст останется в формате Times New Roman с нужными интервалами.
Если шрифт слетает только в определенных местах (например, в начале или конце скопированной области), нам необходимо проверить скрытые символы форматирования. Давайте проанализируем ситуацию:
{v8 Область.Контрагент}¶.Этот простой шаг гарантирует, что при размножении строк или замене параметров алгоритмами БСП Word не будет подтягивать «чужой» шрифт из невидимых управляющих символов.
Если шрифты слетают именно внутри табличной части при добавлении строк из 1С, нам необходимо скорректировать внутренний стиль таблицы в самом шаблоне. Разберем, как это сделать:
После этой настройки любые новые строки, которые платформа 1С будет добавлять в таблицу в процессе вывода печатной формы, автоматически унаследуют параметры шрифта, жестко закрепленные за стилем этой таблицы.
В ходе обсуждения на форуме участники нашли интересный практический «костыль» — пересохранение файла через встроенный текстовый редактор WordPad. Давайте разберем, почему этот способ работает и как его правильно применять.
Программа WordPad является упрощенным редактором. Она не поддерживает сложные стили, многоуровневые XML-схемы и накопленный «мусор» форматирования MS Word. Когда вы открываете файл в WordPad или копируете туда текст, этот редактор принудительно вычищает все скрытые XML-теги стилей, оставляя только чистое визуальное представление текста.
Для реализации этого метода выполните следующие шаги:
Важное предупреждение: Как справедливо заметили участники обсуждения, WordPad при такой очистке может удалить сложные элементы разметки — например, автоматическую нумерацию списков или серую заливку ячеек таблиц. Поэтому используйте этот метод только для простых шаблонов или будьте готовы вручную перенастроить списки и заливку в MS Word после процедуры очистки.
Если макет договора очень сложный, содержит много разнородных элементов, и вы не хотите вручную перенастраивать стили шаблона, можно прибегнуть к программной корректировке шрифтов непосредственно перед выводом документа пользователю. Мы можем обратиться к COM-объекту текстового процессора и принудительно установить параметры шрифта для всего готового документа.
Посмотрим на пример кода на языке 1С:
// Предположим, что у нас уже есть сформированный COM-объект приложения Word
// и ссылка на активный документ печатной формы.
WordПриложение = Новый COMОбъект("Word.Application");
ДокументОбъект = WordПриложение.ActiveDocument;
// Выделяем весь текст сформированного документа
ДокументОбъект.Content.Select();
// Получаем доступ к параметрам шрифта выделенной области
ШрифтДокумента = ДокументОбъект.Content.Font;
ШрифтДокумента.Name = "Times New Roman";
ШрифтДокумента.Size = 12;
// Настраиваем абзацные интервалы по всему документу
ПараметрыАбзаца = ДокументОбъект.Content.ParagraphFormat;
ПараметрыАбзаца.LineSpacingRule = 1; // Устанавливаем одинарный межстрочный интервал
ПараметрыАбзаца.SpaceAfter = 0; // Убираем отступы после абзацев
ПараметрыАбзаца.SpaceBefore = 0; // Убираем отступы перед абзацами
// Если в документе есть таблицы, и мы хотим гарантировать шрифт внутри них
Для Каждого ТекущаяТаблица Из ДокументОбъект.Tables Цикл
ТекущаяТаблица.Range.Font.Name = "Times New Roman";
ТекущаяТаблица.Range.Font.Size = 10; // В таблицах шрифт может быть чуть меньше
КонецЦикла;
// Делаем документ видимым для пользователя
WordПриложение.Visible = Истина;
Давайте проанализируем этот код. Мы используем свойство Content объекта Document, чтобы получить доступ ко всему содержимому файла. Свойства Font.Name и Font.Size позволяют нам принудительно переопределить шрифт. С помощью цикла Для Каждого мы обходим коллекцию Tables документа и отдельно форматируем текст во всех ячейках каждой таблицы.
Обратите внимание на минус этого способа: Если в вашем договоре некоторые заголовки должны быть написаны другим шрифтом (например, Arial Black), то данный программный код полностью сотрет эти различия, сделав весь текст единообразным. В таких случаях применять тотальное форматирование нельзя — необходимо обращаться к конкретным параграфам или использовать Способ 1.
Подводя итоги, можно сказать, что наиболее изящным и правильным решением является Способ 1 (настройка значений по умолчанию в свойствах самого файла-шаблона) в сочетании со Способом 2 (контроль скрытых символов абзаца). Это избавит вас от необходимости писать лишний программный код в 1С и гарантирует стабильный результат печати на компьютере любого пользователя вашей информационной базы.