ПриСозданииНаСервере (БСП)

Автор: 1С
ОбщийМодуль.УправлениеКонтактнойИнформацией
БСП

При создании на сервере. Обработчик для события формы ПриСозданииНаСервере.

// Обработчик для события формы ПриСозданииНаСервере.
// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы.
//
// Параметры:
//    Форма                - ФормаКлиентскогоПриложения - Форма объекта-владельца, предназначенная для вывода контактной информации.
//    Объект               - Произвольный - Объект-владелец контактной информации. Если это ссылка, то контактная информация
//                                          будет получена из объекта по ссылке, иначе из таблицы КонтактнаяИнформация объекта.
//    ДополнительныеПараметры - Структура - Описание настроек контактной информации - см. ПараметрыКонтактнойИнформации.
//                                          Предыдущее название параметра ИмяЭлементаДляРазмещения. Устарел, следует
//                                          использовать ДополнительныеПараметры. Группа, куда будут размещены элементы
//                                          контактной информации.
//    УдалитьПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - Устарел, следует использовать ДополнительныеПараметры.
//                                                             Может принимать значения:
//                                                             ПоложениеЗаголовкаЭлементаФормы.Верх  или
//                                                             ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию).
//    УдалитьИсключаемыеВиды - Массив  - Устарел,следует использовать ДополнительныеПараметры.
//    УдалитьОтложеннаяИнициализация - Массив - Устарел,следует использовать ДополнительныеПараметры.
//
Процедура ПриСозданииНаСервере(Форма, Объект, ДополнительныеПараметры = Неопределено, УдалитьПоложениеЗаголовкаКИ = "",
	Знач УдалитьИсключаемыеВиды = Неопределено, УдалитьОтложеннаяИнициализация = Ложь) Экспорт
	
	ТипПомещения = Неопределено;
	Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
		
		ДополнительныеПараметры.Свойство("ТипПомещения", ТипПомещения);
		ОтложеннаяИнициализация  = ?(ДополнительныеПараметры.Свойство("ОтложеннаяИнициализация"), ДополнительныеПараметры.ОтложеннаяИнициализация, Ложь);
		ПоложениеЗаголовкаКИ     = ?(ДополнительныеПараметры.Свойство("ПоложениеЗаголовкаКИ"), ДополнительныеПараметры.ПоложениеЗаголовкаКИ, "");
		ИсключаемыеВиды          = ?(ДополнительныеПараметры.Свойство("ИсключаемыеВиды"), ДополнительныеПараметры.ИсключаемыеВиды, Неопределено);
		СкрываемыеВиды           = ?(ДополнительныеПараметры.Свойство("СкрываемыеВиды"), ДополнительныеПараметры.СкрываемыеВиды, Неопределено);
		ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры.Свойство("ИмяЭлементаДляРазмещения"), ДополнительныеПараметры.ИмяЭлементаДляРазмещения, "ГруппаКонтактнаяИнформация");
		ОбработкаНавигационнойСсылки = ?(ДополнительныеПараметры.Свойство("ОбработкаНавигационнойСсылки"), ДополнительныеПараметры.ОбработкаНавигационнойСсылки, Ложь);
	Иначе
		ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры = Неопределено, "ГруппаКонтактнаяИнформация", ДополнительныеПараметры);
		ОтложеннаяИнициализация  = УдалитьОтложеннаяИнициализация;
		ИсключаемыеВиды          = УдалитьИсключаемыеВиды;
		СкрываемыеВиды           = Неопределено;
		ПоложениеЗаголовкаКИ     = УдалитьПоложениеЗаголовкаКИ;
		ОбработкаНавигационнойСсылки = Ложь;
	КонецЕсли;
	
	Если ИсключаемыеВиды = Неопределено Тогда
		ИсключаемыеВиды = Новый Массив;
	КонецЕсли;
	
	Если СкрываемыеВиды = Неопределено Тогда
		СкрываемыеВиды = Новый Массив;
	КонецЕсли;
	
	ДобавляемыеРеквизиты = Новый Массив;
	ПроверитьНаличиеРеквизитовКонтактнойИнформации(Форма, ДобавляемыеРеквизиты);
	
	// Кэширование часто используемых значений
	СсылкаНаОбъект             = Объект.Ссылка;
	МетаданныеОбъекта          = СсылкаНаОбъект.Метаданные();
	ПолноеИмяОбъектаМетаданных = МетаданныеОбъекта.ПолноеИмя();
	ИмяОбъекта                 = МетаданныеОбъекта.Имя;
	
	ГруппаВидовКонтактнойИнформации  = ГруппаВидовКонтактнойИнформацииОбъекта(ПолноеИмяОбъектаМетаданных);
	ИспользуетсяКонтактнаяИнформация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ГруппаВидовКонтактнойИнформации, "Используется");
	Если ИспользуетсяКонтактнаяИнформация = Ложь Тогда
		
		ПараметрыВыводаКонтактнойИнформации = Новый Структура();
		ПараметрыВыводаКонтактнойИнформации.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения);
		ПараметрыВыводаКонтактнойИнформации.Вставить("ПоложениеЗаголовкаКИ", ПоложениеЗаголовкаКИ);
		ПараметрыВыводаКонтактнойИнформации.Вставить("ОтложеннаяИнициализация", ОтложеннаяИнициализация);
		ПараметрыВыводаКонтактнойИнформации.Вставить("ИсключаемыеВиды", ИсключаемыеВиды);
		ПараметрыВыводаКонтактнойИнформации.Вставить("СкрываемыеВиды", СкрываемыеВиды);
		ПараметрыВыводаКонтактнойИнформации.Вставить("СсылкаНаОбъект", СсылкаНаОбъект);
		
		СкрытьКонтактнуюИнформацию(Форма, ДобавляемыеРеквизиты, ПараметрыВыводаКонтактнойИнформации);
		Возврат;
	КонецЕсли;
	
	РеквизитыОбъекта           = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты;
	ЕстьКолонкаДействуетС      = (РеквизитыОбъекта.Найти("ДействуетС") <> Неопределено);
	ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти = (РеквизитыОбъекта.Найти("ИдентификаторСтрокиТабличнойЧасти") <> Неопределено);
	
	Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда
		ТекстЗапроса = "ВЫБРАТЬ
		|	КонтактнаяИнформация.Представление КАК Представление,
		|	КонтактнаяИнформация.НомерСтроки КАК НомерСтроки,
		|	КонтактнаяИнформация.Вид КАК Вид, 
		|	ВидыКонтактнойИнформации.ХранитьИсториюИзменений КАК ХранитьИсториюИзменений,
		|	КонтактнаяИнформация.ЗначенияПолей,
		|	КонтактнаяИнформация.Значение,
		|	"""" КАК ДействуетС,
		|	0 КАК ИдентификаторСтрокиТабличнойЧасти,
		|	ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация
		|ИЗ
		|	Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
		|		ЛЕВОЕ СОЕДИНЕНИЕ " +  ПолноеИмяОбъектаМетаданных + ".КонтактнаяИнформация КАК КонтактнаяИнформация
		|		ПО (КонтактнаяИнформация.Вид = ВидыКонтактнойИнформации.Ссылка)
		|ГДЕ
		|	КонтактнаяИнформация.Ссылка = &Ссылка УПОРЯДОЧИТЬ ПО Вид, ДействуетС";
		
		Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти",
			"ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти");
		КонецЕсли;
		
		Если ЕстьКолонкаДействуетС Тогда
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, """"" КАК ДействуетС", "КонтактнаяИнформация.ДействуетС КАК ДействуетС");
		КонецЕсли;
		Запрос = Новый Запрос(ТекстЗапроса);
		Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
		КонтактнаяИнформация = Запрос.Выполнить().Выгрузить();
	Иначе
		КонтактнаяИнформация = Объект.КонтактнаяИнформация.Выгрузить();
		
		Если ЕстьКолонкаДействуетС Тогда
			ТипБулево = Новый ОписаниеТипов("Булево");
			КонтактнаяИнформация.Колонки.Добавить("ХранитьИсториюИзменений", ТипБулево);
			КонтактнаяИнформация.Колонки.Добавить("ЭтоИсторическаяКонтактнаяИнформация", ТипБулево);
			КонтактнаяИнформация.Сортировать("Вид, ДействуетС");
			Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
				СтрокаКонтактнойИнформации.ХранитьИсториюИзменений = СтрокаКонтактнойИнформации.Вид.ХранитьИсториюИзменений;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
	Если ЕстьКолонкаДействуетС Тогда
		ПредыдущийВид = Неопределено;
		Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
			Если СтрокаКонтактнойИнформации.ХранитьИсториюИзменений
				И (ПредыдущийВид = Неопределено ИЛИ ПредыдущийВид <> СтрокаКонтактнойИнформации.Вид) Тогда
				Отбор = Новый Структура("Вид", СтрокаКонтактнойИнформации.Вид);
				НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор);
				ПоследняяДата = НайденныеСтроки.Получить(НайденныеСтроки.Количество() - 1).ДействуетС;
				Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
					Если НайденнаяСтрока.ДействуетС < ПоследняяДата Тогда
						НайденнаяСтрока.ЭтоИсторическаяКонтактнаяИнформация = Истина;
					КонецЕсли;
				КонецЦикла;
				ПредыдущийВид = СтрокаКонтактнойИнформации.Вид;
			КонецЕсли;
		КонецЦикла;
		ТекстЗапросаИсторическаяИнформация = " КонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация КАК ЭтоИсторическаяКонтактнаяИнформация,
		|	КонтактнаяИнформация.ДействуетС                  КАК ДействуетС,";
	Иначе
		ТекстЗапросаИсторическаяИнформация = "ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация,0 КАК ДействуетС, ";
	КонецЕсли;
	
	ТекстЗапроса = " ВЫБРАТЬ
	|	КонтактнаяИнформация.Представление               КАК Представление,
	|	КонтактнаяИнформация.Значение                    КАК Значение,
	|	КонтактнаяИнформация.ЗначенияПолей               КАК ЗначенияПолей,
	|	КонтактнаяИнформация.НомерСтроки                 КАК НомерСтроки, " + ТекстЗапросаИсторическаяИнформация + "
	|	КонтактнаяИнформация.Вид                         КАК Вид,
	|	0 КАК ИдентификаторСтрокиТабличнойЧасти
	|ПОМЕСТИТЬ 
	|	КонтактнаяИнформация
	|ИЗ
	|	&ТаблицаКонтактнойИнформации КАК КонтактнаяИнформация
	|ИНДЕКСИРОВАТЬ ПО
	|	Вид
	|;////////////////////////////////////////////////////////////////////////////////
	|
	|ВЫБРАТЬ
	|	ВидыКонтактнойИнформации.Ссылка                       КАК Вид,
	|ВЫБОР
	|	КОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """"
	|	ТОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида
	|	ИНАЧЕ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных
	|КОНЕЦ КАК ИмяПредопределенногоВида,
	|	ВидыКонтактнойИнформации.Тип                          КАК Тип,
	|	ВидыКонтактнойИнформации.ОбязательноеЗаполнение       КАК ОбязательноеЗаполнение,
	|	ВидыКонтактнойИнформации.ВидПоляДругое                КАК ВидПоляДругое,
	|	ВЫБОР
	|		КОГДА &ЭтоОсновнойЯзык
	|		ТОГДА ВидыКонтактнойИнформации.Наименование
	|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ВидыКонтактнойИнформацииПредставления.Наименование, ВидыКонтактнойИнформации.Наименование) КАК СТРОКА(150))
	|	КОНЕЦ КАК Наименование,
	|	ВидыКонтактнойИнформации.ХранитьИсториюИзменений      КАК ХранитьИсториюИзменений,
	|	ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
	|	ВидыКонтактнойИнформации.ЭтоГруппа                    КАК ЭтоРеквизитТабличнойЧасти,
	|	ВидыКонтактнойИнформации.РеквизитДопУпорядочивания    КАК РеквизитДопУпорядочивания,
	|	ВидыКонтактнойИнформации.МеждународныйФорматАдреса    КАК МеждународныйФорматАдреса,
	|	ЕСТЬNULL(КонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация, ЛОЖЬ)    КАК ЭтоИсторическаяКонтактнаяИнформация,
	|	ЕСТЬNULL(КонтактнаяИнформация.Представление, """")    КАК Представление,
	|	ЕСТЬNULL(КонтактнаяИнформация.ЗначенияПолей, """")    КАК ЗначенияПолей,
	|	ЕСТЬNULL(КонтактнаяИнформация.Значение, """")         КАК Значение,
	|	ЕСТЬNULL(КонтактнаяИнформация.ДействуетС, 0)          КАК ДействуетС,
	|	ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0)         КАК НомерСтроки,
	|	0 КАК ИдентификаторСтрокиТабличнойЧасти,
	|	ВЫРАЗИТЬ("""" КАК СТРОКА(200))                        КАК ИмяРеквизита,
	|	ВидыКонтактнойИнформации.ПометкаУдаления              КАК ПометкаУдаления,
	|	ВЫРАЗИТЬ("""" КАК СТРОКА)                             КАК Комментарий
	|ИЗ
	|	Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|	КонтактнаяИнформация КАК КонтактнаяИнформация
	|ПО
	|	ВидыКонтактнойИнформации.Ссылка = КонтактнаяИнформация.Вид
	|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации.Представления КАК ВидыКонтактнойИнформацииПредставления
	|ПО ВидыКонтактнойИнформацииПредставления.Ссылка = ВидыКонтактнойИнформации.Ссылка
	|	И ВидыКонтактнойИнформацииПредставления.КодЯзыка = &КодЯзыка
	|ГДЕ
	|	ВидыКонтактнойИнформации.Используется
	|	И ЕСТЬNULL(ВидыКонтактнойИнформации.Родитель.Используется, ИСТИНА)
	|	И (
	|		ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
	|		ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ)
	|	И ВидыКонтактнойИнформации.Ссылка НЕ В (&СкрываемыеВиды)
	|УПОРЯДОЧИТЬ ПО
	|	ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ
	|";
	
	Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти",
		"ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти");
	КонецЕсли;
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ТаблицаКонтактнойИнформации", КонтактнаяИнформация);
	Запрос.УстановитьПараметр("ГруппаВидовКИ", ГруппаВидовКонтактнойИнформации);
	Запрос.УстановитьПараметр("Владелец", СсылкаНаОбъект);
	Запрос.УстановитьПараметр("СкрываемыеВиды", СкрываемыеВиды);
	Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ТекущийЯзык() = Метаданные.ОсновнойЯзык);
	Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка);
	
	УстановитьПривилегированныйРежим(Истина);
	КонтактнаяИнформация = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).Строки;
	УстановитьПривилегированныйРежим(Ложь);
	
	КонвертацияКонтактнойИнформацииВJSON(КонтактнаяИнформация);
	
	КонтактнаяИнформация.Сортировать("РеквизитДопУпорядочивания, НомерСтроки");
	СоздатьРеквизитыКонтактнойИнформации(Форма, ДобавляемыеРеквизиты, ИмяОбъекта, ИсключаемыеВиды, КонтактнаяИнформация, ОтложеннаяИнициализация, ОбработкаНавигационнойСсылки);
	
	ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ,
		ОтложеннаяИнициализация, ИсключаемыеВиды, СкрываемыеВиды);
	ПараметрыКонтактнойИнформации.Владелец                     = СсылкаНаОбъект;
	ПараметрыКонтактнойИнформации.ПараметрыАдреса.ТипПомещения = ТипПомещения;
	ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки = ОбработкаНавигационнойСсылки;
	
	// Кеш значений всех видов контактной информации у данного объекта.
	ДанныеВидовКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.ДанныеВидовКонтактнойИнформации(
		КонтактнаяИнформация.ВыгрузитьКолонку("Вид"));
		
	Отбор = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
	КоличествоАдресов = КонтактнаяИнформация.НайтиСтроки(Отбор).Количество();
	
	// Создадим элементы на форме и заполним значения реквизитов.
	СозданныеЭлементы = ОбщегоНазначения.СкопироватьРекурсивно(ИсключаемыеВиды);
	ПредыдущийВид = Неопределено;
	
	Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
		
		Если СтрокаКИ.ЭтоРеквизитТабличнойЧасти Тогда
			СоздатьЭлементыТабличнойЧасти(Форма, ИмяОбъекта, ИмяЭлементаДляРазмещения, СтрокаКИ, ДанныеВидовКонтактнойИнформации);
			Продолжить;
		КонецЕсли;
		
		Если СтрокаКИ.ПометкаУдаления И ПустаяСтрока(СтрокаКИ.ЗначенияПолей) И ПустаяСтрока(СтрокаКИ.Значение) Тогда
			Продолжить;
		КонецЕсли;
		
		ИндексЭлемента     = СозданныеЭлементы.Найти(СтрокаКИ.Вид);
		СтатическийЭлемент = ИндексЭлемента <> Неопределено;
		ЭтоНовыйВидКИ      = (СтрокаКИ.Вид <> ПредыдущийВид);
		
		Если ОтложеннаяИнициализация Тогда
			
			ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ДанныеВидовКонтактнойИнформации, ЭтоНовыйВидКИ,, 
				СтатическийЭлемент, ИмяЭлементаДляРазмещения);
			Если СтатическийЭлемент Тогда
				СозданныеЭлементы.Удалить(ИндексЭлемента);
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		
		ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ДанныеВидовКонтактнойИнформации, ЭтоНовыйВидКИ,, 
			НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация, ИмяЭлементаДляРазмещения);
		
		Если СтатическийЭлемент Тогда
			СозданныеЭлементы.Удалить(ИндексЭлемента);
		Иначе
			
			СледующаяСтрока = ?(СозданныеЭлементы.Количество() = 0, Неопределено,
				ОпределитьСледующуюСтроку(Форма, КонтактнаяИнформация, СтрокаКИ));
			
			Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда
				ДобавитьСтрокуКонтактнойИнформации(Форма, СтрокаКИ, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ, КоличествоАдресов, СледующаяСтрока);
			КонецЕсли;
			
		КонецЕсли;
		
		Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация  Тогда
			ПредыдущийВид = СтрокаКИ.Вид;
		КонецЕсли;
		
	КонецЦикла;
	
	ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения);
	
	Если Не ОтложеннаяИнициализация 
		И Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов.Количество() > 0 Тогда
		ДобавитьКнопкуДополнительногоПоляКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения);
	Иначе
		ДобавитьПояснениеПоСбросуНастроекФормы(Форма, ИмяЭлементаДляРазмещения, ОтложеннаяИнициализация);
	КонецЕсли;
	
КонецПроцедуры

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

Рекомендации

Похожие публикации

ПриСозданииНаСервереПользователя (БСП)

СоздаватьЭлектронныеПодписиНаСервере (БСП)

ПодготовитьОповещения (БСП)

ПриСозданииНаСервере (БСП)

ПриСозданииНаСервереВариантыОтчетов (БСП)

ПечатьДокументовПриСозданииНаСервере (БСП)

ПриСозданииНаСервереТекущиеДела (БСП)

ОбновитьНазначениеПриСозданииНаСервере (БСП)

Синтакс-помощник БСП с нейросетевым ассистентом