Создать контактная информация. Создает временную таблицу с контактной информацией нескольких объектов.
// Создает временную таблицу с контактной информацией нескольких объектов.
//
// Параметры:
// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - В менеджере создается временная таблица
// ВТКонтактнаяИнформация с полями:
// * Объект - Ссылка - владелец контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Ссылка на вид контактной информации.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации.
// * ЗначенияПолей - Строка - 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
СоздатьЭлектронноеПисьмо (БСП)
КонтактнаяИнформацияИзJSONВXML (БСП)
УстановитьКонтактнуюИнформациюОбъекта (БСП)
JSONВКонтактнуюИнформациюПоПолям (БСП)
НоваяКонтактнаяИнформация (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)