Версия для печати темы (https://pro1c.org.ua/index.php?s=d307cca087f4e17590698c8ed020c92b&showtopic=49438)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ 1С Предприятие 8 _ Выод форматированного документа в табличный документ

Автор: TipsyKID 14.12.18, 13:23

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

Проблемы которые пока не получилось сделать лучше:
1.Нумерованный список в нумерованном списке в нумер.... и т.д..
2.Маркированный список в маркированном списке в марки... и т.д..
3.После применения форматирования оригинальная область приходит в негодность и ее надо восстановить для дальнейшего использования
4. Выделение цветного текста происходит по последнему условному оформлению "параграфа" (беда 1с, что в табличном документе в рамках одной ячейки нельзя устанавливать разное оформление: шрифт, цвет и т.д..)

Если есть подсказки, идеи, фиксы ошибок: готов выслушать.
Кстати, тема очень актуальная, т.к. объект "Форматированный документ" - очень перспективен, но загвоздка в том, что вывести и полноценно распечатать его является проблемой, что очень сильно ограничивает область применения.

// Описание
//      Устанавливает свойства ячеек области в зависимости от элемента форматированного документа
// Параметры
//  Область -  ОбластьЯчеекТабличногоДокумента - область которую следует изменить
//  ЭлементФорматированногоДокумента -  ТекстФорматированногоДокумента - элемент по которому следует изменить область
Процедура УстановитьУсловноеФорматированиеОбласти(Область,ЭлементФорматированногоДокумента) Экспорт
    
    Если НЕ ТипЗнч(ЭлементФорматированногоДокумента) = Тип("ТекстФорматированногоДокумента") Тогда
        Возврат
    КонецЕсли;    
    
    ЗаполнитьЗначенияСвойств(Область.Области[0],ЭлементФорматированногоДокумента,,"Текст");
    
    Если ЗначениеЗаполнено(ЭлементФорматированногоДокумента.НавигационнаяСсылка) Тогда
        
        Область.Области[0].Гиперссылка = Истина;
        Область.Области[0].ЦветТекста = WebЦвета.СинеСерый;
        Область.Области[0].Шрифт = Новый Шрифт(,,,,Истина);
        
    КонецЕсли;
    
    
КонецПроцедуры //установитьУсловноеФорматированиеОбласти

// Описание
//         Добавляет в табличный документ оббласть с форматированным текстом (переносит форматирование на ячейку области)
// Параметры
//  ТабличныйДокумент -  ТабличныйДокумент - Табличный документ в который следует вставить область
//  Область -  ОбластьЯчеекТабличногоДокумента - область которую следует изменить
//  ЭлементФорматированногоДокумента -  ТекстФорматированногоДокумента - элемент по которому следует изменить область
Процедура ВывестиФорматированныйТекстВТабличныйДокумент(ТабличныйДокумент,Область,ЭлементФорматированногоДокумента) Экспорт
    
    
    УстановитьУсловноеФорматированиеОбласти(Область,ЭлементФорматированногоДокумента);
    ТабличныйДокумент.Вывести(Область);

// к сожалению, после применения форматирования оригинальная область приходит в негодность
//                                                                и ее надо восстановить для дальнейшего использования
    
//    //ЗаполнитьЗначенияСвойств(Область.Области[0],ОбластьТекстПоУмолчанию.Области[0],,"Текст,Шрифт,Заполнение,");
//    
//    Область.Области[0].Шрифт = Новый Шрифт;
//    Область.Области[0].ЦветРамки         = Новый Цвет;
//    Область.Области[0].ЦветТекста         = Новый Цвет;
//    Область.Области[0].ЦветУзора         = Новый Цвет;
//    Область.Области[0].ЦветФона         = Новый Цвет;
//    

КонецПроцедуры //ВывестиФорматированныйТекстВТабличныйДокумент

// Описание
//     Выводит в табличный документ форматированный документ
// Параметры
//  Макет - Макет - Макет
//  ОписаниеФорматированныйДокумент - ФорматированныйДокумент - форматированный документ который следует вывести
//  ТабличныйДокумент - ТабличныйДокумент -  Табличный документ в который следует вывести форматированный документ
Процедура ВывестиФорматиованныйДокументВТабличныйДокумент(Макет,ОписаниеФорматированныйДокумент,ТабличныйДокумент,ТолькоТекстКлиента,
                                                          ИмяОбластиОписание = "ОбластьОписание",ИмяОбластиКартинка = "ОбластьОписаниеКартинка") Экспорт
    
    РазмерПикселя = 0.264583333333334;//размер пикселя в миллиметрах, кто бы знал!
    
    ОбластьТекст = Макет.ПолучитьОбласть(ИмяОбластиОписание);
    ОбластьКартинка = Макет.ПолучитьОбласть(ИмяОбластиКартинка);
    
    ДокументПолучатель = Новый ФорматированныйДокумент;
    НомерцияПараграфа  = 0;
    Для Каждого Параграф Из ОписаниеФорматированныйДокумент.Элементы Цикл
        
        ЭтоМаркСписок = Параграф.ТипПараграфа = ТипПараграфа.МаркированныйСписок;
        ЭтоНумСписок = Параграф.ТипПараграфа = ТипПараграфа.НумерованныйСписок;
        ЭтоОбычныйСписок = Параграф.ТипПараграфа = ТипПараграфа.Обычный;
        
        ПриставкаПараграфа = "";
        
        Если ЭтоМаркСписок  Тогда
            ПриставкаПараграфа = " • ";
            НомерцияПараграфа = 0;
        ИначеЕсли ЭтоНумСписок Тогда
            НомерцияПараграфа = НомерцияПараграфа + 1;
        Иначе
            НомерцияПараграфа = 0;
        КонецЕсли;
        
        //Накапливаем текст / данные
        ТекущийТипПараграфа = Неопределено;
        Описание = ПриставкаПараграфа;
        ЭлементПараграфаДляОформленияОбласти = Неопределено;
        
        Для Каждого ЭлементПараграфа Из Параграф.Элементы Цикл
            
            ТекущийТипПараграфа = ?(ТекущийТипПараграфа = Неопределено,Тип(ЭлементПараграфа),ТекущийТипПараграфа);
            Если Тип(ЭлементПараграфа) = Тип("ТекстФорматированногоДокумента") Тогда
                
                Если ЭтоНумСписок Тогда
                    ПриставкаПараграфа = Лев(" " + Формат(НомерцияПараграфа,"ЧЦ=3; ЧДЦ=") + ".  ",4);//ограничем 99
                    Описание = ПриставкаПараграфа + Описание + ЭлементПараграфа.Текст;    
                Иначе
                    Описание = Описание + ЭлементПараграфа.Текст;    
                КонецЕсли;
                ЭлементПараграфаДляОформленияОбласти = ЭлементПараграфа;
                ТекущийТипПараграфа = Тип("ТекстФорматированногоДокумента");
            ИначеЕсли Тип(ЭлементПараграфа) = Тип("ПереводСтрокиФорматированногоДокумента") Тогда
                
                Если ТекущийТипПараграфа = Тип("ТекстФорматированногоДокумента") Тогда
                    ТекущийТипПараграфа = Тип("ПереводСтрокиФорматированногоДокумента");
                    
                    Если ТолькоТекстКлиента Тогда
                        ШаблоныЗаполнения.ВернутьШаблонБезТегов(Описание);
                    КонецЕсли;
                    
                    ОбластьТекст.Параметры.Описание = Описание;
                    
                    
                    ВывестиФорматированныйТекстВТабличныйДокумент(ТабличныйДокумент,ОбластьТекст,ЭлементПараграфаДляОформленияОбласти);
                    ОбластьТекст = Макет.ПолучитьОбласть("ОбластьОписание");
                    Описание = ПриставкаПараграфа;
                КонецЕсли;
                
                ОбластьТекст.Параметры.Описание = "";
                
                ТабличныйДокумент.Вывести(ОбластьТекст);
            ИначеЕсли Тип(ЭлементПараграфа) = Тип("КартинкаФорматированногоДокумента") Тогда
                Если ТекущийТипПараграфа = Тип("ТекстФорматированногоДокумента") Тогда
                    ТекущийТипПараграфа = Тип("КартинкаФорматированногоДокумента");
                    
                    ОбластьТекст.Параметры.Описание = Описание;
                    ТабличныйДокумент.Вывести(ОбластьТекст);
                    Описание = ПриставкаПараграфа;
                КонецЕсли;
                
                СтрокаURL = ЭлементПараграфа.Картинка;
                
                //Преобразовываем в полноценный base64
                ИмяHeader = "base64,";
                НомерСимволаКонца = СтрНайти(СтрокаURL,ИмяHeader) + СтрДлина(ИмяHeader) - 1;
                ДлинаСтроки = СтрДлина(СтрокаURL);
                
                СтрокаBase64 = Прав(СтрокаURL,ДлинаСтроки - НомерСимволаКонца);
                
                ДанныеКартинки = Base64Значение(СтрокаBase64);
                //Определим тип файла / картинки
                ТипФайла = Сред(СтрокаURL,СтрНайти(СтрокаURL,";") -3,3);
                ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла(ТипФайла);
                ДанныеКартинки.Записать(ПутьКВременномуФайлу);
                
                Картинка = Новый Картинка(ПутьКВременномуФайлу);
                
                //Динамический вывод картинки в табличный документ
                КартинкаПечатьОрганизации = ОбластьКартинка.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
                КартинкаПечатьОрганизации.Картинка = Картинка;
                КартинкаПечатьОрганизации.Верх = 0;
                КартинкаПечатьОрганизации.Высота = ЭлементПараграфа.Высота * РазмерПикселя;
                КартинкаПечатьОрганизации.Ширина = ЭлементПараграфа.Ширина * РазмерПикселя;
                КартинкаПечатьОрганизации.Лево = 25;
                КартинкаПечатьОрганизации.ГраницаСверху = Ложь;
                КартинкаПечатьОрганизации.ГраницаСлева = Ложь;
                КартинкаПечатьОрганизации.ГраницаСправа = Ложь;
                КартинкаПечатьОрганизации.ГраницаСнизу = Ложь;
                КартинкаПечатьОрганизации.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
                ТабличныйДокумент.Вывести(ОбластьКартинка);
            КонецЕсли;
            
        КонецЦикла;
        
        Если НЕ Описание = ПриставкаПараграфа Тогда
            Если ТолькоТекстКлиента Тогда
                ШаблоныЗаполнения.ВернутьШаблонБезТегов(Описание);
            КонецЕсли;
            
            ОбластьТекст.Параметры.Описание = Описание;
            
            ВывестиФорматированныйТекстВТабличныйДокумент(ТабличныйДокумент,ОбластьТекст,ЭлементПараграфаДляОформленияОбласти);
            
            ОбластьТекст = Макет.ПолучитьОбласть("ОбластьОписание");
            Описание = ПриставкаПараграфа;
        КонецЕсли;
        
    КонецЦикла;
        
КонецПроцедуры //ВывестиФорматиованныйДокументВТабличныйДокумент

Автор: Vofka 17.12.18, 10:25

Опубликовано.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua