Каждый разработчик 1С рано или поздно сталкивается с задачей создания печатной формы на основе готового сложного документа в формате Microsoft Word (.doc или .docx). Это может быть трудовой договор, приказ на оплату праздничных дней, соглашение о неразглашении или акт сложной формы. Первая реакция разработчика — тоска от необходимости вручную перерисовывать всю сетку, подгонять пиксели и настраивать шрифты в табличном документе 1С (макете .mxl).
В этой статье мы подробно разберем, как избежать монотонной ручной работы. Мы проанализируем различные подходы: от классической конвертации через промежуточные форматы до современного стандарта работы с офисными документами через Библиотеку стандартных подсистем (БСП) без использования COM-соединений.
Попытка просто скопировать содержимое документа Word через буфер обмена (CTRL+C / CTRL+V) и вставить его в поле табличного документа 1С приводит к плачевным результатам. Разметка сбивается, границы таблиц ломаются, шрифты искажаются, а ячейки объединяются хаотичным образом.
Выясним причину этого поведения. Документ Microsoft Word представляет собой flow-текст (гипертекстовую структуру, близкую к HTML), в то время как макет 1С (.mxl) — это жесткая табличная сетка (аналог Microsoft Excel). Прямая конвертация «текст -> таблица» без потерь структуры невозможна технологически. Однако существуют обходные пути и альтернативные технологии.
Если перед вами стоит задача реализовать печатную форму по готовому шаблону Word, то наиболее правильным решением будет вообще не переносить его в MXL. Современные версии платформы 1С:Предприятие и Библиотеки стандартных подсистем (БСП) позволяют использовать файлы .docx напрямую в качестве макетов печатных форм.
При этом формирование документа происходит на стороне сервера 1С без создания COM-объекта (без вызова Word.Application). Это критически важно, так как позволяет без проблем формировать документы на серверах под управлением операционной системы Linux и исключает зависание процессов MS Word в памяти сервера.
Рассмотрим по шагам, как реализовать этот механизм:
Шаг 1. Подготовка шаблона в MS Word
Откроем наш исходный документ Word и разметим в нем области и параметры, которые будут заполняться из 1С. Для этого используются специальные маркеры:
{v8 ФиоСотрудника}, {v8 ДатаДокумента}, {v8 СуммаПрописью}.{v8 Область.СтрокаТаблицы} в начале и {v8 Область.СтрокаТаблицы} в конце строки.Шаг 2. Загрузка шаблона в конфигурацию
Добавим в наш объект метаданных (например, в документ или справочник) новый макет с типом Двоичные данные и загрузим туда наш подготовленный файл .docx.
Шаг 3. Программный код формирования печатной формы
Проанализируем пример кода, выполняющего заполнение макета Word средствами БСП. Этот код пишется в модуле менеджера объекта или в специализированном общем модуле печати:
Функция СформироватьПечатнуюФормуВФорматеWord(СсылкаНаОбъект, АдресХранилища) Экспорт
// Получаем макет из двоичных данных
МакетДвоичныеДанные = ПолучитьМакет("МакетПриказаWord");
// Инициализируем макет офисного документа средствами БСП
ДанныеМакет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДвоичныеДанные, "DOCX");
// Создаем структуру для печатной формы
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму("DOCX", ДанныеМакет.НастройкиСтраницы);
// Создаем структуру данных для заполнения
ДанныеДокумента = Новый Структура;
ДанныеДокумента.Вставить("ДатаДокумента", Формат(СсылкаНаОбъект.Дата, "ДЛФ=DD"));
ДанныеДокумента.Вставить("НомерДокумента", СсылкаНаОбъект.Номер);
ДанныеДокумента.Вставить("ФиоСотрудника", СсылкаНаОбъект.Сотрудник.Наименование);
// Присоединяем и заполняем основную область документа
ОбластьШапка = УправлениеПечатью.ОбластьМакета(ДанныеМакет, "Шапка");
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, ОбластьШапка, ДанныеДокумента);
// Если есть табличная часть, выводим ее в цикле
ОбластьСтрока = УправлениеПечатью.ОбластьМакета(ДанныеМакет, "СтрокаТаблицы");
Для Каждого СтрокаТЧ Из СсылкаНаОбъект.ОтработанныеДни Цикл
ДанныеСтроки = Новый Структура;
ДанныеСтроки.Вставить("ДатаВыхода", Формат(СтрокаТЧ.Дата, "ДЛФ=D"));
ДанныеСтроки.Вставить("Оплата", СтрокаТЧ.РазмерОплаты);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, ОбластьСтрока, ДанныеСтроки);
КонецЦикла;
// Очищаем временные файлы макета и упаковываем результат
АдресХранилища = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
УправлениеПечатью.ОчиститьВременныеФайлыМакетОфисногоДокумента(ДанныеМакет);
Возврат АдресХранилища;
КонецФункции
Этот метод полностью избавляет вас от необходимости рисовать макет заново. Вы используете оригинальный файл, предоставленный заказчиком или отделом кадров, гарантируя 100% точность разметки и шрифтов. Для быстрой реализации такого механизма можно использовать готовый шаблон внешней печатной формы для вывода в Word средствами БСП.
Если по каким-то причинам (например, жесткие требования архитектуры или старая версия платформы) вам обязательно нужно получить печатную форму именно в виде стандартного табличного документа .mxl, существует обходной технологический прием, который минимизирует ручную работу.
Прямой экспорт из Word в Excel часто ломает структуру таблиц. Но мы можем использовать язык разметки HTML в качестве надежного посредника. Разберем этот процесс по шагам:
.html в Excel. Вы увидите, что Excel отлично распознал структуру документа, преобразовав текстовые абзацы и таблицы Word в строки и столбцы таблицы Excel, при этом сохранив объединение ячеек и начертание шрифтов гораздо точнее, чем при обычном копировании..xls или .xlsx..mxl), выберите в меню Таблица -> Импорт... и укажите сохраненный Excel-файл.После импорта вам останется лишь слегка подкорректировать ширину колонок, установить границы областей для печати и заменить статический текст на параметры 1С (например, заменить текст «Иванов Иван Иванович» на [ФИО] с типом заполнения «Параметр»). Этот способ экономит до 90% времени по сравнению с рисованием сетки «с нуля».
В современных типовых конфигурациях (таких как 1С:ЗУП 3, 1С:ERP, 1С:Комплексная автоматизация) реализован функционал создания печатных форм силами самих пользователей. Если ваша задача заключается в создании типового договора или приказа, вам может вообще не понадобиться конфигуратор. Для практического освоения этой возможности пригодится инструкция по редактированию печатных форм в программах 1С.
Проанализируем, как задействовать этот механизм:
Перед тем как приступать к реализации задачи, оцените требования к печатной форме: