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