Из таблиц значений в 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 не будет опубликован. Обязательные поля помечены *