HTML - это просто: Программное формирование HTML документа, содержащего ссылки на объекты БД

16.06.15

Разработка - Работа с интерфейсом

В данной статье рассматривается способ программного формирования HTML документа, содержащего ссылки на объекты базы данных, такие как справочники, документы и т.д. Показан пример построения обработчика события OnClick ПоляHTMLДокумента, для обработки клика на html -ссылке.

Скачать файл

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

Наименование По подписке [?] Купить один файл
ФормиированиеHTML.rar
.rar 8,62Kb
10
10 Скачать (2 SM) Купить за 2 150 руб.

Предисловие

Однажды, дописывая обработку, создающую и модифицирующую, не суть важно какие документы, я подумал, что неплохо было бы вывести для пользователя некое резюме:

"Создан документ такой-то"

"Изменен документ такой-то" и т.д.

От обычного, в таких случаях, вывода информации в окно сообщений я сразу отказался, так как не удобно это, сначала читать в окне сообщений "Создан документ ... " а потом запоминать его номер, открывать соответствующий журнал (или форму списка) и искать там этот документ. А если документов много и пользователь хочет посмотреть все документы?(или выборочно) Насколько это неудобно я убедился при отладке обработки ...

То, что в форме есть элемент управления именуемый ПолеHTMLДокумента я конечно знал, но вот представилась возможность познакомиться с ним поближе. Было решено реестр обработанных документов выводить в виде html документа содержащего ссылки на эти самые документы, а по клику на ссылке открывать форму соответствующего документа. Здесь мне многие могут возразить: "А почему бы для этих целей не использовать обычный макет, выводимый в табличный документ, а для открытия документов использовать расшифровку? И чем Ваш способ лучше?" Отвечаю: Конечно можно использовать, и мой способ ничем не лучше. Он просто другой. Ведь у хорошего программиста  для решения одной задачи должно быть в арсенале несколько инструментов :)

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

Создаем новый отчет, его форму, на форме размещаем элемент управления ПолеHTMLДокумента.

Текст модуля формы:


Процедура ДобавитьТекстHTML(ТекстHTML, Элемент);
   
// Ссылку будем формировать хитро:
    // Предполагаем что символ "-" не входит в имена объектов метаданных,
    // учавствующих в формировании html
    // Тогда ссылка будет иметь следующий вид:
    // Номенклатура-d341d377-b3b1-11dc-a100-0011d85708ff
    // Передавать нашу ссылку будем через атрибут id
   
СсылкаНаЭлемент = Элемент.Метаданные().Имя+"-"
   
+Элемент.Ссылка.УникальныйИдентификатор();
   
