Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

Добрый день.

Сегодня мы будем создавать печатную форму, которая открывает формируемый документ в бесплатном текстовом редакторе от фирмы apache - open office. Т.к. на дворе уже платформа 1С 8.3, то делать мы будем это в управляемых формах.

Ранее мы с Вами разбирали вопрос создания внешней печатной формы в управляемом приложении, позже мы сделали, чтобы внешняя печатная форма открывала документ в Microsof Word. Единственным минусом MS Word является его платность, поэтому иногда в целях экономии средств пользователям достается Open Office. Естественно для таких пользователей старый код работать не будет, т.к. не сможет создать COM объект, открывающий документ.

Поэтому сегодня мы создадим с Вами внешнюю печатную форму, которая умеет работать с Apace Open Office. Шаблон придется немного переделать, т.к. DocVariables в Open Office нет. Для определения "заменяемых" частей текста будем использоватьметод поиска и замены, описанный ранее.

Первое, что нам надо сделать для нашего урока, это установить Apache Open Office 4.

Теперь открываем OpenOffice Writer и создаем шаблон. Как и раньше будем делать печать трудового договора для справочника сотрудники. Сам шаблон я делаю примитивным:

Создание шаблона в Open Office для печати из 1С Предприятия в 8.3

Как видно из картинки, переменные теперь это обычные слова обрамленные кракозябрами. В качестве кракозябры я использовал знаки процента. С точки зрения текстового редактора это обычный текст.

Сохраняем наш шаблон. Я рекомендую сохранять его в формате doc, чтобы сохранить совместимость с MS Word, т.к. мы не знаем что пользователь будет делать с нашим документом дальше. Возможно его сохранят и перешлют кому-то, у кого стоит MS Office.

Сохранение шаблона в Open Office для печати из 1С предприятия 8.3

Шаблон готов, теперь идем в 1С Конфигуратор и создаем внешнюю обработку.

Модуль обработки приводить не буду, он такой же, как и для MS Office. Нам надо организовать вызов клиентского метода, без открытия формы. Т.е. процедура печати будет располагаться в модуле формы.

Как и ранее создаем макет с двоичными данными и суем туда наш макет, созданный в Open Office.

Теперь создаем основную форму обработки и идем в её модуль.

Создадим серверную процедуру получения данных:

&НаСервере
Функция ПолучитьДанные(Сотрудник)
 Запрос = Новый Запрос("ВЫБРАТЬ
                       | Сотрудники.Код КАК Табельный,
                       | ПриемНаРаботу.ДатаПриема КАК Дата,
                       | ПриемНаРаботу.Организация.НаименованиеПолное КАК ОргДлинно,
                       | ПриемНаРаботу.Организация.НаименованиеСокращенное КАК ОргКртако,
                       | ФИОФизическихЛицСрезПоследних.Фамилия,
                       | ФИОФизическихЛицСрезПоследних.Имя,
                       | ФИОФизическихЛицСрезПоследних.Отчество
                       |ИЗ
                       | Справочник.Сотрудники КАК Сотрудники
                       |  ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу КАК ПриемНаРаботу
                       |  ПО (ПриемНаРаботу.Сотрудник = Сотрудники.Ссылка)
                       |   И (ПриемНаРаботу.Проведен)
                       |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОФизическихЛицСрезПоследних
                       |  ПО Сотрудники.ФизическоеЛицо = ФИОФизическихЛицСрезПоследних.ФизическоеЛицо
                       |ГДЕ
                       | Сотрудники.Ссылка = &Ссылка");
 Запрос.УстановитьПараметр("Ссылка", Сотрудник);
 рез = Запрос.Выполнить();
 выб = рез.Выбрать();
 Если выб.Следующий() Тогда
  стр = Новый Структура("Табельный,Дата,ОргКртако,ОргДлинно,ФИО");
  ЗаполнитьЗначенияСвойств(стр, выб);
  стр.ФИО = СокрЛП(выб.Фамилия) + " " + СокрЛП(выб.Имя) + " " + СокрЛП(выб.Отчество);
  Возврат стр;
 Иначе
  Возврат Неопределено;
 КонецЕсли;
КонецФункции

Теперь как и ранее, создадим процедуру получения макета:

&НаСервере
Функция ПолучитьМакетСервер()
 Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
КонецФункции

Прежде чем писать процедуру печати, напишем простенькую функцию, которая преобразует путь к файлу в URL. Проблема в том, что из-за кросс платформенности Open Office не работает с Windows каталогами.

// Функция преобразует Windows имя файла в URL OpenOffice
Функция ПреобразоватьВURL(ИмяФайла)
    Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
КонецФункции

Пока ничего нового мы не делали, а теперь процедура печати, в ней будет все по другому:)

&НаКлиенте
Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт
Для Каждого сотрудник Из МассивОбъектов Цикл
Данные = ПолучитьДанные(сотрудник);
Если данные <> Неопределено Тогда
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Desktop        = ServiceManager.createInstance("com.sun.star.frame.Desktop");

Scr = Новый COMОбъект("MSScriptControl.ScriptControl");
Scr.Language="javascript";
Scr.Eval("Args=new Array()");
Args = Scr.Eval("Args"); 
Scr.AddObject("ServiceManager", ServiceManager);

Макет = ПолучитьМакетСервер();
временныйПуть = КаталогВременныхФайлов();
имяВременногоФайла = временныйПуть + "dog.doc";
Макет.Записать(имяВременногоФайла);

// Откроем шаблон
ТекстовыйПроцессор = Desktop.LoadComponentFromURL(ПреобразоватьВURL(имяВременногоФайла), "_blank", 0, Args);
//Объект, который делает поиск и замену строк
Replace = ТекстовыйПроцессор.CreateReplaceDescriptor();
Replace.SearchString  = "%НомерДоговора%";
Replace.ReplaceString = СокрЛП(Данные.Табельный);
ТекстовыйПроцессор.ReplaceAll(Replace);
Replace.SearchString  = "%Организация%";
Replace.ReplaceString = СокрЛП(Данные.ОргКртако);
ТекстовыйПроцессор.ReplaceAll(Replace);
Replace.SearchString  = "%ДатаСоставления%";
Replace.ReplaceString = Формат(Данные.Дата,"ДФ=dd.MM.yyyy");
ТекстовыйПроцессор.ReplaceAll(Replace);
Replace.SearchString  = "%ФИО%";
Replace.ReplaceString = СокрЛП(Данные.ФИО);
ТекстовыйПроцессор.ReplaceAll(Replace);
Replace.SearchString  = "%ОрганизацияПолн%";
Replace.ReplaceString = СокрЛП(Данные.ОргДлинно);
ТекстовыйПроцессор.ReplaceAll(Replace);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Немного прокомментирую код. переменная "ТекстовыйПроцессор" - это как раз наш документ. Все что выше её создания - можно назвать начальной инициализацией. ServiceManager - менеджер сервисов, он нужен как для Writer так и для работы с Calc (аналог Excel). Переменная Desktop - новое окно. При открытии файла ( LoadComponentFromURL(...) ) оно сразу открывается на экране, поэтому при медленной работе компьютера мы можем наблюдать заполнение шаблона.

Replace - переменная, в которой лежит объект умеющий искать и заменять строки в документе. Собственно с её помощью мы и подменяем кракозябры/теги на нужные строки.

 

Собственно все, спасибо за внимание.

Во вложении рабочий образец, который прикрепляется и к ЗУП 3.0 и к Бухгалтерии 3.0

 

Вложения
ATTACH_DOWNLOAD_THIS_FILE_SПечатьВOO.epf[Образец печати документа в 1С в Open Office в управляемой форме]11 kB

Авторизуйтесь пожалуйста