Как сохранить табличный документ 1С в Word без потери форматирования?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Приветствуем вас, коллеги! Каждый разработчик 1С рано или поздно сталкивается с задачей формирования договоров, соглашений или других сложных текстовых документов. Чаще всего для этого используется привычный и удобный инструмент — ТабличныйДокумент (макет типа MXL). Однако проблемы начинаются тогда, когда пользователи (например, менеджеры отдела продаж) пытаются сохранить готовый документ из 1С в формат Microsoft Word (DOCX), используя стандартную кнопку сохранения («дискету») или комбинацию клавиш Ctrl + S. При такой конвертации «плывут» шрифты, ломаются границы ячеек, исчезают отступы, а текст превращается в трудночитаемую кашу.

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

Выясняем причину: почему стандартный экспорт из MXL в Word работает плохо?

Для того чтобы решить проблему, нам необходимо понять ее физическую суть. Табличный документ 1С (MXL) и документ Microsoft Word (DOCX) построены на принципиально разных логических моделях данных:

Когда платформа 1С пытается записать табличный документ в файл DOCX с помощью стандартного метода Записать() с параметром ТипФайлаТабличногоДокумента.Docx, она пытается решить сложнейшую математическую задачу: спроецировать жесткую сетку ячеек на потоковую разметку Open XML. В результате платформа создает в Word гигантскую невидимую таблицу со множеством колонок разной ширины. Стоит пользователю попытаться изменить хотя бы одно слово в таком документе, как вся верстка безвозвратно ломается. Более того, при стандартном экспорте игнорируются многие специфические настройки шрифтов, межстрочные интервалы и отступы, настроенные в макете 1С.

Давайте рассмотрим детально, какие альтернативные варианты решения этой проблемы у нас есть.

Решение 1. Программный обходной путь через временный HTML и COM-соединение

Если ваши макеты уже созданы в виде табличных документов 1С, переделывать их под шаблоны Word долго, а менеджеры категорически требуют на выходе именно редактируемый файл Word, мы можем применить хитрость. Данный способ основан на том, что платформа 1С конвертирует табличные документы в формат HTML гораздо качественнее и точнее, сохраняя практически все визуальное форматирование, стили и шрифты. Мы можем программно сохранить макет в HTML, а затем с помощью COM-объекта заставить Microsoft Word пересохранить этот HTML в полноценный документ DOCX.

Давайте разберем этот процесс по шагам и посмотрим на пример программного кода, который можно разместить в модуле формы или в общей процедуре:


// Функция конвертирует ТабличныйДокумент в формат DOCX через промежуточный HTML
Процедура СохранитьТабДокВWordЧерезHTML(ТабДок, ПутьКФайлуDocx) Экспорт

    // Шаг 1. Сохраняем табличный документ во временный файл HTML
    ВременныйФайлHTML = ПолучитьИмяВременногоФайла("html");
    ТабДок.Записать(ВременныйФайлHTML, ТипФайлаТабличногоДокумента.HTML);

    // Шаг 2. Инициализируем COM-соединение с Microsoft Word
    Попытка
        WordПриложение = Новый COMОбъект("Word.Application");
    Исключение
        ВызватьИсключение "Не удалось запустить Microsoft Word. Убедитесь, что приложение установлено на компьютере.";
    КонецПопытки;

    // Открываем Word в фоновом режиме (скрыто от пользователя)
    WordПриложение.Visible = Ложь;
    WordПриложение.ScreenUpdating = Ложь;

    Попытка
        // Шаг 3. Открываем созданный HTML-файл средствами Word
        ДокументWord = WordПриложение.Documents.Open(ВременныйФайлHTML);
        
        // Шаг 4. Сохраняем документ в формате DOCX (код формата 16 соответствует wdFormatXMLDocument)
        КодФорматаDocx = 16;
        ДокументWord.SaveAs2(ПутьКФайлуDocx, КодФорматаDocx);
        
        // Закрываем документ без сохранения изменений в самом HTML
        ДокументWord.Close(0); // wdDoNotSaveChanges = 0
    Исключение
        WordПриложение.Quit();
        УдалитьФайлы(ВременныйФайлHTML);
        ВызватьИсключение ОписаниеОшибки();
    КонецПопытки;

    // Завершаем работу с Word
    WordПриложение.Quit();
    
    // Удаляем временный файл HTML за собой
    УдалитьФайлы(ВременныйФайлHTML);

