Печатная форма OpenOffice (ODT) с объединением строк в таблицу


Внешняя печатная форма для демонстрации возможности: 1) объединения выводимых строк в единую таблицу (MergeTable). 2) объединения ячеек таблицы используя (MergeCells). В публикации приведен код, расширяющий возможности модуля БСП: УправлениеПечатьюOOWriterКлиент. Тестировалось на платформе 8.3.10, в конфигурациях: ERP 2.0, БП 3.0, БГУ 2.0 и офисных пакетах: LibreOffise 5.3.7, OpenOffice 4.3.1

Причина создания этой публикации в отсутствии в типовом модуле БСП "УправлениеПечатьюOOWriterКлиент" вывода строк объединением в таблицу.
Вот пример, типового кода вывода табличной части:

Область = УправлениеПечатьюКлиент.ОбластьМакета(Макет, Секции[ИмяМакета].СтрокаТаблица1);
УправлениеПечатьюКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеОбъекта.МассивТабличнаяЧасть1, Ложь);

Результат будет содержать отдельные строки, каждая из которых считается таблицей. Включить расчет формул или поменять ширину столбцов всей таблицы не получится.
Пример печатной формы Коммерческого предложения из ERP:
  

В предлагаемой обработке содержатся процедуры расширяющие возможности модуля формирования печатных форм OpenOffice Writer.
Процедур всего две:

1) Процедура ПрисоединитьКПредыдущейТаблице присоединяет выведенную при помощи УправлениеПечатьюКлиент.ПрисоединитьОбласть строку к предыдущей строке.

Процедура УправлениеПечатьюOOWriterКлиент_ПрисоединитьКПредыдущейТаблице(Знач ПечатнаяФормаHandler, Знач ОбластьHandler) Экспорт
oFrame = ПечатнаяФормаHandler.Document.getCurrentController().Frame;
dispatcher = ПечатнаяФормаHandler.ServiceManager.CreateInstance ("com.sun.star.frame.DispatchHelper");
oViewCursor = ПечатнаяФормаHandler.Document.getCurrentController().getViewCursor();
dispatcher.executeDispatch(oFrame, ".uno:GoUp", "", 0, ПолучитьComSafeArray());             //позиционирование на предыдущей строке
dispatcher.executeDispatch(oFrame, ".uno:MergeTable", "", 0, ПолучитьComSafeArray());             //присоединение таблицы
КонецПроцедуры

Результат:   

2) Процедура ОбъединитьКолонкиТаблицы объединяет перечисленные в массиве НомераКолонок колонки.
При вызове метода EntireColumn (выделить колонку) процессор OpenOffice Writer выделяет всю колонку таблицы. Поэтому для объединения нескольких диапазонов в единую таблицу нужно сначала объединять диапазоны присоединенных строк, а потом таблицы с набором строк присоединять к общей таблице. Пример реализован в прилагаемой обработке.

Процедура УправлениеПечатьюOOWriterКлиент_ОбъединитьКолонкиТаблицы(Знач ПечатнаяФормаHandler, Знач ОбластьHandler, НомераКолонок) Экспорт
МаксимальныйНомерКолонки = 0;
Для Каждого м Из НомераКолонок Цикл
МаксимальныйНомерКолонки = Макс(м, МаксимальныйНомерКолонки);
КонецЦикла;
oFrame = ПечатнаяФормаHandler.Document.getCurrentController().Frame;
dispatcher = ПечатнаяФормаHandler.ServiceManager.CreateInstance("com.sun.star.frame.DispatchHelper");
oViewCursor = ПечатнаяФормаHandler.Document.getCurrentController().getViewCursor();
dispatcher.executeDispatch(oFrame, ".uno:GoUp", "", 0, ПолучитьComSafeArray());       //позиционирование на предыдущей строке
Для НомерКолонки = 0 По МаксимальныйНомерКолонки Цикл
ВыполнитьОбъединение = Ложь;
Для Каждого НомерКолонкиОбъединить Из НомераКолонок Цикл
Если НомерКолонки = НомерКолонкиОбъединить Тогда
ВыполнитьОбъединение = Истина;
КонецЕсли;
КонецЦикла;
Если ВыполнитьОбъединение Тогда
dispatcher.executeDispatch(oFrame, ".uno:EntireColumn", "", 0, ПолучитьComSafeArray());   //выделяются ячейки всей колонки (всех присоединенных на данный момент строк)
dispatcher.executeDispatch(oFrame, ".uno:MergeCells", "", 0, ПолучитьComSafeArray());     //объединение ячеек
КонецЕсли;
dispatcher.executeDispatch(oFrame, ".uno:JumpToNextCell", "", 0, ПолучитьComSafeArray());     //переход к следующей ячейке
КонецЦикла;
Для НомерКолонки = 0 По МаксимальныйНомерКолонки Цикл
dispatcher.executeDispatch(oFrame, ".uno:JumpToPreviousCell", "", 0, ПолучитьComSafeArray()); //возврат к предыдущей ячейке
КонецЦикла;
КонецПроцедуры

Результат: 

Демонстрационная обработка не связана объектами конкретной конфигурации и должна запускаться в любой конфигурации с БСП.

Обработку можно адаптировать под внешнюю печатную форму какого либо документа.

Если в обработке указать путь к временному файлу, то печатная форма будет записана по указанному адресу.

Если в расширении временного файла указать "doc", документ будет конвертирован в формат "MS Word 97".

При использовании OpenOffice 4.3.1 наблюдается баг: виден процесс заполнения документа и шаблон остается открытым — лучше использовать последние версии Офиса.

1 Comment

  1. Elvina

    Спасибо за обработку, очень помогла! А не подскажете как картинки вставлять?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *