Из таблиц значений в html-таблицы, функция

На входе — таблица значений, в ячейках которой могут содержаться другие таблицы значений и массивы, в которых могут быть таблицы значений. Рекурсивная функция. На выходе — html-строка, представляющая собой готовый документ или фрагмент для использования в html.
Действие, обратное http://infostart.ru/public/172688/ (собственно, "по заявкам" и сделано)

 

Функция ПолучитьHTMLизТаблицыЗначений(рТаблица,Знач рПараметры=«»,докВладелец=Неопределено) Экспорт

    // распознаем параметры

    Если ТипЗнч(рПараметры)<>Тип(«Структура») Тогда рПараметры=Новый Структура КонецЕсли;

    //рКодировка=?(рПараметры.Свойство(«Кодировка»),рПараметры.Кодировка,»UTF-8″);

    рШиринаРамки=?(рПараметры.Свойство(«ШиринаРамки»),рПараметры.ШиринаРамки,0); // в пикселях

    Если рШиринаРамки<>0 Тогда // имеет смысл

        рЦветРамки=?(рПараметры.Свойство(«ЦветРамки»),рПараметры.ЦветРамки,«»);

        рЦветРамкиЯркий=?(рПараметры.Свойство(«ЦветРамкиЯркий»),рПараметры.ЦветРамкиЯркий,«»);

        рЦветРамкиТёмный=?(рПараметры.Свойство(«ЦветРамкиТемный»),рПараметры.ЦветРамкиТемный,«»);

        рТипРамки=?(рПараметры.Свойство(«ТипРамки»),рПараметры.ТипРамки,«hsides»);

        рЛинии=?(рПараметры.Свойство(«Линии»),рПараметры.Линии,«all»);

    КонецЕсли;

    рМеждуЯчейками=?(рПараметры.Свойство(«МеждуЯчейками»),рПараметры.МеждуЯчейками,0);

    рОтступДоЯчейки=?(рПараметры.Свойство(«ОтступДоЯчейки»),рПараметры.ОтступДоЯчейки,1);

    рШирина=?(рПараметры.Свойство(«Ширина»),рПараметры.Ширина,100); // макс.ширина, пиксели или проценты

    рВысота=?(рПараметры.Свойство(«Высота»),рПараметры.Высота,1);

    рЦветФона=?(рПараметры.Свойство(«ЦветФона»),рПараметры.ЦветФона,«»);

    рВыравнивание=?(рПараметры.Свойство(«Выравнивание»),рПараметры.Выравнивание,«center»);

    рВыравниваниеГор=?(рПараметры.Свойство(«ВыравниваниеГоризонтальное»),рПараметры.ВыравниваниеГоризонтальное,«middle»);

    рВыравниваниеВерт=?(рПараметры.Свойство(«ВыравниваниеВертикальное»),рПараметры.ВыравниваниеВертикальное,«center»);

    // определимся с документом

    Если докВладелец=Неопределено Тогда

        док=Новый ДокументHTML(«»);

        телдок=док.СоздатьЭлемент(«BODY»);

        док.Тело=телдок;

    Иначе

        док=докВладелец;

        телдок=док.Тело;

    КонецЕсли;

    // собственно делаем таблицу

    таб=док.СоздатьЭлемент(«TABLE»);

    // ставим параметры таблицы в целом, имеющие свойства в объектной модели 1С

    таб.Выравнивание=рВыравнивание; // align

    таб.Рамка=СокрЛП(рШиринаРамки); // border

    таб.ОтступДоЯчейки=СокрЛП(рОтступДоЯчейки); // cellPadding

    таб.РасстояниеМеждуЯчейками=СокрЛП(рМеждуЯчейками); // cellSpacing

    таб.ЦветФона=СокрЛП(рЦветФона); // bgColor

    таб.Ширина=СокрЛП(рШирина); // width

    Если рШиринаРамки<>0 Тогда // имеет смысл

        таб.Линии=СокрЛП(рЛинии); // rules (допустимо: all, groups, cols, none, rows)

    КонецЕсли;

    // ставим параметры таблицы в целом, НЕ имеющие свойств в объектной модели 1С

    // ставим их в атрибуты именно к таб, а не ко всему Телу документа, и не к Телу таблицы

    атр=док.СоздатьАтрибут(«height»);

    атр.Значение=СокрЛП(рВысота);

    таб.Атрибуты.УстановитьИменованныйЭлемент(атр);

    //

    атр=док.СоздатьАтрибут(«cols»); // общее объявление

    атр.Значение=СокрЛП(рТаблица.Колонки.Количество());

    таб.Атрибуты.УстановитьИменованныйЭлемент(атр);

    //

    //атр=док.СоздатьАтрибут(«nowrap»); // запрет переносов текста (кому понадобится, раскомментите)

    //атр.Значение=Истина;

    //таб.Атрибуты.УстановитьИменованныйЭлемент(атр);

    // аналогичным образом можно устанавливать прочие свойства таблицы в целом, её строк и ячеек

    Если рШиринаРамки<>0 Тогда // имеет смысл

        атр=док.СоздатьАтрибут(«borderColor»);

        атр.Значение=СокрЛП(рЦветРамки);

        таб.Атрибуты.УстановитьИменованныйЭлемент(атр);

        атр=док.СоздатьАтрибут(«borderColorLight»);

        атр.Значение=СокрЛП(рЦветРамкиЯркий);

        таб.Атрибуты.УстановитьИменованныйЭлемент(атр);

        атр=док.СоздатьАтрибут(«borderColorDark»);

        атр.Значение=СокрЛП(рЦветРамкиТёмный);

        таб.Атрибуты.УстановитьИменованныйЭлемент(атр);

        // доступные типы рамок: void, above, below, lhs, rhs, hsides, vsides, box

        атр=док.СоздатьАтрибут(«frame»);

        атр.Значение=СокрЛП(рТипРамки);

        таб.Атрибуты.УстановитьИменованныйЭлемент(атр);

    КонецЕсли;

    // добавляем таблицу и её тело

    телдок.ДобавитьДочерний(таб);

    телтаб=док.СоздатьЭлемент(«TBODY»);

    таб.ДобавитьДочерний(телтаб);

    // заполняем таблицу

    Для каждого рСтрока Из рТаблица Цикл

        #Если Клиент Тогда

            ОбработкаПрерыванияПользователя();

        #КонецЕсли

        стро=таб.ВставитьСтроку(1); // вопреки документации, Индекс это обязательный параметр

        // хотя, строку можно добавлять и так: стро=док.СоздатьЭлемент(«TR»), но ИндексСтроки поменять будет нельзя!

        стро.ВертикальноеПоложение=рВыравниваниеВерт;

        стро.Выравнивание=рВыравниваниеГор;

        стро.ЦветФона=рЦветФона;

        телтаб.ДобавитьДочерний(стро);

        // коллекция Ячейки — для чтения, а нам надо добавлять

        Для каждого кол Из рТаблица.Колонки Цикл

            #Если Клиент Тогда

                ОбработкаПрерыванияПользователя();

            #КонецЕсли

            //яч=стро.ВставитьЯчейку(1); // а вот это почему-то вообще не заработало ни при каких…

            яч=док.СоздатьЭлемент(«TD»);    // поэтому делаем так

            рЗначение=рСтрока[кол.Имя];

            Если ТипЗнч(рЗначение)=Тип(«ТаблицаЗначений») Тогда

                яч.ДобавитьДочерний(ПолучитьHTMLизТаблицыЗначений(рЗначение,рПараметры,док));

            ИначеЕсли ТипЗнч(рЗначение)=Тип(«Массив») Тогда

                Для каждого знч Из рЗначение Цикл

                    #Если Клиент Тогда

                        ОбработкаПрерыванияПользователя();

                    #КонецЕсли

                    Если ТипЗнч(знч)=Тип(«ТаблицаЗначений») Тогда

                        яч.ДобавитьДочерний(ПолучитьHTMLизТаблицыЗначений(знч,рПараметры,док));

                    Иначе // вложенные массивы поддерживать не будем, но при желании можно сделать

                        тек=док.СоздатьЭлемент(«P»); // можно, например, так

                        тек.ТекстовоеСодержимое=СокрЛП(Строка(знч));

                        яч.ДобавитьДочерний(тек);

                    КонецЕсли;

                КонецЦикла;

            Иначе // записываем строковое представление

                яч.ТекстовоеСодержимое=СокрЛП(Строка(рЗначение));

            КонецЕсли;

            стро.ДобавитьДочерний(яч);

        КонецЦикла;

    КонецЦикла;

    Если докВладелец<>Неопределено Тогда

        Возврат таб; // нужна таблица как ЭлементHTML

    Иначе

        // нужен полноценный текст результата, записываем получившееся

        зап1=Новый ЗаписьHTML;

        зап1.УстановитьСтроку(); // вопреки документации, параметр Кодировка не допускается

        зап2=Новый ЗаписьDOM; // обойдёмся без явного указания конфигурации записи DOM

        зап2.Записать(док,зап1);

        Возврат зап1.Закрыть();

    КонецЕсли;

