При работе с печатными формами в 1С:Предприятие программисты часто сталкиваются с неприятной особенностью: при использовании стандартного метода Записать() с типом файла ТипФайлаТабличногоДокумента.Docx все тщательно настроенные поля страницы (отступы слева, справа, сверху и снизу) бесследно исчезают. В итоговом документе текст оказывается «прижатым» к краям листа, что нарушает стандарты документооборота.
В этой статье мы подробно разберем, почему это происходит, и проанализируем несколько проверенных способов решения этой задачи, от программной корректировки уже созданного файла до использования профессиональных шаблонов.
Для начала выясним причину такого поведения системы. Платформа 1С при конвертации табличного документа (MXL) в формат Word использует упрощенный алгоритм. Он переносит структуру ячеек, шрифты и границы, но фактически игнорирует объект ПараметрыСтраницы табличного документа. Word-файл создается со значениями полей «по умолчанию», которые часто не совпадают с вашими настройками. Кроме того, содержимое печатной формы часто помещается в таблицу Word, которая может иметь свои внутренние свойства автоподбора ширины, что визуально еще сильнее искажает отступы.
Если вы уже сохранили документ стандартным методом, мы можем «дожать» результат, открыв файл программно и установив нужные параметры. Это избавляет от необходимости переписывать всю логику формирования документа.
Рассмотрим пошагово, как реализовать этот алгоритм:
Word.Application.PageSetup и устанавливаем поля.Важный нюанс: в 1С параметры страницы задаются в миллиметрах, а в объектной модели Microsoft Word (VBA) — в пунктах (points). Для корректного перевода используйте коэффициент: 1 мм ≈ 2.835 пункта.
Разберем пример кода:
// Сначала сохраняем документ стандартно
ПутьКФайлу = "C:\Temp\PrintForm.docx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.Docx);
// Начинаем корректировку
Попытка
Ворд = Новый COMОбъект("Word.Application");
Ворд.Visible = Ложь; // Работаем в фоновом режиме
Документ = Ворд.Documents.Open(ПутьКФайлу);
// Коэффициент пересчета мм в пункты
Коэф = 2.834645;
// Устанавливаем отступы (например, 20мм слева, 10мм справа)
Документ.PageSetup.LeftMargin = 20 * Коэф;
Документ.PageSetup.RightMargin = 10 * Коэф;
Документ.PageSetup.TopMargin = 15 * Коэф;
Документ.PageSetup.BottomMargin = 15 * Коэф;
Документ.Save();
Документ.Close();
Ворд.Quit();
Исключение
Сообщить("Ошибка при работе с Word: " + ОписаниеОшибки());
Если ЗначениеЗаполнено(Ворд) Тогда
Ворд.Quit();
КонецЕсли;
КонецПопытки;
Этот метод считается более надежным и «профессиональным». Вместо того чтобы пытаться сконвертировать сложную таблицу 1С в Word, мы заранее создаем файл в самом Word, настраиваем там все отступы, колонтитулы, логотипы и ориентацию страницы. В нужных местах расставляем закладки (Bookmarks).
Проанализируем ситуацию: 1С выступает лишь в роли поставщика данных, заполняя уже идеально отформатированный бланк.
Алгоритм действий:
Template.dotx с настроенными полями.НомерДок, ДатаДок, Контрагент).Пример программной реализации:
Ворд = Новый COMОбъект("Word.Application");
Шаблон = Ворд.Documents.Add("C:\Templates\Договор.dotx");
// Заполняем закладки
Если Шаблон.Bookmarks.Exists("НомерДок") Тогда
Шаблон.Bookmarks("НомерДок").Range.Text = "№ 123-А";
КонецЕсли;
Если Шаблон.Bookmarks.Exists("Дата") Тогда
Шаблон.Bookmarks("Дата").Range.Text = Формат(ТекущаяДата(), "ДЛФ=DD");
КонецЕсли;
// Сохраняем результат
Шаблон.SaveAs("C:\Temp\ГотовыйДокумент.docx");
Ворд.Visible = Истина; // Показываем пользователю
Существует еще один способ, который позволяет сохранить форматирование таблиц 1С более точно. Мы можем создать пустой документ Word с настроенными полями, а затем скопировать содержимое табличного документа 1С и вставить его через буфер обмена.
Посмотрим, как это работает: Word при вставке данных (Paste) автоматически пытается подогнать вставляемую таблицу под текущие границы (Margins) документа. Это позволяет избежать «наползания» текста на края листа.
Рассмотрим последовательность действий:
ТабличныйДокумент в 1С.ТабДок.Показать() или программный вывод в форму.PageSetup.Важно: этот метод требует наличия установленного Microsoft Word на компьютере пользователя и не всегда подходит для серверного выполнения.
Если ваша задача — просто передать клиенту документ, который он должен распечатать в неизменном виде, мы рекомендуем рассмотреть экспорт в PDF. В отличие от формата Word, экспорт в PDF в современных версиях 1С (8.3.15+) работает практически безупречно в плане соблюдения параметров страницы.
Используйте простой код:
ТабДок.Записать("C:\Temp\Document.pdf", ТипФайлаТабличногоДокумента.PDF);
В этом случае все отступы, заданные в ТабДок.ПараметрыСтраницы, будут сохранены с точностью до миллиметра.
Мы проанализировали проблему потери отступов и выяснили, что штатный экспорт 1С в Word имеет свои архитектурные ограничения. Чтобы ваш документ выглядел профессионально, следуйте этим советам:
Применяя эти методы, вы сможете обеспечить высокое качество печатных форм и корректное отображение документов у конечных пользователей.