РассчитатьРассмотреноПоКонтактам (БСП)

Автор: 1С
ОбщийМодуль.Взаимодействия
БСП

Рассчитать рассмотрено по контактам. Рассчитывает состояния контактов взаимодействий.

// Рассчитывает состояния контактов взаимодействий.
//
// Параметры:
//  ТаблицаПредметов  - ТаблицаЗначений, Неопределено - таблица контактов, которые необходимо рассчитать.
//             Если Неопределено, то рассчитываются состояния всех контактов.
//
Процедура РассчитатьРассмотреноПоКонтактам(ДанныеДляРасчета) Экспорт

	УстановитьПривилегированныйРежим(Истина);
	
	Если ДанныеДляРасчета = Неопределено Тогда
		
		РегистрыСведений.СостоянияКонтактовВзаимодействий.УдалитьЗаписьИзРегистра(Неопределено);
		
		Пока Истина Цикл
		
		Запрос = Новый Запрос;
		Запрос.Текст = "
		|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100
		|	КонтактыВзаимодействий.Контакт
		|ПОМЕСТИТЬ КонтактыДляРасчета
		|ИЗ
		|	РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияКонтактовВзаимодействий КАК СостоянияКонтактовВзаимодействий
		|		ПО КонтактыВзаимодействий.Контакт = СостоянияКонтактовВзаимодействий.Контакт
		|ГДЕ
		|	СостоянияКонтактовВзаимодействий.Контакт ЕСТЬ NULL 
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	КонтактыВзаимодействий.Контакт,
		|	МАКСИМУМ(Взаимодействия.Дата) КАК ДатаПоследнегоВзаимодействия,
		|	СУММА(ВЫБОР
		|			КОГДА ПредметыПапкиВзаимодействий.Рассмотрено
		|				ТОГДА 0
		|			ИНАЧЕ 1
		|		КОНЕЦ) КАК КоличествоНеРассмотрено
		|ИЗ
		|	КонтактыДляРасчета КАК КонтактыДляРасчета
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий
		|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЖурналДокументов.Взаимодействия КАК Взаимодействия
		|			ПО КонтактыВзаимодействий.Взаимодействие = Взаимодействия.Ссылка
		|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
		|			ПО КонтактыВзаимодействий.Взаимодействие = ПредметыПапкиВзаимодействий.Взаимодействие
		|		ПО КонтактыДляРасчета.Контакт = КонтактыВзаимодействий.Контакт
		|
		|СГРУППИРОВАТЬ ПО
		|	КонтактыВзаимодействий.Контакт";
		
		Результат = Запрос.Выполнить();
		Если Результат.Пустой() Тогда
			Возврат;
		КонецЕсли;
		
		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл
			
			РегистрыСведений.СостоянияКонтактовВзаимодействий.ВыполнитьЗаписьВРегистр(Выборка.Контакт,
			                                                                          Выборка.КоличествоНеРассмотрено,
			                                                                          Выборка.ДатаПоследнегоВзаимодействия);
			КонецЦикла;
			
		КонецЦикла;
		
	Иначе
		
		Запрос = Новый Запрос;
		
		Если ТипЗнч(ДанныеДляРасчета) = Тип("ТаблицаЗначений") Тогда
			
			ТекстКонтактыДляРасчета = 
			"ВЫБРАТЬ
			|	КонтактыДляРасчета.ПоЧемуРассчитывать КАК Контакт
			|ПОМЕСТИТЬ КонтактыДляРасчета
			|ИЗ
			|	&КонтактыДляРасчета КАК КонтактыДляРасчета
			|
			|ИНДЕКСИРОВАТЬ ПО
			|	Контакт
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////";
			
			Запрос.УстановитьПараметр("КонтактыДляРасчета", ДанныеДляРасчета);
			
		ИначеЕсли ТипЗнч(ДанныеДляРасчета) = Тип("ВыборкаИзРезультатаЗапроса") Тогда
			
			МассивВзаимодействий = Новый Массив;
			Пока ДанныеДляРасчета.Следующий() Цикл
				МассивВзаимодействий.Добавить(ДанныеДляРасчета.Взаимодействие);
			КонецЦикла;
			
			ТекстКонтактыДляРасчета = 
			"ВЫБРАТЬ РАЗЛИЧНЫЕ
			|	КонтактыВзаимодействий.Контакт
			|ПОМЕСТИТЬ КонтактыДляРасчета
			|ИЗ
			|	РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий
			|ГДЕ
			|	КонтактыВзаимодействий.Взаимодействие В(&МассивВзаимодействий)
			|
			|ИНДЕКСИРОВАТЬ ПО
			|	Контакт
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////";
			
			Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий);
			
		ИначеЕсли ТипЗнч(ДанныеДляРасчета) = Тип("Массив") Тогда
			
			ТекстКонтактыДляРасчета = 
			"ВЫБРАТЬ РАЗЛИЧНЫЕ
			|	КонтактыВзаимодействий.Контакт
			|ПОМЕСТИТЬ КонтактыДляРасчета
			|ИЗ
			|	РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий
			|ГДЕ
			|	КонтактыВзаимодействий.Взаимодействие В(&МассивВзаимодействий)
			|
			|ИНДЕКСИРОВАТЬ ПО
			|	Контакт
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////";
			
			Запрос.УстановитьПараметр("МассивВзаимодействий", ДанныеДляРасчета);
			
		Иначе 
			
			Возврат;
			
		КонецЕсли;
		
		Запрос.Текст = ТекстКонтактыДляРасчета + "
		|ВЫБРАТЬ
		|	ВложенныйЗапрос.Контакт,
		|	МАКСИМУМ(ВложенныйЗапрос.ДатаПоследнегоВзаимодействия) КАК ДатаПоследнегоВзаимодействия,
		|	СУММА(ВложенныйЗапрос.КоличествоНеРассмотрено) КАК КоличествоНеРассмотрено
		|ИЗ
		|	(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|		КонтактыВзаимодействий.Контакт КАК Контакт,
		|		Взаимодействия.Ссылка КАК Ссылка,
		|		ЕСТЬNULL(Взаимодействия.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПоследнегоВзаимодействия,
		|		ВЫБОР
		|			КОГДА ЕСТЬNULL(ПредметыПапкиВзаимодействий.Рассмотрено, ИСТИНА)
		|				ТОГДА 0
		|			ИНАЧЕ 1
		|		КОНЕЦ КАК КоличествоНеРассмотрено
		|	ИЗ
		|		КонтактыДляРасчета КАК КонтактыДляРасчета
		|			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий
		|				ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов.Взаимодействия КАК Взаимодействия
		|				ПО КонтактыВзаимодействий.Взаимодействие = Взаимодействия.Ссылка
		|				ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
		|				ПО КонтактыВзаимодействий.Взаимодействие = ПредметыПапкиВзаимодействий.Взаимодействие
		|			ПО КонтактыДляРасчета.Контакт = КонтактыВзаимодействий.Контакт) КАК ВложенныйЗапрос
		|
		|СГРУППИРОВАТЬ ПО
		|	ВложенныйЗапрос.Контакт";
		
		Результат = Запрос.Выполнить();
		Выборка = Результат.Выбрать();
		
		Пока Выборка.Следующий() Цикл
		
			Если Выборка.ДатаПоследнегоВзаимодействия = Дата(1, 1, 1) Тогда
				РегистрыСведений.СостоянияКонтактовВзаимодействий.УдалитьЗаписьИзРегистра(Выборка.Контакт);
			Иначе
				РегистрыСведений.СостоянияКонтактовВзаимодействий.ВыполнитьЗаписьВРегистр(Выборка.Контакт,
				                                                                          Выборка.КоличествоНеРассмотрено,
				                                                                          Выборка.ДатаПоследнегоВзаимодействия);
			КонецЕсли;
		
		КонецЦикла;
		
	КонецЕсли;

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

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

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

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

РассчитатьРассмотреноПоПапкам (БСП)

РассчитатьРассмотреноПоПредметам (БСП)

РассчитыватьРассмотрено (БСП)

ОписанияКонтактов (БСП)

КонтактыВзаимодействий (БСП)

РассчитанныеДатыЗапретаИзменения (БСП)

УстановитьПризнакРассмотрено (БСП)

УстановитьТекущимКонтакт (БСП)

ОсуществитьПоискКонтактовПоСтроке (БСП)

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