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

18.02.13

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

 

 

 

 

 

 

 

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15747    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17549    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16360    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25741    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88580    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. sikuda 673 18.02.13 09:45 Сейчас в теме
Интересно. А нет у тебя заготовок для ТабличныйДокумент -> HTML Table? Интересует перенос оформления в html?
2. Yashazz 4709 18.02.13 14:20 Сейчас в теме
(1) Нету. Если табличный документ не сильно "красивый" да навороченный, можно его через таблицу значений кинуть.
15. ResetAtreides 11.04.17 13:55 Сейчас в теме
(1) Табличный документ по умолчанию умеет в HTML сохраняться, СКД так сохраняю. Правда только целиком и лишние столбцы справа захватывает, не нашел адекватного способа это побороть
17. Yashazz 4709 14.04.17 13:17 Сейчас в теме
(15) Табличные документы проще сериализовать, раздербанить с помощью DOM, например, и вывалить в HTML так же, как показано в этой публикации.
18. ResetAtreides 14.04.17 13:46 Сейчас в теме
(17) Я так понял у вас из таблиц значений HTML генерируется, а мне надо прямоугольную область из табличного документа с сохранением форматирования(хоть примерным). Не очень представляю как обрабатывать сериализованный табличный документ
19. Yashazz 4709 14.04.17 19:49 Сейчас в теме
(18) вот и говорю, берёте табличный документ со всей прелестью, что в нём, превращаете в xml, а оттуда в html. Примеры кода можно глянуть тут: http://infostart.ru/public/531533/ Обрабатывать его довольно просто, там структура в общем интуитивно понятная. Можно обрабатывать как xml, можно как DOM, можно вообще как текстовый файл.
20. Yashazz 4709 24.05.17 23:38 Сейчас в теме
(18) Вот, дошли руки:
// делаем заголовок
    стро=таб.ВставитьСтроку(1);
    стро.ВертикальноеПоложение=рВыравниваниеВерт;
    стро.Выравнивание=рВыравниваниеГор;
    стро.ЦветФона=рЦветФонаЗаголовка;
	//
	телтаб.ДобавитьДочерний(стро);
    Для каждого кол Из рТаблица.Колонки Цикл
        яч=док.СоздатьЭлемент("TD");
        яч.ТекстовоеСодержимое=СокрЛП(?(ПустаяСтрока(кол.Заголовок),кол.Имя,кол.Заголовок));
        стро.ДобавитьДочерний(яч);
    КонецЦикла;
Показать
3. Steelvan 302 19.02.13 11:29 Сейчас в теме
4. mikhailovaew 127 14.03.13 11:11 Сейчас в теме
Молодец автор, большую работу сделал!
5. mikhailovaew 127 14.03.13 11:11 Сейчас в теме
Отдельное спасибо за то, что выложил текстом, и не приходится скачивать.
DowJones; purgin; DERL; shard; gluker; ITEkb; sea-man; +7 Ответить
6. FireFox_Manager 08.10.13 22:27 Сейчас в теме
Спасибо большое, очень пригодилось.
7. ALagutin 57 21.11.14 11:51 Сейчас в теме
Очень полезная функция! Спасибо!
8. HeleneBush 02.09.15 12:53 Сейчас в теме
Спасибо, очень помогло.
9. juliia1992 06.01.16 15:30 Сейчас в теме
А как можно поменять программно цвет текста в таблице, причем в строках одной конкретной колонки?
10. Yashazz 4709 23.01.16 19:50 Сейчас в теме
(9) juliia1992, придётся немножко покодить, прямо так по-простому вряд ли получится. Сделать?
11. skomisaruk 26.05.16 12:01 Сейчас в теме
12. houpl 11.01.17 07:38 Сейчас в теме
13. klom 11.01.17 07:48 Сейчас в теме
14. DERL 11.04.17 13:41 Сейчас в теме
Спасибо огромное! А как добавить шапку таблицы из наименования колонок?
16. Yashazz 4709 14.04.17 13:16 Сейчас в теме
(14) Вызывать те же действия, что пишут конкретную строку таблицы (поячейно-поколонно), только для самой коллекции колонок. Ну, дизайн можно другой наворотить)
Оставьте свое сообщение