Подключение обсуждений / Создание бота веб-чата / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ФормаЗакрывается;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ОписаниеИнтеграции = Неопределено;
	
	Если Параметры.Идентификатор <> Неопределено Тогда
	
		ОписаниеИнтеграции = СистемаВзаимодействия.ПолучитьИнтеграцию(Параметры.Идентификатор);
		Если ОписаниеИнтеграции <> Неопределено Тогда
			
			Наименование = ОписаниеИнтеграции.Представление;
			НавигационнаяСсылкаТочкиПодключения = ОписаниеИнтеграции.НавигационнаяСсылкаТочкиПодключения;
			
			Участники.Очистить();
			Для каждого ПользовательИБ Из Обсуждения.ПользователиИнформационнойБазы(ОписаниеИнтеграции.Участники) Цикл
				Участники.Добавить().Пользователь = ПользовательИБ.Значение;
			КонецЦикла;
				
			ИнтеграцияИспользуется = ОписаниеИнтеграции.Использование;
			Если ИнтеграцияИспользуется Тогда
				Элементы.Закрыть.Заголовок = НСтр("ru='Записать и закрыть'");
				Элементы.Отключить.Видимость = Истина;
			КонецЕсли;

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	
	Для Каждого Параметр Из ПараметрыОтображения Цикл
		ОбновитьПараметрыОриентацииПросмотра(Параметр);
		ОбновитьПредставлениеПараметраПоЗначению(Параметр);		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

	Если ФормаЗакрывается = Истина И Не ЗавершениеРаботы Тогда
		Закрыть(Истина);
	КонецЕсли;

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ПредварительныйПросмотрДокументСформирован(Элемент)
	
	ОбновитьПараметрыПредварительногоПросмотра();
	
	ОбъектСтраницы = Элементы.ПредварительныйПросмотр.Документ.defaultView;
	ОбъектСтраницы.initString("today", 				НСтр("ru = 'Сегодня'"));
	ОбъектСтраницы.initString("administrator",		НСтр("ru = 'Администратор'"));
	ОбъектСтраницы.initString("text1", 				НСтр("ru = 'Добрый день. Могу чем-то помочь?'"));
	ОбъектСтраницы.initString("text2", 				НСтр("ru = 'Добрый день. Меня интересует подключение вашего стороннего сервиса на мой сайт.'"));
	ОбъектСтраницы.initString("time", 				НСтр("ru = '14:53'"));
	ОбъектСтраницы.initString("textareaTooltip", 	НСтр("ru = 'Введите сообщение...'"));
	ОбъектСтраницы.initString("attachFileTooltip", 	НСтр("ru = 'Прикрепить файл'"));
	
	// АПК:1036-выкл Специализированный термин.
	ОбъектСтраницы.initString("videoCallTooltip", 	НСтр("ru = 'Видеозвонок'"));
	// АПК:1036-вкл
	
	ОбъектСтраницы.initString("closeTooltip",		НСтр("ru = 'Закрыть'"));
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыУчастники

&НаКлиенте
Процедура ВнешниеПараметрыПриИзменении(Элемент)
	
	ОбновитьПараметрыПредварительногоПросмотра();

	Если ФормаЗакрывается = Истина Тогда
		Элементы.Закрыть.Заголовок = НСтр("ru='Записать и закрыть'");
		ИнтеграцияИспользуется = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВнешниеПараметрыПриАктивацииСтроки(Элемент)
	
	ОбновитьПредставлениеТекущихДанных();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВнешниеПараметрыПредставлениеЗначенияПриИзменении(Элемент)

	ТекущиеДанные = Элементы.ВнешниеПараметры.ТекущиеДанные;
	
	Если ТекущиеДанные.Тип = "Цвет" Тогда
		ТекущиеДанные.ПредставлениеЗначения = ТекущиеДанные.ПредставлениеЗначения.ПолучитьАбсолютный();
	КонецЕсли;
	
	ОбновитьЗначениеПараметраПоПредставлению(ТекущиеДанные);

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

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

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

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Подобрать(Команда)
	ОбсужденияСлужебныйКлиент.НачатьПодборУчастниковОбсуждения(Элементы.Участники);
