При работе с внешними печатными формами (ВПФ) программисты часто сталкиваются с ситуацией, когда существующий макет в формате Microsoft Word перестает отвечать требованиям бизнеса. Это может быть связано с переходом на операционные системы семейства Linux, использованием веб-клиента или просто желанием ускорить работу системы, избавив её от зависимости от COM-объектов. В данной статье мы подробно разберем, как перевести печатную форму из формата Word в стандартный табличный документ 1С (MXL).
Прежде всего, проанализируем, как работает типичная печатная форма на базе Word. В таких решениях используется макет типа Active document или Двоичные данные. Программный код в этом случае обычно инициализирует COM-соединение с приложением Word, открывает файл-шаблон и производит поиск текстовых меток (например, {НомерДокумента}) для их замены на реальные данные из информационной базы.
Рассмотрим, почему нельзя просто «поменять пару строк». Формат Word и формат Табличного документа 1С — это принципиально разные сущности. В Word мы работаем с потоком текста и объектами, а в 1С — с ячейками, областями и параметрами. Поэтому нам придется выполнить комплексную трансформацию обработки.
Первым делом нам необходимо создать новый макет. Разберем этот процесс по шагам:
ПФ_MXL_ДопСоглашение.Поскольку прямой конвертации из Word в MXL с сохранением идеального форматирования не существует, нам придется отрисовать форму заново. Мы можем облегчить себе задачу, скопировав текст из Word, но сетку таблицы, границы, шрифты и отступы необходимо настроить вручную в редакторе 1С. Важный момент: в тех местах, где должны выводиться данные (ФИО сотрудника, дата, сумма), мы должны создать параметры ячеек. Для этого в свойствах ячейки в поле «Заполнение» выберем значение Параметр.
Теперь проанализируем ситуацию с кодом. Если раньше в процедуре Печать() использовались методы Word.Application, то теперь мы переходим на стандартные методы работы с объектом ТабличныйДокумент.
Давайте сравним подходы. Раньше код мог выглядеть примерно так (упрощенно):
// Старый подход (Word)
ОбъектВорд = ПолучитьМакет("МакетВорд").Получить();
Документ = ОбъектВорд.Application.Documents.Add();
Замена = Документ.Content.Find;
Замена.Execute("{НомерДокумента}", , , , , , , , , Номер);
Нам же необходимо переписать логику, используя объектный подход 1С. Рассмотрим правильную структуру формирования документа:
Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектыПечати)
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ПФ_MXL_ДопСоглашение");
// Получаем область шапки
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем параметры из данных объекта
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаОбъект.Номер;
ОбластьШапка.Параметры.ДатаДокумента = Формат(СсылкаНаОбъект.Дата, "ДЛФ=DD");
// Выводим область в итоговый документ
ТабДок.Вывести(ОбластьШапка);
Возврат ТабДок;
КонецФункции
Выясним причину, по которой форма может не открываться после переделки. В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) внешняя обработка должна содержать функцию СведенияОВнешнейОбработке(). В этой функции описываются команды печати.
Проверим таблицу команд. При использовании Word тип вызова часто настраивается как клиентский метод, так как COM-объект Word удобнее создавать на стороне клиента. Для Табличного документа рекомендуется использовать ВызовСерверногоМетода. Это позволит формировать документ на сервере, что значительно быстрее. В колонке «Использование» для команды печати должно стоять ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода().
Если в исходном вопросе под «сохранением» подразумевалось автоматическое формирование файла в определенную папку, нам нужно изменить метод записи. Вместо методов Word используем встроенный метод 1С Записать().
Разберем пример сохранения сформированного документа в формате PDF или MXL:
ПутьКФайлу = "C:\Temp\Document.mxl";
// Сохранение в родном формате 1С
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.MXL);
// Или сохранение в PDF для универсальности
ПутьКPDF = "C:\Temp\Document.pdf";
ТабДок.Записать(ПутьКPDF, ТипФайлаТабличногоДокумента.PDF);
Если же пользователю просто нужно иметь возможность сохранять файл вручную, то переход на Табличный документ дает огромное преимущество: стандартное окно предпросмотра 1С уже содержит кнопку «Сохранить как», позволяющую выбрать любой из десятка форматов (Excel, PDF, Word, HTML, MXL) без написания дополнительного кода.
Подведем итог нашему анализу. Переписывание формы с Word на Табличный документ — это не «правка двух строк», а полноценная задача по созданию нового интерфейса печатной формы. Однако, выполнив эту работу, мы получаем ряд критически важных преимуществ:
WINWORD.EXE в памяти сервера.Таким образом, для решения задачи необходимо отрисовать новый макет ТабличныйДокумент, перенести в него логику заполнения параметров из старого кода и обновить регистрационные данные обработки в справочнике «Дополнительные отчеты и обработки».