Вывод сообщений в HTML поле средствами 1С

31.01.20

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

Пример использования вывода большого количества сообщений в поле HTML. С возможностью открывать ссылочные объекты и создавать новые объекты передавая параметры прямо из HTML поля. Протестировано на релизах 8.3.12 и 8.3.15+

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

Наименование Файл Версия Размер
Вывод сообщений в HTML поле средствами 1С:
.dt 174,25Kb
16
.dt 1.0.1 174,25Kb 16 Скачать

А как выводить большое количество сообщений (довольно информативных), да и ещё, чтобы можно было на эти сообщения нажимать, открывать объекты, создавать новые прямо из этого окна? Если вы задавались таким вопросом, то надеюсь данная статья вам поможет. В самой статье, я постараюсь донести саму логику и суть реализации моей идеи. Полный код с примером будет прикреплен ниже. (Каждая скачка является мотивацией для написания новых статей)

Обязательные условия для работоспособности модуля:

  1. Конфигурация на УФ;
  2. Сбор ошибок должен всегда стартовать и завершаться на Клиенте;

Если вышеперечисленные пункты вас устраивают, то предлагаю ознакомиться с кратким описанием идеи. Итак, если нам нужно собрать сообщения в процедуре "ТекущаяИсполняемаяПроцедураНаКлиенте", то перед ней мы вызываем процедуру начала сбора сообщений (по сути это просто генератор уникального идентификатора для хранилища значений где будут временно храниться наши сообщения), а после процедуры "ТекущаяИсполняемаяПроцедураНаКлиенте" мы вызываем процедуру окончания сбора ошибок, которая почистит за собой мусор и выведет наши сообщения на форму в HTML.

             

Самое замечательно то, что ссылки в HTML поле уже хранят в себе наши параметры. Что позволяет работать с ними как нам захочется (открывать значения по ссылкам, создавать объекты, передавая в них наши параметры и тп.) Надеюсь, идея немного понятна, ведь она довольно простая. 

         А теперь немного пробегусь по основному коду и покажу реализацию примера вывода такого сообщения.

Итак, у нас есть кнопка на форме и её клиентская процедура, а также у нас будет процедура"ЛюбаяПроцедураВКоторойБудетФормированиеОшибок()",  в которой у нас непосредственно и будет происходить сбор сообщений для последующего вывода на экран. 

&НаКлиенте
Процедура ЛюбаяПроцедура(Команда)
	
	GUIDОперации = СообщенияВHTMLКлиент.НачатьФормированиеHTMLСообщений();
	ЛюбаяПроцедураВКоторойБудетФормированиеОшибок(GUIDОперации);
	СообщенияВHTMLКлиент.ЗакончитьФормированиеHTMLСообщений(ЭтаФорма,"Сообщения в HTML поле",GUIDОперации);
	
КонецПроцедуры

Как мы видим, передается параметр GUIDОперации он необходим для того случая, когда сбор сообщений будет одновременно в нескольких процедурах и это нам позволит разделить данные списки сообщений (да, параметр GUIDОперации придется тащить через все вложенные процедуры и функции, этот параметр не обязательный, но тогда вы берете на себя ответственность за некорректный вывод сообщений. Повторюсь, работать будет :) ) Вообще, все параметры необязательные, ЭтаФорма нужна если мы захотим заблокировать форму вызова в момент работы с окном ошибок. Второй параметр соответственно заголовок формы HTML.

Итак, проваливаемся в процедуру ЛюбаяПроцедураВКоторойБудетФормированиеОшибок()

&НаКлиенте
Процедура ЛюбаяПроцедураВКоторойБудетФормированиеОшибок(GUIDОперации)
	СообщенияВHTMLКлиент.ДобавитьСообщение("Начинаем выводить сообщения (эта строчка с отступом слева, написана жирным шрифтом и красным цветом) "
						,GUIDОперации,,,Истина,Истина,Истина);

	СообщенияВHTMLКлиент.ДобавитьСообщение("Выводим ссылку на контрагента (клиент) "
                        + СообщенияВHTMLКлиент.СсылкаНаОбъект(Объект.Контрагент), GUIDОперации);
	СообщенияВHTMLКлиент.ДобавитьСообщение("Картинка на клиенте (размещена по центру)" 
                        + СообщенияВHTML.ВставитьКартинку(БиблиотекаКартинок.ВнешнийИсточникДанных), GUIDОперации,Истина,Истина,,,,Истина);

																							
	ЛюбаяПроцедураВКоторойБудетФормированиеОшибокНаСервере(GUIDОперации);
	
	СообщенияВHTMLКлиент.ДобавитьСообщение("Эта строчка последняя (сделаем отступ сверху) "
                       ,GUIDОперации,Истина);
КонецПроцедуры

