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

11.10.16

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Файл обработки 1С.
.epf 14,41Kb
11
11 Скачать (1 SM) Купить за 1 850 руб.

Функционально на выходе вы получите 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

См. также

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

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

12000 руб.

02.09.2020    171868    962    403    

924

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14364    109    46    

108

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

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

22200 руб.

06.10.2023    17310    43    15    

75

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

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

9360 руб.

17.05.2024    27301    96    48    

138

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

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

15000 руб.

10.11.2023    11913    45    27    

67

SALE! %

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

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

4800 3840 руб.

14.01.2013    191276    1152    0    

920

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    18097    7    32    

42

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1131    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Makushimo 160 12.10.16 05:27 Сейчас в теме
2. SeiOkami 3533 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 Сейчас в теме
Проверьте орфографию статьи, например, в ворде или фаерфоксе - есть ошибки. Я не из фанатиков-"граммаров", но глаз цепляет.
Оставьте свое сообщение