КонецФункции

 

И собственно пример вызова функции:

    рПараметры=Новый Структура;

    рПараметры.Вставить(«ШиринаРамки»,2);

    рПараметры.Вставить(«ТипРамки»,«box»);

    рПараметры.Вставить(«ЦветРамки»,«#99cc00»);

    рПараметры.Вставить(«ЦветРамкиЯркий»,«#00ff00»);

    рПараметры.Вставить(«ЦветРамкиТемный»,«#339966»);

    рПараметры.Вставить(«МеждуЯчейками»,0);

    рПараметры.Вставить(«ОтступДоЯчейки»,1);

    рПараметры.Вставить(«Ширина»,«70%»);

    рПараметры.Вставить(«Высота»,1);

    рПараметры.Вставить(«ЦветФона»,«#fffacd»);

    рПараметры.Вставить(«Выравнивание»,«center»); // всей таблицы

    рПараметры.Вставить(«ВыравниваниеГоризонтальное»,«middle»); // текста в ячейках

    рПараметры.Вставить(«ВыравниваниеВертикальное»,«center»); // текста в ячейках

    //

    тб=новый таблицазначений;

    тб.Колонки.Добавить(«к1»); тб.Колонки.Добавить(«к2»); тб.Колонки.Добавить(«к3»);

    стро=тб.Добавить(); стро.к1=«1»; стро.к2=«2»; стро.к3=«3»;

    стро=тб.Добавить(); стро.к1=«4»; стро.к2=«5»; стро.к3=«6»;

    тб2=тб.СкопироватьКолонки();

    стро=тб2.Добавить(); стро.к1=«Всем»; стро.к2=«большой»; стро.к3=«привет!»;

    стро=тб2.Добавить(); стро.к1=«Это пример»; стро.к2=«преобразования таблицы значений»; стро.к3=«в html-таблицу»;

    мас=Новый Массив;

    мас.Добавить(«Текст выше таблички»); мас.Добавить(тб2); мас.Добавить(«Текст ниже таблички»);

    стро=тб.Добавить(); стро.к1=мас; стро.к2=тб2.Скопировать(); стро.к3=«молодцы»;

    Сообщить(ПолучитьHTMLизТаблицыЗначений(тб,рПараметры));

 

 

 

 

 

 

 

20 Comments

  1. sikuda

    Интересно. А нет у тебя заготовок для ТабличныйДокумент -> HTML Table? Интересует перенос оформления в html?

    Reply ↓
  2. Yashazz

    (1) Нету. Если табличный документ не сильно «красивый» да навороченный, можно его через таблицу значений кинуть.

    Reply ↓
  3. Steelvan

    Вот спасибо.

    Reply ↓
  4. mikhailovaew

    Молодец автор, большую работу сделал!

    Reply ↓
  5. mikhailovaew

    Отдельное спасибо за то, что выложил текстом, и не приходится скачивать.

    Reply ↓
  6. FireFox_Manager

    Спасибо большое, очень пригодилось.

    Reply ↓
  7. ALagutin

    Очень полезная функция! Спасибо!

    Reply ↓
  8. HeleneBush

    Спасибо, очень помогло.

    Reply ↓
  9. juliia1992

    А как можно поменять программно цвет текста в таблице, причем в строках одной конкретной колонки?

    Reply ↓
  10. Yashazz

    (9) juliia1992, придётся немножко покодить, прямо так по-простому вряд ли получится. Сделать?

    Reply ↓
  11. skomisaruk

    Спасибо большое!!!

    Reply ↓
  12. houpl

    Спасибо

    Reply ↓
  13. klom

    Спасибо. В копилку.

    Reply ↓
  14. DERL

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

    Reply ↓
  15. ResetAtreides

    (1) Табличный документ по умолчанию умеет в HTML сохраняться, СКД так сохраняю. Правда только целиком и лишние столбцы справа захватывает, не нашел адекватного способа это побороть

    Reply ↓
  16. Yashazz

    (14) Вызывать те же действия, что пишут конкретную строку таблицы (поячейно-поколонно), только для самой коллекции колонок. Ну, дизайн можно другой наворотить)

    Reply ↓
  17. Yashazz

    (15) Табличные документы проще сериализовать, раздербанить с помощью DOM, например, и вывалить в HTML так же, как показано в этой публикации.

    Reply ↓
  18. ResetAtreides

    (17) Я так понял у вас из таблиц значений HTML генерируется, а мне надо прямоугольную область из табличного документа с сохранением форматирования(хоть примерным). Не очень представляю как обрабатывать сериализованный табличный документ

    Reply ↓
  19. Yashazz

    (18) вот и говорю, берёте табличный документ со всей прелестью, что в нём, превращаете в xml, а оттуда в html. Примеры кода можно глянуть тут: http://infostart.ru/public/531533/ Обрабатывать его довольно просто, там структура в общем интуитивно понятная. Можно обрабатывать как xml, можно как DOM, можно вообще как текстовый файл.

    Reply ↓
  20. Yashazz

    (18) Вот, дошли руки:

    // делаем заголовок
    стро=таб.ВставитьСтроку(1);
    стро.ВертикальноеПоложение=рВыравниваниеВерт;
    стро.Выравнивание=рВыравниваниеГор;
    стро.ЦветФона=рЦветФонаЗаголовка;
    //
    телтаб.ДобавитьДочерний(стро);
    Для каждого кол Из рТаблица.Колонки Цикл
    яч=док.СоздатьЭлемент(«TD»);
    яч.ТекстовоеСодержимое=СокрЛП(?(ПустаяСтрока(кол.Заголовок),кол.Имя,кол.Заголовок));
    стро.ДобавитьДочерний(яч);
    КонецЦикла;
    

    Показать

    Reply ↓

Leave a Comment

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