Создание кода 1С на основании html документа

11.10.16

Разработка - Инструментарий разработчика

Этот механизм пригодится, если вы имеете шаблон в виде html, а вам нужно формировать его программно. Используя эту обработку, можно взять файл или адрес в интернете и построить программный код 1С, для его дальнейшего использования в своих работах. Для формирования используется документ dom.

Скачать файлы

Наименование Файл Версия Размер
Файл обработки 1С.
.epf 14,41Kb
11
.epf 14,41Kb 11 Скачать

Функционально на выходе вы получите 1 процедуру и 1 функцию. Процедура формирует документ dom. Функция упрощает написание кода добавления нового тега. Хочу обратить ваше внимание, что теги типа pre и code, возможно, нужно создавать в секции cdata, потому как там скорее всего встретится форматирование и спецсимволы, задействованные в html. При необходимости все это можно доработать.

Описывать загрузку и создание объекта документ dom я не буду, так как это не относится к основной теме статьи. Перейдем сразу к ядру формирования.

Функция ПереборВсехЭлементовДокументаDOM(Домик, СтрокаКода, ИмяРодителя, Счетчик, Префикс = "") 
	КоллекцияУзлов = Домик.ДочерниеУзлы;
	
	ЛокальныйСчетчик = 0;
	Для Каждого ОчереднойУзел Из КоллекцияУзлов Цикл
		ЛокальныйСчетчик = ЛокальныйСчетчик + 1;
		Если ОчереднойУзел.ТипУзла = ТипУзлаDOM.Элемент Тогда
			//формируем префикс, он начинается с первого рекурсивного вызова
			Если Счетчик = 1 Тогда
				Префикс =  Формат(Счетчик, "ЧГ=");
			КонецЕсли;
			//имя переменной (тега), "домик" только для первого вызова, лок. счетчик тоже
			ИмяПеременной = ?(ИмяРодителя = "Домик", "Тег_", ИмяРодителя) + Префикс + "_" + Формат(ЛокальныйСчетчик, "ЧГ=");
			//начало формирование строки кода. "&Текстовка" будем потом заменять
			СтрокаКода = СтрокаКода + Символы.Таб + ИмяПеременной + 
				" = ДобавитьТегСАтрибутом(" + ИмяРодителя + ?(Счетчик = 1, "", Префикс) + ", """ + ОчереднойУзел.ИмяУзла + """, &Текстовка "; 
			//Отработка атрибутов
			Если ОчереднойУзел.Атрибуты <> Неопределено Тогда
				СтрокаИменАтрибутов = "";
				СтрокаЗначенийАтрибутов = "";
				СтрокаИд = "";
				Для Каждого ОчереднойАтрибут Из ОчереднойУзел.Атрибуты Цикл
					//идентификатор это особенный атрибут, его пихнем последним параметром функции ДобавитьТегСАтрибутом() 
					Если ВРег(ОчереднойАтрибут.Имя) = "ID" Тогда
						СтрокаИд = ОчереднойАтрибут.Значение;
					Иначе
						СтрокаИменАтрибутов = СтрокаИменАтрибутов + ОчереднойАтрибут.Имя + ",";
						СтрокаЗначенийАтрибутов = СтрокаЗначенийАтрибутов + ОчереднойАтрибут.Значение + ",";
					КонецЕсли;
				КонецЦикла;
				//отсечение последней запятой
				Если СтрЗаканчиваетсяНа(СтрокаИменАтрибутов, ",") Тогда
					СтрокаИменАтрибутов = Лев(СтрокаИменАтрибутов, СтрДлина(СтрокаИменАтрибутов) - 1);
				КонецЕсли;
				Если СтрЗаканчиваетсяНа(СтрокаЗначенийАтрибутов, ",") Тогда
					СтрокаЗначенийАтрибутов = Лев(СтрокаЗначенийАтрибутов, СтрДлина(СтрокаЗначенийАтрибутов) - 1);
				КонецЕсли;
				//дозаполнение строки кода
				СтрокаКода = СтрокаКода + ", """ + СтрокаИменАтрибутов + """, """ + СтрокаЗначенийАтрибутов + """";
				//добавляем идентификатор, если он не пуст
				Если Не ПустаяСтрока(СтрокаИд) Тогда
					СтрокаКода = СтрокаКода + ", """ + СтрокаИд + """";
				КонецЕсли;
			КонецЕсли;
			//закрываем скобку Функции
			СтрокаКода = СтрокаКода + ");" + Символы.ПС;
			//рекурсивный вызов
			Если ОчереднойУзел.ДочерниеУзлы.Количество() > 0 Тогда
				//ИмяНовогоРодителя = "Тег" + Формат(Счетчик, "ЧГ=");
				//СтрокаКода = СтрокаКода + ИмяНовогоРодителя + " = Тег;" + Символы.ПС;
				ПереборВсехЭлементовДокументаDOM(
					ОчереднойУзел, 
					СтрокаКода, 
					"Тег_", 
					Счетчик + 1,
					Префикс + "_" + Формат(ЛокальныйСчетчик, "ЧГ="));
			КонецЕсли;
		ИначеЕсли ОчереднойУзел.ТипУзла = ТипУзлаDOM.Текст Тогда
			Фрагмент = СокрЛП(ОчереднойУзел.ПолныйТекст);
			Фрагмент = СтрЗаменить(Фрагмент, """", """""");//замена кавычек на 2 символа кавычек
			СтрокаКода = СтрЗаменить(СтрокаКода, "&Текстовка", """" + Фрагмент + """");
		КонецЕсли;
		//на случай если текста у тега нет
		СтрокаКода = СтрЗаменить(СтрокаКода, "&Текстовка", "");
	КонецЦикла;
КонецФункции

Давайте рассмотрим, как это работает.

  1. Для начала устанавливаем необходимые переменные "КоллекцияУзлов" и "ЛокальныйСчетчик". 
  2. Далее в цикле обходим коллекцию элементов (тегов) документа dom.
  3. В теле цикла увеличиваем локальный счетчик и анализируем текущий элемент.
  4. Если мы встретили ЭлементDOM, то формируем строку кода, которая добавляет тег (элемент).
  5. Проверяем наличие у текущего элемента наличие атрибутов. Формируем и их при наличии. Причем атрибут с именем ID определяем как идентификатор.
  6. Убрав последнюю запятую, добаввляем данные атрибутов в строку создания тега.
  7. Закрываем последнюю скобку в строке функции.
  8. Дальше очень важный момент. Если текущий элемент является владельцем подчиненных элементов, то происходит рекурсивный вызов с передачей необходимых параметров.
  9. Далее по коду мы возвращаемся в тело цикла и опять проверяем тип текущего элемента. Если он текстовый, то добавляем текстовку в строку формирования нового тега.
  10. И наконец, если текстовки не было, то удаляем ненужный фрагмент "&Текстовка".

Исходный код универсальной функции создания нового тега (элемента) документа dom:

// Добавляет новй тег в родительский, устанавливает его текст и атрибуты,
// помещает его в роительский тег.
// По окончании возвращает вновь созданный тег
//
// Параметры:
//  РодительскийТег  - ЭлементDOM или ДокументDOM - родительский тег
//                 
//  ИмяНовогоТега  - Строка - имя вновь создаваемого тега
//                
//  ТекстТега  - Строка - текстовое содержимое вновь создаваемого тега
//
//  Атрибуты  - Строка - имена (через запятую) или имя вновь создаваемого тега
//
//  Значения атрибутов  - Строка - значения (через запятую) или значение атрибутов
//  для вновь создаваемого тега/ов
//
//  Ид  - Строка - Идентификатор для вновь создаваемого тега
//
// Возвращаемое значение:
//   ЭлементDOM   - возданный тег
//
Функция ДобавитьТегСАтрибутом(РодительскийТег, ИмяНовогоТега, ТекстТега = "", Атрибуты = "", ЗначенияАтрибутов = "", Ид = "") Экспорт
	//проверки
	Если ТипЗнч(РодительскийТег) <> Тип("ЭлементDOM") И ТипЗнч(РодительскийТег) <> Тип("ДокументDOM") Тогда
		Сообщить("Процедура ДобавитьТегСАтрибутом() получила не верный параметр РодительскийТег(1)");
		Возврат Неопределено;
	КонецЕсли;
	Если ИмяНовогоТега <> Неопределено И Типзнч(ИмяНовогоТега) <> Тип("Строка") Или ПустаяСтрока(ИмяНовогоТега) Тогда
		Сообщить("Процедура ДобавитьТегСАтрибутом() получила не верный параметр ИмяНовогоТега(2)");
		Возврат Неопределено;
	КонецЕсли;
	Если Типзнч(ТекстТега) <> Тип("Строка") Тогда
		Сообщить("Процедура ДобавитьТегСАтрибутом() получила не верный параметр ТекстТега(3)");
		Возврат Неопределено;
	КонецЕсли;
	Если Типзнч(Атрибуты) <> Тип("Строка") Тогда
		Сообщить("Процедура ДобавитьТегСАтрибутом() получила не верный параметр Атрибуты(4)");
		Возврат Неопределено;
	КонецЕсли;
	Если Типзнч(ЗначенияАтрибутов) <> Тип("Строка") Тогда
		Сообщить("Процедура ДобавитьТегСАтрибутом() получила не верный параметр ЗначенияАтрибутов(5)");
		Возврат Неопределено;
	КонецЕсли;
	Если Типзнч(Ид) <> Тип("Строка") Тогда
		Сообщить("Процедура ДобавитьТегСАтрибутом() получила не верный параметр Ид(6)");
		Возврат Неопределено;
	КонецЕсли;
	
	//Функционал
	НовыйТег = РодительскийТег.ДокументВладелец.СоздатьЭлемент(ИмяНовогоТега);
	//текстовка
	Если Не ПустаяСтрока(ТекстТега) Тогда
		Текстовка = РодительскийТег.ДокументВладелец.СоздатьТекстовыйУзел(ТекстТега);
		НовыйТег.ДобавитьДочерний(Текстовка);
	КонецЕсли;
	//атрибуты
	Если Не ПустаяСтрока(Атрибуты) И
		Не ПустаяСтрока(ЗначенияАтрибутов) Тогда
		МассивИменАтрибутов = СтрРазделить(Атрибуты, ",", Истина);
		МассивЗначенийАтрибутов = СтрРазделить(ЗначенияАтрибутов, ",", Истина);
		Для н = 0 По МассивИменАтрибутов.ВГраница() Цикл
			Атрибут = СокрЛП(МассивИменАтрибутов[н]);
			ЗначениеАтрибута = ?(МассивЗначенийАтрибутов.ВГраница() >= н , СокрЛП(МассивЗначенийАтрибутов[н]), "");
			НовыйТег.УстановитьАтрибут(Атрибут, ЗначениеАтрибута);
		КонецЦикла;
	КонецЕсли;
	//Идентификатор
	Если Не ПустаяСтрока(Ид) Тогда
		НовыйТег.УстановитьАтрибут("id", Ид);
		НовыйТег.УстановитьАтрибутИдентификатор("id", Истина);
	КонецЕсли;
	РодительскийТег.ДобавитьДочерний(НовыйТег);
	Возврат НовыйТег;
КонецФункции

Эта функция значительно упрощает создание элементов документа dom и может быть использована отдельно, так как весьма удобна. Описывать ее работу особого смысла нет. Добавление тега в родительский, установка атрибутов и текста. Контекст вызова не имеет значения.

Наконец на выходе мы получаем готовый код 1С, который можно вставлять в свой модуль. Править его и исмользовать по назначению. Более полный функционал можно взять из файла обработки, прикрепленного к статье.

ДокументDom html xml

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119981    656    389    

701

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7020    20    6    

37

Infostart УДиФ: Управление данными и формами

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

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    3257    10    1    

31

SALE! 30%

PowerTools

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

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177364    1071    0    

846

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99208    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

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

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    17922    6    8    

38

1С HTML Шаблоны / HTML Templates

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

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    27952    3    10    

14

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23494    15    15    

31
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Makushimo 160 12.10.16 05:27 Сейчас в теме
2. SeiOkami 3418 14.10.16 08:41 Сейчас в теме
Если я правильно понял, то это годная вещь. Побольше бы скринов. Например, шаги действия: указали сайт, нажали пару кнопок, получили такой вот результат.
3. makc2k 107 14.10.16 15:51 Сейчас в теме
Да там итак все примитивно. Указали файл или адрес и нажали кнопку "фас". Хотя картинок маловато, согласен.
4. jaroslav.h 180 14.10.16 17:12 Сейчас в теме
Поясните будьте добры, как и где можно применять? Не понял, если честно, спасибо.
5. makc2k 107 17.10.16 12:50 Сейчас в теме
Применение очень простое. Вы увидели в сети страницу, которая вам понравилась и решили на ее базе создать прайс лист например. Чтобы вручную не набирать код формирующий объект dom (та же страница но в объекте 1С), пользуйтесь этой обработкой.
6. v3rter 17.10.16 12:58 Сейчас в теме
Проверьте орфографию статьи, например, в ворде или фаерфоксе - есть ошибки. Я не из фанатиков-"граммаров", но глаз цепляет.
Оставьте свое сообщение