КонецПроцедуры

Преимущества этого подхода: визуальное форматирование (размер шрифта, жирность, цвет, границы ячеек) сохраняется практически на 100% по сравнению с прямым экспортом из 1С. Текст договора не будет «съезжать».

Важные ограничения: данный код может выполняться только на стороне клиента (в тонком или толстом клиенте), так как на компьютере пользователя должен быть физически установлен Microsoft Office. Выполнять этот код на сервере приложений 1С крайне не рекомендуется из-за соображений стабильности и лицензирования Microsoft.

Решение 2. Экспорт в формат PDF/A — идеальный выбор для отправки клиентам

Зачастую менеджеры просят сохранить договор в Word только потому, что они не знают о существовании более подходящих форматов для обмена официальными документами. Если документ предназначен для согласования и подписания клиентом, отправлять его в формате Word — плохой тон. Клиент может случайно или намеренно изменить условия договора, удалить важный пункт или изменить цифры, что повлечет за собой юридические риски.

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

Платформа 1С умеет сохранять в PDF/A «из коробки» без использования сторонних программ и COM-объектов. Рассмотрим пример кода:


// Сохранение табличного документа в формат PDF/A
Процедура СохранитьТабДокВPDF(ТабДок, ПутьКФайлуPDF) Экспорт

    // Создаем параметры сохранения
    ПараметрыСохранения = Новый ПараметрыСохраненияВPDF;
    // Включаем совместимость с форматом архивного хранения PDF/A
    ПараметрыСохранения.СовместимостьСPDFА = Истина;
    
    // Записываем документ на диск
    ТабДок.Записать(ПутьКФайлуPDF, ТипФайлаТабличногоДокумента.PDF, ПараметрыСохранения);

КонецПроцедуры

Рекомендуем вам провести разъяснительную беседу с пользователями и руководством. Как правило, после демонстрации того, как красиво и защищенно выглядит договор в формате PDF/A, менеджеры с радостью отказываются от идеи выгрузки документов в редактируемый формат Word.

Решение 3. Использование шаблонов DOCX как ZIP-архивов (профессиональный подход)

Если специфика вашего бизнеса все же требует предоставления клиентам договоров именно в формате Word (например, для протоколов разногласий или совместного редактирования), то правильным архитектурным решением будет полный отказ от использования макетов типа ТабличныйДокумент (MXL) для таких целей. Вместо этого следует использовать шаблоны документов в формате Word.

Современные версии 1С позволяют работать с файлами `.docx` напрямую без использования медленной технологии COM-соединения. Поскольку файл DOCX представляет собой обычный ZIP-архив, содержащий XML-структуру текста, мы можем программно открывать этот архив, находить файлы разметки текста и заменять в них параметры-заполнители на реальные данные из информационной базы (например, заменять строку {v8 НомерДоговора} на реальный номер документа).

Разберем основные шаги реализации этого механизма:

  1. Создайте эталонный договор в Microsoft Word. Настройте все шрифты, отступы, нумерацию страниц и таблицы так, как вам необходимо.
  2. В местах, куда нужно подставлять динамические данные из 1С, впишите параметры в фигурных скобках. Например: {ДоговорНомер}, {ДоговорДата}, {КонтрагентНаименование}.
  3. Загрузите этот файл в 1С как двоичные данные (храните его в макете конфигурации или в справочнике файлов).
  4. При формировании печатной формы извлеките файл шаблона во временную папку, распакуйте его средствами 1С (используя объект ЧтениеZipФайла) или воспользуйтесь готовыми механизмами БСП (Библиотеки Стандартных Подсистем).
  5. Программа найдет файл document.xml внутри архива, выполнит текстовую замену параметров на значения реквизитов и упакует архив обратно в формат `.docx`.

Этот способ работает невероятно быстро, может безопасно выполняться на стороне сервера под любой операционной системой (включая Linux-серверы 1С) и гарантирует сохранение форматирования на все 100%, так как файл создается и редактируется в родном для Word формате. Для ознакомления с практической реализацией вывода данных в макет подойдёт пример формирования печатной формы Word с заполнением таблиц и колонтитулов.

Резюме и рекомендации

Мы проанализировали проблему потери форматирования при конвертации макетов 1С в Word и можем сделать следующие выводы:

← На главную