КонецПроцедуры

&НаКлиенте
Процедура АктивироватьБота(Команда)
	
	Если ФормаЗакрывается = Истина Тогда
		Закрыть(Истина);
		Возврат;
	КонецЕсли;
	
	Если Не ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	
	Попытка
		АктивироватьСервер();
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Уточнение = ОбщегоНазначенияКлиентСервер.УточнениеИсключения(ИнформацияОбОшибке, 
			НСтр("ru='Не удалось активировать чат-бот по причине:'"), Истина);
		ВызватьИсключение(Уточнение.Текст, Уточнение.Категория,,, ИнформацияОбОшибке);
	КонецПопытки;
	
	Если ИнтеграцияИспользуется Тогда
		Закрыть(Истина);
		Возврат;		
	КонецЕсли;
	
	Элементы.Закрыть.Заголовок = НСтр("ru='Закрыть'");
	ФормаЗакрывается = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура Отключить(Команда)
	Попытка
		ОтключитьСервер();
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Уточнение = ОбщегоНазначенияКлиентСервер.УточнениеИсключения(ИнформацияОбОшибке, 
			НСтр("ru='Не удалось отключить чат-бот по причине:'"), Истина);
		ВызватьИсключение(Уточнение.Текст, Уточнение.Категория,,, ИнформацияОбОшибке);
	КонецПопытки;
	Закрыть(Истина);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьФайлВебСтраницы(Команда)

	ТекстСообщения = НСтр("ru = 'Для сохранения файла необходимо установить расширение для веб-клиента 1С:Предприятие.'");
	
	ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьФайлВебСтраницыПродолжение", ЭтотОбъект);
	ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботы1СПредприятия(ОписаниеОповещения, ТекстСообщения);

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Асинх Процедура СохранитьФайлВебСтраницыПродолжение(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт
	
	Если Не РасширениеРаботыСФайламиПодключено Тогда
		Возврат;
	КонецЕсли;  

	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Сохранение файла'");
	ДиалогВыбораФайла.Фильтр = НСтр("ru = 'Файлы HTML (*.html)|*.html|Все файлы (*.*)|*.*'");
	
	ВыбранныеФайлы = Ждать ДиалогВыбораФайла.ВыбратьАсинх();
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.УстановитьТекст(СодержимоеФайлаВебСтраницы());
	
	Попытка
		РезультатЗаписи =  Ждать ТекстовыйДокумент.ЗаписатьАсинх(ВыбранныеФайлы[0]);	
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Уточнение = ОбщегоНазначенияКлиентСервер.УточнениеИсключения(ИнформацияОбОшибке, 
			НСтр("ru='Не удалось сохранить файл по причине:'"), Истина);
		ВызватьИсключение(Уточнение.Текст, Уточнение.Категория,,, ИнформацияОбОшибке);
	КонецПопытки;
	
	Если РезультатЗаписи = Истина Тогда
		
		Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Файл сохранен в %1'"), 
			ВыбранныеФайлы[0]);
		
		ДополнительныеПараметры = Новый Структура("ИмяФайла", ВыбранныеФайлы[0]);
		ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьФайлВебСтраницыОткрытьКаталогФайла",
			ЭтотОбъект, ДополнительныеПараметры);
		
		ПоказатьОповещениеПользователя(НСтр("ru='Сохранение файла'"), ОписаниеОповещения, Пояснение, 
			БиблиотекаКартинок.Информация32);
		
	КонецЕсли;

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

&НаКлиенте
Процедура СохранитьФайлВебСтраницыОткрытьКаталогФайла(ДополнительныеПараметры) Экспорт

	ФайловаяСистемаКлиент.ОткрытьПроводник(ДополнительныеПараметры.ИмяФайла);
	
КонецПроцедуры