&НаСервере
Процедура ЛюбаяПроцедураВКоторойБудетФормированиеОшибокНаСервере(GUIDОперации)
	СообщенияВHTML.ДобавитьСообщение("Выводим ссылку на контрагента (сервер) "
                        +СообщенияВHTML.СсылкаНаОбъект(Объект.Контрагент),GUIDОперации);
	
	ТаблицаТовары = Объект.Товары.Выгрузить();
	СообщенияВHTML.ДобавитьСообщение("Это сообщение где мы сможем создать "
						+ СообщенияВHTML.СсылкаНаОбъектСПараметром( "новый документ поступления", ТаблицаТовары, "СоздатьДокументПоступлениеТоваров")
	                    + " с передачей текущей табличной части (сделаем отступ сверху и слева)",GUIDОперации,Истина,,,Истина);
																				
	СообщенияВHTML.ДобавитьСообщение("Картинка на сервере на которую можно нажать, после чего откроется контрагент"
                        +СообщенияВHTML.ВставитьКартинку(БиблиотекаКартинок.БизнесПроцесс,Объект.Контрагент,"ОткрытьЗначение"),GUIDОперации,,,,,,);
	
КонецПроцедуры

Результат выполнения данного кода:

                    

Теперь немного подробнее о показанных процедурах:

 

           Вариант вызова данный процедуры на сервере СообщенияВHTML.ДобавитьСообщение("");

           ОписаниеСообщения непосредственно само сообщение текстом, которое мы хотим вывести;

           GuidОперации - уникальный идентификатор текущего события (необязательное поле);

           ОтступСверху,ОтступСнизу,ВыделитьЖирным,ОтступСлева,ВыделитьКрасным - Тип Булево - простое редактирование выводимого текста

Самое интересное, что в параметре ОписаниеСообщения  мы также можем формировать ссылки на объекты, которые захотим открыть и даже сохранять в них параметры для дальнейшей обработки, все это в виде текста в формате HTML;

           Пример вызова такой преобразовывающей процедуры:

СообщенияВHTMLКлиент.СсылкаНаОбъект(Объект.Контрагент,ПредставлениеОбъекта)

