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

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

Из таблиц значений в 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изТаблицыЗначений(тб,рПараметры));

 

 

 

 

 

 

 

has been added to your cart:
Оформление заказа