&НаКлиенте
Функция СодержимоеФайлаВебСтраницы()
	
	СодержимоеФайла = "<!doctype html>
		|<html lang=""ru"">
		|<head>
  		|	<meta charset=""utf-8"" />
  		|	<title></title>
		|</head>
		|<body>
    	|	<script src=""%1"" async></script> 
		|</body>
		|</html>";
	
	ПредставлениеТочкиПодключения = НСтр("ru='Подставить точку подключения'");
	
	ПодстрокаЗамены = ?(ПустаяСтрока(НавигационнаяСсылкаТочкиПодключения), 
		ПредставлениеТочкиПодключения, НавигационнаяСсылкаТочкиПодключения);
		
	Возврат СтрШаблон(СодержимоеФайла, ПодстрокаЗамены);
		
КонецФункции

&НаСервере
Процедура АктивироватьСервер()
	
	ПараметрыИнтеграции = ОбсужденияСлужебный.ПараметрыИнтеграции();
	ПараметрыИнтеграции.Идентификатор = Параметры.Идентификатор;
	ПараметрыИнтеграции.Ключ = Наименование; 
	ПараметрыИнтеграции.Тип = ОбсужденияСлужебныйКлиентСервер.ТипыВнешнихСистем().ВебЧат;
	ПараметрыИнтеграции.Участники = Участники.Выгрузить(, "Пользователь").ВыгрузитьКолонку("Пользователь");
	
	Для Каждого ВнешнийПараметр Из ПараметрыОтображения Цикл
		ПараметрыИнтеграции.Вставить(ВнешнийПараметр.Имя, ВнешнийПараметр.Значение);
	КонецЦикла;
	
	Попытка
		ОписаниеИнтеграции = ОбсужденияСлужебный.СоздатьИзменитьИнтеграцию(ПараметрыИнтеграции);
		// Из-за особенностей реализации Системы взаимодействия требуется повторный вызов.
		Интеграция = СистемаВзаимодействия.ПолучитьИнтеграцию(ОписаниеИнтеграции.Идентификатор)
	Исключение
		ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(),
			УровеньЖурналаРегистрации.Ошибка, , ,
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение;
	КонецПопытки;
	
	Если Интеграция <> Неопределено Тогда
		НавигационнаяСсылкаТочкиПодключения = Интеграция.НавигационнаяСсылкаТочкиПодключения;
		Параметры.Идентификатор = Интеграция.Идентификатор;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОтключитьСервер()
	ОбсужденияСлужебный.ОтключитьИнтеграцию(Параметры.Идентификатор);
КонецПроцедуры

#Область ПараметрыВебЧата

