СоздатьВТКонтактнаяИнформация (БСП)

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

Создать контактная информация. Создает временную таблицу с контактной информацией нескольких объектов.

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

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

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

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

СоздатьSMS (БСП)

СоздатьЭлектронноеПисьмо (БСП)

КонтактнаяИнформацияИзJSONВXML (БСП)

УстановитьКонтактнуюИнформациюОбъекта (БСП)

JSONВКонтактнуюИнформациюПоПолям (БСП)

НоваяКонтактнаяИнформация (БСП)

КонтактнаяИнформацияВXML (БСП)

ТипКонтактнойИнформации (БСП)

КомментарийКонтактнойИнформации (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз