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

 

 

 

 

 

 

 

См. также

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

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

5040 руб.

04.05.2021    18732    10    15    

16

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

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

36000 руб.

03.08.2020    16499    15    18    

15

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13215    35    8    

14

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    86602    26    51    

50
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sikuda 676 18.02.13 09:45 Сейчас в теме
Интересно. А нет у тебя заготовок для ТабличныйДокумент -> HTML Table? Интересует перенос оформления в html?
2. Yashazz 4761 18.02.13 14:20 Сейчас в теме
(1) Нету. Если табличный документ не сильно "красивый" да навороченный, можно его через таблицу значений кинуть.
15. ResetAtreides 11.04.17 13:55 Сейчас в теме
(1) Табличный документ по умолчанию умеет в HTML сохраняться, СКД так сохраняю. Правда только целиком и лишние столбцы справа захватывает, не нашел адекватного способа это побороть
17. Yashazz 4761 14.04.17 13:17 Сейчас в теме
(15) Табличные документы проще сериализовать, раздербанить с помощью DOM, например, и вывалить в HTML так же, как показано в этой публикации.
18. ResetAtreides 14.04.17 13:46 Сейчас в теме
(17) Я так понял у вас из таблиц значений HTML генерируется, а мне надо прямоугольную область из табличного документа с сохранением форматирования(хоть примерным). Не очень представляю как обрабатывать сериализованный табличный документ
19. Yashazz 4761 14.04.17 19:49 Сейчас в теме
(18) вот и говорю, берёте табличный документ со всей прелестью, что в нём, превращаете в xml, а оттуда в html. Примеры кода можно глянуть тут: http://infostart.ru/public/531533/ Обрабатывать его довольно просто, там структура в общем интуитивно понятная. Можно обрабатывать как xml, можно как DOM, можно вообще как текстовый файл.
20. Yashazz 4761 24.05.17 23:38 Сейчас в теме
(18) Вот, дошли руки:
// делаем заголовок
    стро=таб.ВставитьСтроку(1);
    стро.ВертикальноеПоложение=рВыравниваниеВерт;
    стро.Выравнивание=рВыравниваниеГор;
    стро.ЦветФона=рЦветФонаЗаголовка;
	//
	телтаб.ДобавитьДочерний(стро);
    Для каждого кол Из рТаблица.Колонки Цикл
        яч=док.СоздатьЭлемент("TD");
        яч.ТекстовоеСодержимое=СокрЛП(?(ПустаяСтрока(кол.Заголовок),кол.Имя,кол.Заголовок));
        стро.ДобавитьДочерний(яч);
    КонецЦикла;
Показать
3. Steelvan 304 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 4761 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 4761 14.04.17 13:16 Сейчас в теме
(14) Вызывать те же действия, что пишут конкретную строку таблицы (поячейно-поколонно), только для самой коллекции колонок. Ну, дизайн можно другой наворотить)
Оставьте свое сообщение