Перенос сложного форматирования из текстового редактора Microsoft Word в табличный документ 1С — это классическая задача, с которой сталкиваются разработчики при создании печатных форм. Проблема заключается в принципиально разной структуре документов: Word оперирует абзацами и секциями, а 1С — жесткой сеткой ячеек. Прямой перенос «копировать-вставить» часто приводит к «разъезжанию» таблиц и потере оформления. Разберем наиболее эффективные способы решения этой задачи, от программной автоматизации до выверенных ручных методик.
Один из самых старых, но рабочих способов — использование промежуточного формата xls. Рассмотрим последовательность действий, которая позволяет минимизировать искажения:
.xls.Проанализируем этот метод: он хорош тем, что утилиты конвертации часто умеют сохранять шрифты и базовое объединение ячеек. Однако стоит помнить, что «идеального» преобразования не существует, и после конвертации потребуется финишная правка границ в конфигураторе 1С.
Если нам необходимо автоматизировать процесс на стороне 1С, наиболее технологичным программным способом является использование HTML как промежуточного звена. Выясним, почему это работает: 1С умеет достаточно корректно интерпретировать теги таблиц HTML при чтении в ТабличныйДокумент.
Рассмотрим пример кода для реализации этой логики через COM-соединение:
// Создаем объект Word
Попытка
WordПриложение = Новый COMОбъект("Word.Application");
Исключение
Сообщить("MS Word не установлен");
Возврат;
КонецПопытки;
// Открываем документ
Документ = WordПриложение.Documents.Open(ПутьКФайлу);
// Сохраняем во временный HTML-файл
ВременныйФайлHTML = ПолучитьИмяВременногоФайла("html");
Документ.SaveAs(ВременныйФайлHTML, 10); // 10 - формат Filtered HTML
Документ.Close();
WordПриложение.Quit();
// Читаем в табличный документ 1С
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ВременныйФайлHTML, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Использование Filtered HTML позволяет избавиться от специфических XML-тегов Microsoft и оставить чистую верстку, которую 1С понимает лучше всего.
Бывают случаи (например, сложные государственные бланки), когда автоматическая конвертация бессильна. Проанализируем профессиональный метод ручной отрисовки, который используют специалисты при подготовке макетов в системах типа «Консультант+».
Суть метода заключается в создании макета с очень мелкой сеткой. Разберем по шагам:
0.1 или 0.2.РазмещениеТекста (Переносить или Автовысота).Важный совет: Перед началом работы просчитайте максимальное количество необходимых колонок. Если в документе есть таблицы с разным количеством столбцов, ищите их наименьшее общее кратное или используйте максимально мелкую сетку, чтобы границы разных таблиц не «конфликтовали» друг с другом в рамках одних и тех же колонок 1С.
Если задача стоит не в преобразовании макета для печати из 1С, а в демонстрации существующего Word-файла пользователю внутри системы без возможности правки, рассмотрим вариант программного открытия документа в защищенном режиме.
Посмотрим на пример кода, открывающего документ только для чтения:
// Параметры метода Open: (FileName, ConfirmConversions, ReadOnly, ...)
Word = Новый COMОбъект("Word.Application");
Word.Visible = Истина;
ИмяФайла = "C:\Templates\Contract.docx";
Word.Documents.Open(ИмяФайла, Ложь, Истина); // Третий параметр Истина включает ReadOnly
Это решит проблему «хотелок» пользователей, которым нужно видеть документ в привычном интерфейсе Word, но запретит им вносить изменения в шаблон организации.
Для достижения 100% визуального сходства макета 1С с оригиналом Word можно применить хитрость с фоновым изображением. Проанализируем этот процесс:
Рисунок и растянем её на область печати.Этот метод гарантирует, что все отступы, логотипы и линии будут находиться именно там, где они были в исходном файле docx.
При программном заполнении полученного макета данными важно помнить, что 1С не умеет динамически пересчитывать высоту строк так же гибко, как Word управляет абзацами. Рассмотрим, как избежать проблем с «разрывом» текста:
ПроверитьВывод(). Перед выводом очередной секции или строки таблицы в итоговый документ, проверяйте, поместится ли она на текущей странице.РазмещениеТекста = Переносить и заранее задавайте максимально возможную ширину, чтобы избежать непредсказуемого изменения высоты строки.ВывестиВертикальныйРазделительСтраниц() или ВывестиГоризонтальныйРазделительСтраниц(), если логика документа требует жесткого следования оригиналу.Подводя итог, можно сказать: если документ простой — используйте HTML-конвертацию. Если документ сложный и должен выглядеть «один-в-один» — используйте метод узких колонок с предварительной отрисовкой. Это сэкономит время в долгосрочной перспективе, так как избавит от постоянных правок макета при изменении данных.