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

31.01.20

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Вывод сообщений в HTML поле средствами 1С:
.dt 174,25Kb ver:1.0.1
19
19 Скачать (2 SM) Купить за 2 150 руб.

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

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

  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 Вывод сообщений Сообщения в поле ошибки

См. также

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

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

12000 руб.

02.09.2020    171738    960    403    

924

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

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

8400 руб.

20.08.2024    14293    108    46    

108

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

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

9360 руб.

17.05.2024    27260    96    48    

137

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

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

22200 руб.

06.10.2023    17264    43    15    

75

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

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

15000 руб.

10.11.2023    11888    45    27    

67

SALE! %

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

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

4800 3840 руб.

14.01.2013    191172    1152    0    

920

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

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

3600 руб.

27.12.2024    1114    2    0    

5

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

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

5000 руб.

07.02.2018    104115    244    100    

307
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 89 02.02.20 22:47 Сейчас в теме
(3) какой картинки?) не совсем понял
5. BackinSoda 03.02.20 08:57 Сейчас в теме
(4) да любой, с тегом img , возможно ли, и как оно будет смотреться
6. burni4 89 03.02.20 09:06 Сейчас в теме
(5) так в статье есть и картинки с примером и описание к ним (либо я чего-то не понимаю) )
7. olololeg 03.02.20 09:19 Сейчас в теме
(6) в само сообщение можно прикрепить картинку, скорее всего это имеется в виду. Тогда вообще будет огонь.
8. burni4 89 03.02.20 09:33 Сейчас в теме
(7) понял) да, прикольно, будет время постараюсь реализовать)
olololeg; +1 Ответить
12. burni4 89 03.02.20 22:16 Сейчас в теме
(7) обновил статью, добавил вывод картинок
olololeg; +1 Ответить
9. JohnyDeath 302 03.02.20 13:58 Сейчас в теме
Условие использования:
Режим использования модальности - Использовать;

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