Вывод сообщений в 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С.

15500 руб.

02.09.2020    177625    986    403    

943

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

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

8400 руб.

20.08.2024    19143    127    70    

131

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

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

15000 руб.

10.11.2023    12795    53    33    

72

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

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

22200 руб.

06.10.2023    18757    49    19    

82

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

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

9360 руб.

17.05.2024    28914    100    48    

146

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

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

20000 руб.

07.10.2021    18614    7    32    

43

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

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

3600 руб.

27.12.2024    1714    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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) верно, код общих модулей не выносил в описание статьи, только общую логику
Оставьте свое сообщение