&НаСервере
Процедура ЗаполнитьПараметрыИнтеграцииВебЧата(ОписаниеИнтеграции = Неопределено)
	
	Если Не Обсуждения.ОбсужденияДоступны() Тогда
		Возврат;
	КонецЕсли;
	
	ТипВнешнейСистемы = ОбсужденияСлужебныйКлиентСервер.ТипыВнешнихСистем().ВебЧат;
	
	Попытка
		ОписаниеВнешнейСистемы = СистемаВзаимодействия.ПолучитьОписаниеВнешнейСистемы(ТипВнешнейСистемы);	
	Исключение
		ЗаписьЖурналаРегистрации(ОбсужденияСлужебный.СобытиеЖурналаРегистрации(),
		УровеньЖурналаРегистрации.Ошибка, , ,
		ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение;
	КонецПопытки;
	
	ПараметрыОтображения.Очистить();

	Для Каждого ПараметрВнешнейСистемы Из ОписаниеВнешнейСистемы.ОписанияПараметров Цикл
		ПараметрВебЧата = ПараметрыОтображения.Добавить();
		ПараметрВебЧата.Имя = ПараметрВнешнейСистемы.Имя;
	КонецЦикла;
	
	Если ОписаниеИнтеграции <> Неопределено Тогда

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

	Для Каждого ПараметрВебЧата Из ПараметрыОтображения Цикл
		ЗаполнитьДанныеПараметра(ПараметрВебЧата);
	КонецЦикла;
		
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПараметрыОриентацииПросмотра(ПараметрВебЧата)
	
	Если ПараметрВебЧата.Имя = "orientation" Или ПараметрВебЧата.Имя = "orientationPadding" Тогда
		ОбновитьОтступыОриентации();	
	КонецЕсли;

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

&НаКлиенте
Процедура ОбновитьОтступыОриентации()
	
	Отбор = Новый Структура("Имя", "orientation");
	НайденныеСтроки = ПараметрыОтображения.НайтиСтроки(Отбор);
	
	Если Не НайденныеСтроки.Количество() Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрОриентации = НайденныеСтроки[0];
	
	Отбор = Новый Структура("Имя", "orientationPadding");
	НайденныеСтроки = ПараметрыОтображения.НайтиСтроки(Отбор); 
	
	Если Не НайденныеСтроки.Количество() Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрОтступа = НайденныеСтроки[0];
	
	Если ПараметрОриентации.Значение = "bottom" Тогда
		ПараметрОтступа.СписокЗначений.Очистить();
		ПараметрОтступа.СписокЗначений.Вставить("_0",	НСтр("ru = 'Слева'"));
		ПараметрОтступа.СписокЗначений.Вставить("_50", 	НСтр("ru = 'По центру'"));
		ПараметрОтступа.СписокЗначений.Вставить("_100", НСтр("ru = 'Справа'"));
	ИначеЕсли ПараметрОриентации.Значение = "left" Или ПараметрОриентации.Значение = "right" Тогда
		ПараметрОтступа.СписокЗначений.Очистить();
		ПараметрОтступа.СписокЗначений.Вставить("_100", НСтр("ru = 'Сверху'"));
		ПараметрОтступа.СписокЗначений.Вставить("_50", 	НСтр("ru = 'По центру'"));
		ПараметрОтступа.СписокЗначений.Вставить("_0", 	НСтр("ru = 'Снизу'"));
	КонецЕсли;       
	
	ОбновитьПредставлениеПараметраПоЗначению(ПараметрОтступа);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПараметрыПредварительногоПросмотра()
	
	ОкноПросмотраВебСтраницы = Элементы.ПредварительныйПросмотр.Документ.defaultView;
	
	Для Каждого ПараметрОтображения Из ПараметрыОтображения Цикл
		ОкноПросмотраВебСтраницы.updatePreview(ПараметрОтображения.Имя, ПараметрОтображения.Значение);
	КонецЦикла;  
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПредставлениеТекущихДанных()
	
	ТекущиеДанные = Элементы.ВнешниеПараметры.ТекущиеДанные;
	
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;  
	
	ЗначениеПараметра = Элементы.ВнешниеПараметрыПредставлениеЗначения;
	ЗначениеПараметра.ОграничениеТипа = Новый ОписаниеТипов(ТекущиеДанные.Тип);
	
	Если ТекущиеДанные.КнопкаВыбора <> Неопределено Тогда
		ЗначениеПараметра.КнопкаВыбора = Истина;
		ЗначениеПараметра.КартинкаКнопкиВыбора = ТекущиеДанные.КнопкаВыбора;
	Иначе
		ЗначениеПараметра.КнопкаВыбора = Ложь;		
	КонецЕсли;

	ЗначениеПараметра.СписокВыбора.Очистить();
	
	Если ТекущиеДанные.СписокЗначений <> Неопределено Тогда
		ЗначениеПараметра.РежимВыбораИзСписка = Истина;
		Для Каждого Значение Из ТекущиеДанные.СписокЗначений Цикл
			ЗначениеПараметра.СписокВыбора.Добавить(Значение.Значение);
		КонецЦикла; 
	Иначе
		ЗначениеПараметра.РежимВыбораИзСписка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПреобразоватьHexВDec(Число)
	
	Словарь = "0123456789ABCDEF";
	Результат = 0;
	
	ЭлементовВЧисле = СтрДлина(Число);
	
	Для Позиция = 1 По ЭлементовВЧисле Цикл
		Результат = Результат + ((СтрНайти(Словарь, Сред(Число, Позиция, 1)) - 1) * Pow(16, ЭлементовВЧисле - Позиция));
	КонецЦикла;
	
	Возврат Результат; 
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПреобразоватьDecВHex(Число)
	
	Словарь = "0123456789ABCDEF";
	
	Часть1 = Int(Число / 16);
	Часть2 = Число - (Часть1 * 16);
	
	Возврат Сред(Словарь, Часть1 + 1, 1) + Сред(Словарь, Часть2 + 1, 1); 
	
КонецФункции

&НаСервере
Процедура ЗаполнитьДанныеПараметра(ПараметрВебЧата)
	
	Если ПараметрВебЧата.Имя = "allowVideoconferences" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Видеозвонки'");
		ПараметрВебЧата.Тип = "Строка";
		ПараметрВебЧата.СтандартноеЗначение = "allowed";
		
		ПараметрВебЧата.СписокЗначений = Новый Структура;
		ПараметрВебЧата.СписокЗначений.Вставить("allowed", НСтр("ru = 'Доступны'"));
		ПараметрВебЧата.СписокЗначений.Вставить("allowedToWebChatOnly", НСтр("ru = 'Доступны только в чат'"));
		ПараметрВебЧата.СписокЗначений.Вставить("disallowed", НСтр("ru = 'Недоступны'"));  
			
	ИначеЕсли ПараметрВебЧата.Имя = "defaultApplicationUserCameraState" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Состояние камеры пользователя приложения по умолчанию'");
		ПараметрВебЧата.Тип = "Строка";
		ПараметрВебЧата.СтандартноеЗначение = "on";
		
		ПараметрВебЧата.СписокЗначений = Новый Структура;
		ПараметрВебЧата.СписокЗначений.Вставить("on", НСтр("ru = 'Включена'"));
		ПараметрВебЧата.СписокЗначений.Вставить("off", НСтр("ru = 'Выключена'"));
			
	ИначеЕсли ПараметрВебЧата.Имя = "signKey" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Ключ подписи'");
		ПараметрВебЧата.Тип = "Строка";
		ПараметрВебЧата.КнопкаВыбора = БиблиотекаКартинок.Перечитать;
		
	ИначеЕсли ПараметрВебЧата.Имя = "orientation" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Местоположение чата'");
		ПараметрВебЧата.Тип = "Строка";
		ПараметрВебЧата.СтандартноеЗначение = "bottom";
		
		ПараметрВебЧата.СписокЗначений = Новый Структура;
		ПараметрВебЧата.СписокЗначений.Вставить("left", НСтр("ru = 'Слева'"));
		ПараметрВебЧата.СписокЗначений.Вставить("bottom", НСтр("ru = 'Снизу'"));
		ПараметрВебЧата.СписокЗначений.Вставить("right", НСтр("ru = 'Справа'"));
		
	ИначеЕсли ПараметрВебЧата.Имя = "orientationPadding" Тогда 
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Выравнивание чата'");
		ПараметрВебЧата.Тип = "Строка";
		ПараметрВебЧата.СтандартноеЗначение = "100";
		
		ПараметрВебЧата.СписокЗначений = Новый Структура;
		
	ИначеЕсли ПараметрВебЧата.Имя = "mobileButtonOrientation" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Ориентация кнопки чата в мобильной версии'");
		ПараметрВебЧата.Тип = "Строка";
		ПараметрВебЧата.СтандартноеЗначение = "rightBottom";
		
		ПараметрВебЧата.СписокЗначений = Новый Структура;
		ПараметрВебЧата.СписокЗначений.Вставить("leftBottom", НСтр("ru = 'Слева снизу'"));
		ПараметрВебЧата.СписокЗначений.Вставить("rightBottom", НСтр("ru = 'Справа снизу'"));
		
	ИначеЕсли ПараметрВебЧата.Имя = "colorTheme" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Цветовая тема'");
		ПараметрВебЧата.Тип = "Строка";
		ПараметрВебЧата.СтандартноеЗначение = "auto";
		
		ПараметрВебЧата.СписокЗначений = Новый Структура;
		ПараметрВебЧата.СписокЗначений.Вставить("auto", НСтр("ru = 'Авто'"));
		ПараметрВебЧата.СписокЗначений.Вставить("light", НСтр("ru = 'Светлая'"));
		ПараметрВебЧата.СписокЗначений.Вставить("dark", НСтр("ru = 'Темная'"));
			
	ИначеЕсли ПараметрВебЧата.Имя = "titleText" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Текст заголовка чата'");
		ПараметрВебЧата.Тип = "Строка";
		
	ИначеЕсли ПараметрВебЧата.Имя = "titleBackColor" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Цвет фона заголовка чата'");
		ПараметрВебЧата.Тип = "Цвет";
		ПараметрВебЧата.СтандартноеЗначение = "#FBED9E";
		ПараметрВебЧата.КнопкаВыбора = БиблиотекаКартинок.ПолеВводаВыбрать;
		
	ИначеЕсли ПараметрВебЧата.Имя = "titleTextColor" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Цвет текста заголовка чата'");
		ПараметрВебЧата.Тип = "Цвет";
		ПараметрВебЧата.СтандартноеЗначение = "#333333";
		ПараметрВебЧата.КнопкаВыбора = БиблиотекаКартинок.ПолеВводаВыбрать;
		
	ИначеЕсли ПараметрВебЧата.Имя = "displayUserPictures" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Показывать аватары'");
		ПараметрВебЧата.Тип = "Булево";
		ПараметрВебЧата.СтандартноеЗначение = "true";
		
		ПараметрВебЧата.СписокЗначений = Новый Структура;
		ПараметрВебЧата.СписокЗначений.Вставить("true", Истина);
		ПараметрВебЧата.СписокЗначений.Вставить("false", Ложь);
		
	ИначеЕсли ПараметрВебЧата.Имя = "languageCode" Тогда
		
		ПараметрВебЧата.Представление = НСтр("ru = 'Код языка чата'");
		ПараметрВебЧата.Тип = "Строка"; 
		
		СписокЛокализации = ДоступныеЛокализации();
		Если СписокЛокализации.НайтиПоЗначению(ТекущийКодЛокализации()) <> Неопределено Тогда
			ПараметрВебЧата.СтандартноеЗначение = ТекущийКодЛокализации();
		ИначеЕсли СписокЛокализации.НайтиПоЗначению(ТекущийЯзыкСистемы()) <> Неопределено Тогда
			ПараметрВебЧата.СтандартноеЗначение = ТекущийЯзыкСистемы();
		Иначе
			ПараметрВебЧата.СтандартноеЗначение = "en";
		КонецЕсли;    

		ПараметрВебЧата.СписокЗначений = Новый Структура;
		Для Каждого ЭлементЛокализации Из СписокЛокализации Цикл
			ПараметрВебЧата.СписокЗначений.Вставить(ЭлементЛокализации.Значение, ЭлементЛокализации.Представление);
		КонецЦикла;

	Иначе
		
		ПараметрВебЧата.Представление = ПараметрВебЧата.Имя;
		ПараметрВебЧата.Тип = "Строка";
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДоступныеЛокализации()
	
	СписокЛокализации = Новый СписокЗначений;
	Для каждого КодЛокализации Из ПолучитьДопустимыеКодыЛокализации() Цикл
		СписокЛокализации.Добавить(КодЛокализации, ПредставлениеКодаЛокализации(КодЛокализации));
	КонецЦикла;
	СписокЛокализации.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
	Возврат СписокЛокализации;
		
КонецФункции

&НаСервере
Процедура ОбновитьПредварительныйПросмотр()
	
	ПредварительныйПросмотр = Обработки.ПодключениеОбсуждений.ПолучитьМакет("МакетОтображенияВебЧата").ПолучитьТекст()
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПредставлениеПараметраПоЗначению(ПараметрВебЧата)
	
	Если ПараметрВебЧата.Значение = "" И ПараметрВебЧата.СтандартноеЗначение <> "" Тогда
		ПараметрВебЧата.Значение = ПараметрВебЧата.СтандартноеЗначение;
	КонецЕсли;
	
	Представление = Неопределено;
	
	Если ПараметрВебЧата.Значение <> "" Тогда	
		
		Если ПараметрВебЧата.СписокЗначений <> Неопределено Тогда	
			
			КодПервогоСимвола = КодСимвола(ПараметрВебЧата.Значение, 1);
			КлючЗначения = ?(48 <= КодПервогоСимвола И КодПервогоСимвола <= 57, "_" + ПараметрВебЧата.Значение, ПараметрВебЧата.Значение);
			
			Представление = Неопределено;
			ПараметрВебЧата.СписокЗначений.Свойство(КлючЗначения, Представление);
			
			Если Представление <> Неопределено Тогда	
				ПараметрВебЧата.ПредставлениеЗначения = Представление;
			КонецЕсли;  
			
		КонецЕсли; 
		
	КонецЕсли;
	
	Если Представление = Неопределено Тогда
		
		Если ПараметрВебЧата.Тип = "Строка" Тогда
			ПараметрВебЧата.ПредставлениеЗначения = ПараметрВебЧата.Значение;
		ИначеЕсли ПараметрВебЧата.Тип = "Булево" Тогда
			ПараметрВебЧата.ПредставлениеЗначения = Булево(ПараметрВебЧата.Значение);
		ИначеЕсли ПараметрВебЧата.Тип = "Число" Тогда
			ПараметрВебЧата.ПредставлениеЗначения = Число(ПараметрВебЧата.Значение);
		ИначеЕсли ПараметрВебЧата.Тип = "Цвет" Тогда
			ПараметрВебЧата.ПредставлениеЗначения = ЦветИзТекста(ПараметрВебЧата.Значение);
		КонецЕсли; 
		
	КонецЕсли;
	
КонецПроцедуры 

&НаКлиенте
Процедура ОбновитьЗначениеПараметраПоПредставлению(ПараметрВебЧата)
	
	Если ПараметрВебЧата.СписокЗначений <> Неопределено Тогда		
		
		Для Каждого ЭлементСписка Из ПараметрВебЧата.СписокЗначений Цикл
			Если ЭлементСписка.Значение = ПараметрВебЧата.ПредставлениеЗначения Тогда
				ПараметрВебЧата.Значение = ?(Сред(ЭлементСписка.Ключ, 1, 1) = "_", Сред(ЭлементСписка.Ключ, 2), ЭлементСписка.Ключ);	
			КонецЕсли;
		КонецЦикла;
		
	Иначе
		
		Если ПараметрВебЧата.Тип = "Строка" Тогда
			ПараметрВебЧата.Значение = ПараметрВебЧата.ПредставлениеЗначения;
		ИначеЕсли ПараметрВебЧата.Тип = "Булево" Или ПараметрВебЧата.Тип = "Число" Тогда
			ПараметрВебЧата.Значение = Строка(ПараметрВебЧата.ПредставлениеЗначения);
		ИначеЕсли ПараметрВебЧата.Тип = "Цвет" Тогда
			ЦветРГБ = ПараметрВебЧата.ПредставлениеЗначения.ПолучитьАбсолютный();
			ПараметрВебЧата.Значение = "#" + ПреобразоватьDecВHex(ЦветРГБ.Красный) 
				+ ПреобразоватьDecВHex(ЦветРГБ.Зеленый) + ПреобразоватьDecВHex(ЦветРГБ.Синий);
		КонецЕсли;  
		
	КонецЕсли;
	
	ОбновитьПараметрыОриентацииПросмотра(ПараметрВебЧата); 
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЦветИзТекста(Текст)
	
	Красный = 0;
	Зеленый = 0;
	Синий 	= 0;
	
	Если Сред(Текст, 1, 1) = "#" Тогда
		Красный = ПреобразоватьHexВDec(ВРег(Сред(Текст, 2, 2)));
		Зеленый = ПреобразоватьHexВDec(ВРег(Сред(Текст, 4, 2)));
		Синий 	= ПреобразоватьHexВDec(ВРег(Сред(Текст, 6, 2)));
	КонецЕсли; 
	
	Возврат Новый Цвет(Красный, Зеленый, Синий);
	
КонецФункции

&НаСервереБезКонтекста
Функция СгенерироватьСлучайныйКлюч()
	
	НовыйКлюч = "";
	ГСЧ = Новый ГенераторСлучайныхЧисел(); 
	
	Для Сч = 1 По 32 Цикл
		СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 255);
		НовыйКлюч = НовыйКлюч + ПреобразоватьDecВHex(СлучайноеЧисло);
	КонецЦикла;

	Возврат НовыйКлюч;
	
КонецФункции

#КонецОбласти

#КонецОбласти

Связанные материалы