ТекстHTML.ДобавитьСтроку("<A id=""" + СсылкаНаЭлемент + """ href= """
   
+ Элемент + """ >"+Элемент+"</A><BR>");
КонецПроцедуры

Процедура
ДействияФормыСформировать(Кнопка)
   
Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    Номенклатура.Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура"
);
   
ТекстHTML = Новый ТекстовыйДокумент;
   
Выборка = Запрос.Выполнить().Выбрать();
    Пока
Выборка.Следующий() Цикл
       
ДобавитьТекстHTML(ТекстHTML, Выборка.Ссылка);
    КонецЦикла;
ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(ТекстHTML.ПолучитьТекст());
КонецПроцедуры

Ну вот html мы сформировали, теперь что бы ссылки "ожили" надо написать обработчик события OnClick элемента управления ПолеHTMLДокумента.

Процедура ПолеHTMLДокументаonclick(Элемент, pEvtObj)
   
htmlElement = НайтиСсылку(pEvtObj.srcElement);
   
// Анализируем если произошло нажание не ссылку
   
Если htmlElement <> Неопределено Тогда
       
// Если у ссылки есть идентификатор
       
Если СокрЛП(htmlElement.id) <> "" Тогда
           
// Получаем ссылку из атрибута id
           
СсылкаНаЭлемент = htmlElement.id;
           
Разделитель = Найти(СсылкаНаЭлемент,"-");
            Если
Разделитель > 0 Тогда
               
// Получаем тип элемента
               
ТипЭлемента = Лев(СсылкаНаЭлемент,Разделитель-1);
               
// Получаем УникальныйИдентификатор
               
ГУИД = Сред(СсылкаНаЭлемент,Разделитель+1);
               
Справочники[ТипЭлемента].ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИД)).ПолучитьФорму().Открыть();
            КонецЕсли;
           
// Отказ от стандартной обработки клика
           
pEvtObj.returnValue = Ложь;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Функция
НайтиСсылку(Элемент)
   
Врем = Элемент;
    Пока
Врем <> Неопределено Цикл
        Если
НРег(Врем.tagName) = "a" Тогда
            Возврат
Врем;
        КонецЕсли;
       
Врем = Врем.parentElement;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции

Всё можно пробовать! см. Рис.1

Заключение

Обратите внимание что ссылку я формировал следующим образом:

<ИмяОбъектаМетаданных>-<УникальныйИдентификатор> это сделано для того, чтобы в обработчике можно было определить к какому объекту метаданных относится данный УникальныйИдентификатор, потому что имея ТОЛЬКО УникальныйИдентификатор невозможно определить к какому объекту метаданных он относиться. Точнее возможно, но уж слишком долго и неудобно - путем перебора всех метаданных в цикле, для каждого объекта метаданных выполнять попытку <ОбъектМетаданных>.ПолучитьСсылку(Новый УникальныйИдентификатор(НашУникальныйИдентификатор))

Хотя в нашем примере только один справочник, и указывать его вид было необязательно, и так понятно что это УникальныйИдентификатор элемента справочника Номенклатура, но вдруг Вам потребуется работать с несколькими справочниками, вот тут то мой способ задания ссылки Вам и пригодится.

P.S. Платформа 8.2 имеет встроенный механизм работы со ссылками на объекты БД и данная задача наверняка упростится, но это уже другая тема.

P.P.S. Как выяснилось, в ходе обсуждения этой статьи, существует и более простой способ формирования ссылки на объект БД. Выкладываю пример кода, в котором ссылка формируется по методу о котором написал в форуме Saint:


Источник: http://www.obrabotki.com/1s-create-html-1/

http://www.obrabotki.com/1s-create-html-2/

См. также

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

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

15500 руб.

02.09.2020    180508    1001    403    

954

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

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

8400 руб.

20.08.2024    21803    146    82    

144

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

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

22200 руб.

06.10.2023    19487    50    19    

84

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

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

15000 руб.

10.11.2023    13218    54    33    

74

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

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

9360 руб.

17.05.2024    29647    101    48    

147

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

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

20000 руб.

07.10.2021    18841    7    32    

43

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

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

3600 руб.

27.12.2024    1975    2    0    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Saint 20.02.10 20:54 Сейчас в теме
Слишком сложное формирование ссылки объекта. Достаточно пары фукнций ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). А событие onclick можно обработать проще:
// Отказ от стандартной обработки клика.
pEvtObj.returnValue = Ложь;

Если ВРег(pEvtObj.srcElement.tagName) = "A" Тогда
	
	СсылкаТекст = Сред(pEvtObj.srcElement.href, 4);
	Ссылка = ЗначениеИзСтрокиВнутр(СсылкаТекст);
	Если Ссылка.Пустая() Или Ссылка.ПолучитьОбъект() = Неопределено Тогда
		
		Предупреждение("Выбранный объект был удалён.",, "Объект удалён");
		Возврат;
		
	Иначе
		ОткрытьЗначение(Ссылка);
	КонецЕсли;
	
КонецЕсли; 
Показать
🅵🅾️🆇; MCitrus; awa; Новенький; Ish_2; artbear; +6 Ответить
2. ll13 1079 20.02.10 21:30 Сейчас в теме
(1) Ваш вариант неработоспособен, у меня была первая мысль сделать именно так как Вы написали, но наступил на грабли.
ЗначениеВСтрокуВнутр() возвращает строку вида {"#",e18d5670-dd2f-4528-8897-d3f07ca77f21,37:a1050011d85708ff11dcb5e99d48b4a8} в html тег вы её не запихнете, точнее запихнете, но обратно не получите. Если у Вас есть работоспособная обработка формирующая и обрабатывающая ссылки с помощью
ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() выложите плиз.
3. пользователь 20.02.10 21:38
Сообщение было скрыто модератором.
...
4. пользователь 20.02.10 21:52
Сообщение было скрыто модератором.
...
13. WKBAPKA 215 21.02.10 12:14 Сейчас в теме
2(2): строку легко можно преобразовать к удобочитаемому виду... хотя с другой стороны, зачем козе боян, если можно сделать так как в статье )
12. WKBAPKA 215 21.02.10 12:13 Сейчас в теме
2(1): + 1 первое что в голову пришло при чтении статьи
24. yku 377 18.03.10 22:43 Сейчас в теме
(1),(2) и др. Ну что вы велосипед изобретаете? ведь есть же в типовой УТ в форме задачи пользователя:
" + ?(ТипЗнч(Содержимое) = Тип("Строка"), СтрЗаменить(Содержимое, Символы.ПС, ""), "" + Строка(Содержимое) + "") + "</td>

то бишь они берут просто ЗначениеВСтрокуВнутр() и запихивают в id, где он прекрасно сохраняется :).
25. Saint 18.03.10 23:25 Сейчас в теме
(24) А у тебя проблемы с изобретением велосипедов? Описанный тобой способ является не более чем ещё одним способом решения указанного вопроса и не сильно отличается от предложенного мной варианта. К тому же мной этот вариант был придуман ещё тогда, когда в типовой об этом, скорее всего, нервно курили. Так что тут ещё вопрос, кто изобретает велосипед.
26. yku 377 19.03.10 00:12 Сейчас в теме
(25) ого - немного ошарашен тоном. Предложенный вами вариант (в том виде, в каком он здесь опубликован) все-таки не работоспособен из-за наличия символа "#" в получаемой строке. И хоть это ограничение обходится за десять секунд, но обходить-то его надо. Так что вариант из типовой - легче. А существенных отличий действительно нет.

О "велосипеде" было к слову. Сожалею, что это вас "задело".
27. ll13 1079 19.03.10 00:25 Сейчас в теме
(26) Оба варианта, которые опубликованы в статье полностью работоспособны, 2-ой вариант который предложил saint наиболее простой и универсальный. Специально замечу что символ "#" нисколько не мешает ему работать ;)
29. yku 377 19.03.10 00:36 Сейчас в теме
(27) хм. а у меня мешает :(. Нет, серьезно. 1с стопорится при получении значения href. Пропадают все символы до #. Причем, если до последнего символа "#". То есть, если завернуть во всякие структуры, массивы и проч - теряется. может, от версии IE зависит?
30. ll13 1079 19.03.10 00:38 Сейчас в теме
(29) Всё дело в волшебных пузырьках :D , а точнее в префиксе "v8:"
31. yku 377 19.03.10 00:40 Сейчас в теме
(30) да ставлю я его. проверил на другом компе - нормально. что за магия? или просто спать пора?
32. Saint 19.03.10 01:16 Сейчас в теме
(31) Фиг его знает. Вариант нормально работал на IE, начиная с версии 6. Тем более что у меня используется не простой HTML, а преобразование XSL. И проблем не возникало никогда. Так что спать! :D
sergmorozov; +1 Ответить
28. Saint 19.03.10 00:30 Сейчас в теме
(26) Меня это не задело. Просто не нужно утверждать, что типовая - это круто и только там может быть правильное решение. И прежде чем утверждать, что вариант не рабочий, это не мешало бы для начала проверить. МОЙ вариант у меня работает уже года эдак 4. Почему мне не мешает символ "#"?
38. 🅵🅾️🆇 525 13.03.18 17:18 Сейчас в теме
(1) Прошу прощения за некропостинг, но вот кратенькая адаптация под УФ
&НаКлиенте
Процедура СписокПрисутствующихСотрудниковПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	Если ДанныеСобытия.Anchor = Неопределено Или ВРег(ДанныеСобытия.Anchor.tagName) <> "A" Тогда Возврат КонецЕсли;
	СтандартнаяОбработка	= Ложь;
	Ссылка	= ПолучитьСсылкуСотрудникаИзСтрокиВнутр(Сред(ДанныеСобытия.Href, 4));
	Если Ссылка.Пустая() Тогда Сообщить("Ошибка получения ссылки сотрудника."); Возврат КонецЕсли;
	ОткрытьЗначение(Ссылка);
КонецПроцедуры // СписокПрисутствующихСотрудниковПриНажатии()

&НаСервереБезКонтекста
Функция ПолучитьСсылкуСотрудникаИзСтрокиВнутр(Строка)
	Попытка 
		Ссылка	= ЗначениеИзСтрокиВнутр(Строка);
		Если Ссылка.ПолучитьОбъект() = Неопределено Тогда 
			Возврат ПредопределенноеЗначение("Справочник.Сотрудники.ПустаяСсылка");
		Иначе
			Возврат Ссылка;
		КонецЕсли;
	Исключение 
		Возврат ПредопределенноеЗначение("Справочник.Сотрудники.ПустаяСсылка");		
	КонецПопытки;
КонецФункции // ПолучитьСсылкуСотрудникаИзСтрокиВнутр()
Показать
5. Saint 20.02.10 22:04 Сейчас в теме
Отвечаю на удалённое сообщение.
Во первых я с тобой водку не пил

Это точно, ибо я спиртное не употребляю. :D
По русски понимаешь ? Пишу ещё раз: Если есть работоспособный вариант выложи его.

Я по-русски понимаю. А ты? Весь смысл обработки я тебе уже написал. Добавлю ещё раз замечание из своего удалённого ответа: сделай
"v8:" + ЗначениеВСтрокуВнутр(ТвояСсылка)

и будет тебе счастье.
6. Abadonna 3971 20.02.10 22:11 Сейчас в теме
Тон не сбавите - буду все посты удалять.
8. Saint 20.02.10 22:19 Сейчас в теме
(6) У меня нормальный тон. Если человек не понимает шуток - тогда прошу прощения.
9. Abadonna 3971 20.02.10 22:21 Сейчас в теме
(8) Ну вот и славненько. ;)
7. maxp77 20.02.10 22:18 Сейчас в теме
Мой подход к решению:
стрOpenOrganization = "OpenInsuranceOrganization";
ОрганизацияИд	= Строка(МенеджерЗаписи_Пациент_Контакты.Контакт.Владелец.УникальныйИдентификатор());
ОрганизацияКонтакта	= "какое-то описание";
/////////////////////////////
// это кусок HTML
|			<P id=ОрганизацияКонтакта style=""DISPLAY:inline"">"+ОрганизацияКонтакта+"</P>
////////////////////////////
Процедура ПолеHTMLДокументаOnClick(Элемент, pEvtObj, Форма) Экспорт
	
	ЭлементHTML = НайтиЭлемент(pEvtObj.srcElement, "A");
	Если ЭлементHTML = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ЭлементHTML.id = "Команда" Тогда
		Попытка
			Форма.ВыполнитьКомандуФормы(ЭлементHTML.pathname, ЭлементHTML.target);
		Исключение
			// в случае неверной или недоступной по правам команды ничего не делаем
		КонецПопытки;
		pEvtObj.returnValue = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры
//////////////////////////
Процедура ВыполнитьКомандуФормы(Команда, Значение) Экспорт

	Если Не ЗначениеЗаполнено(МенеджерЗаписи_Пациент_Контакты.Контакт) Тогда
		Возврат;
	КонецЕсли;

	Если Команда = "OpenInsuranceOrganization" Тогда

		Если Не ПустаяСтрока(Значение) Тогда
			ВыбранныйСправочник	= XMLЗначение(Тип("СправочникСсылка.Страховщики"), Значение);
			ВыбранныйСправочник.ПолучитьФорму(, ЭтаФорма, ЭтотОбъект).Открыть();
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

Показать
11. Saint 20.02.10 22:22 Сейчас в теме
(7) Мне кажется, что мой вариант проще и универсальнее. Но это уже дело хозяйское. ;)
10. maxp77 20.02.10 22:22 Сейчас в теме
///туда
Строка(___.УникальныйИдентификатор());
///оттуда
XMLЗначение(Тип("СправочникСсылка.___"), Значение);
14. WKBAPKA 215 21.02.10 12:17 Сейчас в теме
А вот это
Если СокрЛП(htmlElement.id) <> "" Тогда

можно переписать вот так:
Если Не ПустаяСтрока(htmlElement.id)  Тогда


лучше смотриться

но идея интересная, за статью +

ПЫСЫ: вы уже и поругаться тут успели :D
15. shestopalovpro 158 23.02.10 09:20 Сейчас в теме
Люди подскажите, а есть более универсальный вариант обработки onclick... Данный пример заточен под справочники...Конечно труда не составляет переделать его под другие объекты метаданных...Но может есть более универсальный способ...Например, работать, как со справочниками так и с документами...
16. Saint 23.02.10 09:25 Сейчас в теме
(15) Смотри мои 1 и 5 ответы. Изложенный в них способ универсален.
17. shestopalovpro 158 23.02.10 10:21 Сейчас в теме
(16) Извини не могу разобраться! Приведенный код не работает! Может есть рабочий примерчик!!Буду рад!!
18. Saint 23.02.10 11:31 Сейчас в теме
(17) Приведенный код работает. Делать примерчик времени пока нет.
19. ll13 1079 24.02.10 10:47 Сейчас в теме
(17) Выложил рабочий пример, по методу saint'а, см. статью
shestopalovpro; Saint; Ish_2; +3 Ответить
21. shestopalovpro 158 25.02.10 05:30 Сейчас в теме
(19) Большое спасибо!! Будемс работать!!
20. pavel_pss 290 24.02.10 21:50 Сейчас в теме
Эх, чувак, где ты был раньше :) . Но все равно полезно
22. profes 41 25.02.10 09:38 Сейчас в теме
[+] За освоение новых технологий V8 :)
23. Жарков 27.02.10 12:11 Сейчас в теме
Спасибо, буду использовать. Хорошая идея.

По оформлению статьи - чтобы правильно выводился код, несмотря на наличие HTML-тегов можно использовать тег CODE вместо картинок. Тогда и пользователям легче использовать будет.
33. O-Planet 6403 29.03.10 09:40 Сейчас в теме
Это все замечательно... Но вот реально что хочется, так это работать внутри html с объектами 1С, как с объектами именно, т.е. обращаться к их реквизитам, изменять их при необходимости и т.д. На javascript... Эх... :(
34. O-Planet 6403 29.03.10 09:41 Сейчас в теме
Поясню... Передаю, скажем, список в html, там сортирую, и он в 1С соотвественно отсортирован...
35. Saint 29.03.10 10:08 Сейчас в теме
(34) Мда... А что мешает передать уже отсортированный средствами 1С список? HTML как бы немного не предназначен для таких операций.
36. Muhin555 28 26.03.11 00:48 Сейчас в теме
А нет ли примерчика, где бы обрабатывались Checkbox-ы в теле HTML документа и значения их передавались бы в 1С????
37. PerlAmutor 158 28.07.17 12:28 Сейчас в теме
удалено.
Промазал с темой.
Оставьте свое сообщение