Вариант вызова данной процедуры на сервере СообщенияВHTML.СсылкаНаОбъект(Объект.Контрагент,ПредставлениеОбъекта

Где Объект.Контрагент - ссылка, которую мы хотим сохранить, а ПредставлениеОбъекта (необязательное поле, по умолчанию выведет представление объекта в 1С) как ссылка должна выглядеть в HTML поле.

         Посмотрим, что у неё внутри: 

Функция СсылкаНаОбъект(СсылкаНаТекущийОбъект,ПредставлениеОбъекта=неопределено)
	
	Если ПредставлениеОбъекта=неопределено тогда
		ПредставлениеОбъекта=Строка(СсылкаНаТекущийОбъект);
	КонецЕсли;
	
	УникальныйИдентификатор = Новый УникальныйИдентификатор;
	Адрес = ПоместитьВоВременноеХранилище(СсылкаНаТекущийОбъект, УникальныйИдентификатор);
	
	Возврат "<A id=""" + "ОткрытьЗначение" + """ href= """+ Адрес + """ >"+ПредставлениеОбъекта+"</A>";
	
КонецФункции

Как видим, просто формируется строка с тегами для HTML, которые мы будем обрабатывать при нажатии.

Таким же образом, мы можем помещать во временное хранилище ссылки на Таблицы значений, Структуры, Соответствия и т.п., что дает нам больше возможностей для обработки нажатия на ссылку. К примеру, при нажатии на ссылку создать документ, загрузить в него заранее переданную таблицу значений и открыть созданный документ.

Давайте посмотрим, как это просто реализовать:

&НаСервере
Процедура ЛюбаяПроцедураВКоторойБудетФормированиеОшибокНаСервере(GUIDОперации)

	ТаблицаТовары = Объект.Товары.Выгрузить();
	СообщенияВHTML.ДобавитьСообщение("Это сообщение где мы сможем создать "
	+СообщенияВHTML.СсылкаНаОбъектСПараметром("новый документ поступления",ТаблицаТовары,"СоздатьДокументПоступлениеТоваров")
	+" с передачей текущей табличной части (сделаем отступ сверху и слева)",GUIDОперации,Истина,,,Истина);
КонецПроцедуры

 Тут мы используем процедуру СообщенияВHTML.СсылкаНаОбъектСПараметром("новый документ поступления", ТаблицаТовары, "СоздатьДокументПоступлениеТоваров")

  Первый параметр - представление ссылки
  Второй параметр - данные, которые захотим получить при нажатии на текущую ссылку

  Третий параметр (важно!!!) - ключ, по которому мы будем определять действие, которое нам нужно сделать при нажатии на ссылку

 

Посмотрим, что внутри процедуры: 

Функция СсылкаНаОбъектСПараметром(ПредставлениеОбъекта,ДополнительныйПараметр,КлючПроцедуры) 
	
	УникальныйИдентификатор = Новый УникальныйИдентификатор;
	Адрес = ПоместитьВоВременноеХранилище(ДополнительныйПараметр, УникальныйИдентификатор);
	
	Возврат "<A id=""" + КлючПроцедуры + """ href= """+ Адрес + """ >"+ПредставлениеОбъекта+"</A>";
	
КонецФункции

  Как видим, все по-прежнему просто.

   Осталось только понять, а как обрабатывать ссылки в HTML поле? Для этого у нас есть замечательное событие у элемента "ПриНажатии"

&НаКлиенте
Процедура ОтображениеИнформацииПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	
	СтандартнаяОбработка=Ложь;
	
	Если ВРег(ДанныеСобытия.Element.tagName) = "A" Тогда
			
		ОбработкаНажатияНаСсылкуПоляHTML(ДанныеСобытия.Element);
		
	ИначеЕсли ВРег(ДанныеСобытия.Element.tagName) = "IMG" Тогда
		
		 ОбработкаНажатияНаСсылкуПоляHTML(ДанныеСобытия.Element.parentElement);
		  
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаНажатияНаСсылкуПоляHTML(ДанныеСобытия) 
	
	КлючСобытия = ДанныеСобытия.id; 
	
	
	Если СообщенияВHTMLОбработкаСобытийСервер.ПроверитьВерсиюПлатформы("8.3.15") тогда 
		ДанныеИзHTML = ДанныеСобытия.attributes[1].nodeValue; 
	Иначе // работает на версии 8.3.12	
		ДанныеИзHTML = "e1cib/tempstorage/"+ДанныеСобытия.nameProp; 							
	КонецЕсли;
	
	СообщенияВHTMLОбработкаСобытийКлиент.ОбработкаСобытийПоКлючам(КлючСобытия,ДанныеИзHTML);
	
КонецПроцедуры

Где мы обращаем внимание на процедуру СообщенияВHTMLОбработкаСобытийКлиент.ОбработкаСобытийПоКлючам(КлючСобытия,ДанныеИзHTML);

Вот где и понадобился нам ключ, который мы задавали при записи в HTML, к примеру, я передал ключ "СоздатьДокументПоступлениеТоваров", а значит в самой процедуре мы видим:

Процедура ОбработкаСобытийПоКлючам(КлючСобытия,ДанныеИзHTML) Экспорт 
		
		
	Если КлючСобытия="ОткрытьЗначение" тогда	 
		ОткрытьПолученнуюСсылкуИзHTML(ДанныеИзHTML);
	ИначеЕсли КлючСобытия="СоздатьДокументПоступлениеТоваров" тогда			
	    ОткрытьДокументПоступлениеТоваров(ДанныеИзHTML);
	ИначеЕсли КлючСобытия="НеОбрабатыватьНажатие" тогда
		
	КонецЕсли;
	
КонецПроцедуры

Здесь в параметре  КлючСобытия нам и прилетает тот самый ключ, а в параметре ДанныеИзHTML хранится адрес на наши любые переданные параметры, которые мы легко можем получить таким образом:

АВотИНашиПараметры = ПолучитьИзВременногоХранилища(ДанныеИзHTML);

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

(Более подробный пример есть в прикрепленном dt - файле).

Ещё довольно интересный момент, по поводу вывода картинок (в следующем примере написана функция только под "БиблиотекаКартинок", т.е для всех картинок, которые добавлены в конфигурацию, но по данному примеру я думаю не составит труда добавить функции с картинками по ссылке, либо указав путь на диске)

СообщенияВHTML.ВставитьКартинку(БиблиотекаКартинок.БизнесПроцесс,Объект.Контрагент,"ОткрытьЗначение");

 Первый параметр -  Картинка из метаданных, это может быть как стандартная картинка так и добавленная в ветку "Общие картинки".

 Второй параметр (необязательный) - любой дополнительный параметр который мы захотим обрабатывать при нажатии на картинку.

 Третий параметр (необязательный, по умолчанию стоит ключ по которому клик на картинку будет игнорироваться) - ключ, по которому мы будем определять действие, которое нам нужно сделать при нажатии на ссылку. 

Посмотрим что у неё внутри:

Функция ВставитьКартинку(СтандартнаяКартинка,ДополнительныйПараметр="",КлючПроцедуры="НеОбрабатыватьНажатие",РазмерРамкиКартинки=0) Экспорт
	
	Если ТипЗнч(СтандартнаяКартинка)<>Тип("Картинка") тогда
		Возврат "";
	КонецЕсли;
	
	Если ДополнительныйПараметр<>"" тогда 
		УникальныйИдентификатор = Новый УникальныйИдентификатор;
		Адрес = ПоместитьВоВременноеХранилище(ДополнительныйПараметр, УникальныйИдентификатор);
	Иначе
		Адрес=""
	КонецЕсли;
	
	Попытка
		ТекущийМассивСтрок=СтрРазделить(ЗначениеВСтрокуВнутр(СтандартнаяКартинка), ",");
		ТекущийIDКартинки = Лев(ТекущийМассивСтрок[5],СтрДлина(ТекущийМассивСтрок[5])-1);
	Исключение
		ТекущийIDКартинки ="";
	КонецПопытки;

	Если СтрДлина(ТекущийIDКартинки)<>36 тогда	
		Возврат "";
	КонецЕсли;
	
	ПредставлениеКартинки = "<img src=""v8config://v8cfgHelp/mdpicture/id"+ТекущийIDКартинки+"/00000000-0000-0000-0000-000000000000"" border="""+РазмерРамкикартинки+""">";	
	
	Возврат "<A id=""" + КлючПроцедуры + """ href= """+ Адрес + """ >"+ПредставлениеКартинки+"</A>";
  	

КонецФункции

    

Спасибо что дочитали до конца :) Значит мой труд уже не был напрасен, плюсик вам в карму. 

 

P.S. Понимаю, что идея не уникальна и не совершенна, так что приветствуется критика и предложения в комментариях.

Конфигурация HTML Вывод сообщений Сообщения в поле ошибки

См. также

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

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

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

13000 руб.

02.09.2020    119904    656    389    

701

Infostart PrintWizard

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

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

18000 руб.

06.10.2023    7003    20    6    

37

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

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

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

10000 руб.

10.11.2023    3242    10    1    

31

PowerTools

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

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

3600 руб.

14.01.2013    177339    1070    0    

846

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

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

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

5000 руб.

07.02.2018    99202    239    97    

296

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

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

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

3000 руб.

27.08.2019    17909    6    8    

38

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

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

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

2040 руб.

27.12.2017    27945    3    10    

14

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

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

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

2400 руб.

24.09.2019    23486    15    15    

31
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. drevilo 5 01.02.20 13:23 Сейчас в теме
Отличная статья! Спасибо.
2. Tiger77 69 02.02.20 18:41 Сейчас в теме
Очень интересная идея! Спасибо!
3. BackinSoda 02.02.20 21:31 Сейчас в теме
Для полноты примера с картинкой только не хватает :)
4. burni4 87 02.02.20 22:47 Сейчас в теме
(3) какой картинки?) не совсем понял
5. BackinSoda 03.02.20 08:57 Сейчас в теме
(4) да любой, с тегом img , возможно ли, и как оно будет смотреться
6. burni4 87 03.02.20 09:06 Сейчас в теме
(5) так в статье есть и картинки с примером и описание к ним (либо я чего-то не понимаю) )
7. olololeg 03.02.20 09:19 Сейчас в теме
(6) в само сообщение можно прикрепить картинку, скорее всего это имеется в виду. Тогда вообще будет огонь.
8. burni4 87 03.02.20 09:33 Сейчас в теме
(7) понял) да, прикольно, будет время постараюсь реализовать)
olololeg; +1 Ответить
12. burni4 87 03.02.20 22:16 Сейчас в теме
(7) обновил статью, добавил вывод картинок
olololeg; +1 Ответить
9. JohnyDeath 301 03.02.20 13:58 Сейчас в теме
Условие использования:
Режим использования модальности - Использовать;

От этого же уже давно отошли. По крайней мере в типовых и всё, что на них завязано или должно работать в браузере.
Что мешает отказаться от такого требования?
10. burni4 87 03.02.20 14:01 Сейчас в теме
(9) наверное ничего, просто писалось для Бухгалтерия РБ 2.1, а там используют до сих пор :) Как насобирается ещё идей для доработки, думаю дополню статью, избавлюсь от модальности.
11. burni4 87 03.02.20 14:40 Сейчас в теме
(9) спасибо за замечание, переписал немного код, избавился от модальности, перезалил dt файл
JohnyDeath; +1 Ответить
13. Pixar0000 06.02.20 00:27 Сейчас в теме
красивенько, давайте проведем эксперимент, сколько из 100% пользователей нажмет СРАЗУ кнопку Закрыть?
14. burni4 87 06.02.20 09:14 Сейчас в теме
(13) столько, скольким не нужно будет закрыть это окно по разным причинам?)
15. burni4 87 06.02.20 10:30 Сейчас в теме
16. Megaiff 11.02.20 01:24 Сейчас в теме
Мини пособие пойдет годный материал.
Оставьте свое сообщение