gifts2017

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

Опубликовал Яков Коган (Yashazz) в раздел Обмен - Интеграция с WEB

На входе - таблица значений, в ячейках которой могут содержаться другие таблицы значений и массивы, в которых могут быть таблицы значений. Рекурсивная функция. На выходе - 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изТаблицыЗначений(тб,рПараметры));

 

 

 

 

 

 

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Кудашкин (sikuda) 18.02.13 09:45
Интересно. А нет у тебя заготовок для ТабличныйДокумент -> HTML Table? Интересует перенос оформления в html?
2. Яков Коган (Yashazz) 18.02.13 14:20
(1) Нету. Если табличный документ не сильно "красивый" да навороченный, можно его через таблицу значений кинуть.
3. Игорь Steelvan (Steelvan) 19.02.13 11:29
4. mikhailovaew (mikhailovaew) 14.03.13 11:11
Молодец автор, большую работу сделал!
5. mikhailovaew (mikhailovaew) 14.03.13 11:11
Отдельное спасибо за то, что выложил текстом, и не приходится скачивать.
shard; gluker; OrsoBear; sea-man; +4 Ответить
6. yinfo (FireFox_Manager) 08.10.13 22:27
Спасибо большое, очень пригодилось.
7. Антон Лагутин (ALagutin) 21.11.14 11:51
Очень полезная функция! Спасибо!
8. Елена Мишина (HeleneBush) 02.09.15 12:53
9. Юлия Горькова (juliia1992) 06.01.16 15:30
А как можно поменять программно цвет текста в таблице, причем в строках одной конкретной колонки?
10. Яков Коган (Yashazz) 23.01.16 19:50
(9) juliia1992, придётся немножко покодить, прямо так по-простому вряд ли получится. Сделать?
11. Олександр Комісарук (skomisaruk) 26.05.16 12:01
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа