Создание кода 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С.

15500 руб.

02.09.2020    178415    987    403    

947

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

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

8400 руб.

20.08.2024    19856    131    70    

134

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

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

22200 руб.

06.10.2023    18917    51    19    

83

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

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

15000 руб.

10.11.2023    12925    53    33    

72

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

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

9360 руб.

17.05.2024    29097    100    48    

146

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

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

20000 руб.

07.10.2021    18676    7    32    

43

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

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

3600 руб.

27.12.2024    1783    2    0    

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