Индексы 1СПАРК Риски / Модуль объекта

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

// Отчет всегда строится по данным кэша (регистра сведений "ИндексыСПАРКРиски").
// Если есть данные, которые необходимо обновить - обновить их в кэше и сформировать отчет.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ДокументРезультат.Очистить();

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

	ПараметрКонтрагенты = Новый ПараметрКомпоновкиДанных("Контрагенты");
	ЭлементПараметрКонтрагенты = Неопределено;

	ПараметрСводныйИндикатор        = Новый ПараметрКомпоновкиДанных("СводныйИндикатор");
	ЭлементПараметрСводныйИндикатор = Неопределено;

	ПараметрИндексДолжнойОсмотрительности        = Новый ПараметрКомпоновкиДанных("ИндексДолжнойОсмотрительности");
	ЭлементПараметрИндексДолжнойОсмотрительности = Неопределено;

	ПараметрИндексФинансовогоРиска        = Новый ПараметрКомпоновкиДанных("ИндексФинансовогоРиска");
	ЭлементПараметрИндексФинансовогоРиска = Неопределено;

	ПараметрИндексПлатежнойДисциплины        = Новый ПараметрКомпоновкиДанных("ИндексПлатежнойДисциплины");
	ЭлементПараметрИндексПлатежнойДисциплины = Неопределено;

	ПараметрСтатус        = Новый ПараметрКомпоновкиДанных("СтатусНазвание");
	ЭлементПараметрСтатус = Неопределено;

	ПараметрВидКонтрагента        = Новый ПараметрКомпоновкиДанных("ВидКонтрагента");
	ЭлементПараметрВидКонтрагента = Неопределено;
	
	ПараметрПрекратилДеятельность = Новый ПараметрКомпоновкиДанных("КонтрагентПрекратилДеятельность");

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

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

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

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

#Область СлужебныйПрограммныйИнтерфейс

// Настройки общей формы отчета подсистемы "Варианты отчетов".
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения - Форма отчета.
//   КлючВарианта - Строка - Имя предопределенного варианта отчета или уникальный идентификатор пользовательского.
//   Настройки - Структура - см. возвращаемое значение ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию().
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт

	Настройки.ВыводитьСуммуВыделенныхЯчеек = Ложь;
	Настройки.События.ПередЗагрузкойВариантаНаСервере = Истина;
	Настройки.События.ПриОпределенииПараметровВыбора = Истина;
	
КонецПроцедуры

// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения - Форма отчета.
//   НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек.
//
// См. также:
//   "Расширение управляемой формы для отчета.ПередЗагрузкойВариантаНаСервере" в синтакс-помощнике.
//   ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере().
//
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт

	СПАРКРиски.ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД);

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

// Вызывается в форме отчета перед выводом настройки.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения, Неопределено - Форма отчета.
//   СвойстваНастройки - Структура - Описание настройки отчета, которая будет выведена в форме отчета.
//       * ОписаниеТипов - ОписаниеТипов -
//           Тип настройки.
//       * ЗначенияДляВыбора - СписокЗначений -
//           Объекты, которые будут предложены пользователю в списке выбора.
//           Дополняет список объектов, уже выбранных пользователем ранее.
//       * ЗапросЗначенийВыбора - Запрос -
//           Возвращает объекты, которыми необходимо дополнить ЗначенияДляВыбора.
//           Первой колонкой (с 0м индексом) должен выбираться объект,
//           который следует добавить в ЗначенияДляВыбора.Значение.
//           Для отключения автозаполнения
//           в свойство ЗапросЗначенийВыбора.Текст следует записать пустую строку.
//       * ОграничиватьВыборУказаннымиЗначениями - Булево -
//           Когда Истина, то выбор пользователя будет ограничен значениями,
//           указанными в ЗначенияДляВыбора (его конечным состоянием).
//
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт

	СПАРКРиски.ПриОпределенииПараметровВыбора(СвойстваНастройки);

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

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

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

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

Функция ТекстЗапросаПоКонтрагентам(УсловиеНаКонтрагентов)
	
	ТекстЗапроса = Новый Массив;
	
	ШаблонЗапросаКСправочнику = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	Рег.Контрагент КАК Контрагент,
		|	Рег.ИНН КАК ИНН,
		|	Рег.ИННКорректный КАК ИННКорректный,
		|	Рег.ВидКонтрагента КАК ВидКонтрагента,
		|	Рег.СвояОрганизация КАК СвояОрганизация
		|ПОМЕСТИТЬ ВТ_Контрагенты
		|ИЗ
		|	РегистрСведений.СвойстваКонтрагентовСПАРКРиски КАК Рег
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИмяСправочника КАК Спр
		|		ПО Рег.Контрагент = Спр.Ссылка
		|ГДЕ
		|	&УсловиеНаКонтрагентов
		|	И Рег.ИННКорректный
		|	И НЕ Спр.ПометкаУдаления";
	
	ШаблонЗапросаКСправочнику = СтрЗаменить(
		ШаблонЗапросаКСправочнику,
		"&УсловиеНаКонтрагентов",
		УсловиеНаКонтрагентов);
		
	ТекстОбъединитьВсе =
		"
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|";
	
	ЭтоПервыйЗапрос = Истина;
	СвойстваСправочниковКонтрагентов = СПАРКРиски.СвойстваСправочниковКонтрагентов();
	
	Для Каждого ОписаниеСправочника Из СвойстваСправочниковКонтрагентов Цикл
		
		ТекстЗапросаКСправочнику = ШаблонЗапросаКСправочнику;
		Если Не ЭтоПервыйЗапрос Тогда
			ТекстЗапросаКСправочнику = СтрЗаменить(
				ТекстЗапросаКСправочнику,
				"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ",
				"ВЫБРАТЬ РАЗЛИЧНЫЕ");
			ТекстЗапросаКСправочнику = СтрЗаменить(
				ТекстЗапросаКСправочнику,
				"ПОМЕСТИТЬ ВТ_Контрагенты",
				"");
			ТекстЗапроса.Добавить(ТекстОбъединитьВсе);
		КонецЕсли;
		
		ЭтоПервыйЗапрос = Ложь;
		
		ТекстЗапросаКСправочнику =
			СтрЗаменить(
				ТекстЗапросаКСправочнику,
				"ИмяСправочника",
				"Справочник."
					+ ОписаниеСправочника.Имя);
		
		ТекстЗапроса.Добавить(ТекстЗапросаКСправочнику);
		
	КонецЦикла;
	
	ТекстЗапроса.Добавить(
		"ИНДЕКСИРОВАТЬ ПО
			|	Контрагент");
	
	Возврат СтрСоединить(ТекстЗапроса, Символы.ПС);
	
КонецФункции

Функция ТекстЗапросаКИндексамСПАРКРиски()
	
	Возврат
		"ВЫБРАТЬ
		|	ВТ_Контрагенты.Контрагент КАК Контрагент,
		|	ВТ_Контрагенты.ИНН КАК ИНН,
		|	ВТ_Контрагенты.ИННКорректный КАК ЭтоКорректныйИНН,
		|	ВТ_Контрагенты.СвояОрганизация КАК СвояОрганизация,
		|	ВТ_Контрагенты.ВидКонтрагента КАК ВидКонтрагента,
		|	ЕСТЬNULL(РегИндексы.ИндексДолжнойОсмотрительности, -1) КАК ИндексДолжнойОсмотрительностиЧисло,
		|	ЕСТЬNULL(РегИндексы.ИндексПлатежнойДисциплины, -1) КАК ИндексПлатежнойДисциплиныЧисло,
		|	ЕСТЬNULL(РегИндексы.ИндексФинансовогоРиска, -1) КАК ИндексФинансовогоРискаЧисло,
		|	ЕСТЬNULL(РегИндексы.СводныйИндикатор, -1) КАК СводныйИндикаторЧисло,
		|	ЕСТЬNULL(РегИндексы.Активен, ЛОЖЬ) КАК Активен,
		|	ВЫБОР
		|		КОГДА РегИндексы.ИндексДолжнойОсмотрительности ЕСТЬ NULL
		|			ТОГДА """"
		|		КОГДА РегИндексы.ИндексДолжнойОсмотрительности >= 0
		|				И РегИндексы.ИндексДолжнойОсмотрительности <= 40
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Низкий)
		|		КОГДА РегИндексы.ИндексДолжнойОсмотрительности >= 41
		|				И РегИндексы.ИндексДолжнойОсмотрительности <= 71
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Средний)
		|		КОГДА РегИндексы.ИндексДолжнойОсмотрительности >= 72
		|				И РегИндексы.ИндексДолжнойОсмотрительности <= 100
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Высокий)
		|		ИНАЧЕ """"
		|	КОНЕЦ КАК ИндексДолжнойОсмотрительностиГрадация,
		|	ВЫБОР
		|		КОГДА РегИндексы.ИндексПлатежнойДисциплины ЕСТЬ NULL
		|			ТОГДА """"
		|		КОГДА РегИндексы.ИндексПлатежнойДисциплины >= 0
		|				И РегИндексы.ИндексПлатежнойДисциплины <= 49
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Высокий)
		|		КОГДА РегИндексы.ИндексПлатежнойДисциплины >= 50
		|				И РегИндексы.ИндексПлатежнойДисциплины <= 79
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Средний)
		|		КОГДА РегИндексы.ИндексПлатежнойДисциплины >= 80
		|				И РегИндексы.ИндексПлатежнойДисциплины <= 100
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Низкий)
		|		ИНАЧЕ """"
		|	КОНЕЦ КАК ИндексПлатежнойДисциплиныГрадация,
		|	ВЫБОР
		|		КОГДА РегИндексы.ИндексФинансовогоРиска ЕСТЬ NULL
		|			ТОГДА """"
		|		КОГДА РегИндексы.ИндексФинансовогоРиска >= 0
		|				И РегИндексы.ИндексФинансовогоРиска <= 30
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Низкий)
		|		КОГДА РегИндексы.ИндексФинансовогоРиска >= 31
		|				И РегИндексы.ИндексФинансовогоРиска <= 70
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Средний)
		|		КОГДА РегИндексы.ИндексФинансовогоРиска >= 71
		|				И РегИндексы.ИндексФинансовогоРиска <= 100
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Высокий)
		|		ИНАЧЕ """"
		|	КОНЕЦ КАК ИндексФинансовогоРискаГрадация,
		|	ВЫБОР
		|		КОГДА РегИндексы.СводныйИндикатор ЕСТЬ NULL
		|			ТОГДА """"
		|		КОГДА РегИндексы.СводныйИндикатор = 1
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Низкий)
		|		КОГДА РегИндексы.СводныйИндикатор = 2
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Средний)
		|		КОГДА РегИндексы.СводныйИндикатор = 3
		|			ТОГДА ЗНАЧЕНИЕ(Перечисление.ГрадацияИндексовСПАРКРиски.Высокий)
		|		ИНАЧЕ """"
		|	КОНЕЦ КАК СводныйИндикаторГрадация,
		|	ВЫБОР
		|		КОГДА РегИндексы.Активен ЕСТЬ NULL
		|			ТОГДА &КонтрагентПрекратилДеятельность
		|		КОГДА РегИндексы.Активен
		|			ТОГДА РегИндексы.СтатусНазвание
		|		ИНАЧЕ &КонтрагентПрекратилДеятельность
		|	КОНЕЦ КАК СтатусНазвание,
		|	ВЫБОР
		|		КОГДА РегИндексы.Активен ЕСТЬ NULL
		|			ТОГДА ЗНАЧЕНИЕ(Справочник.ТипыСобытийСПАРКРиски.ПустаяСсылка)
		|		КОГДА РегИндексы.Активен
		|			ТОГДА РегИндексы.Статус
		|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ТипыСобытийСПАРКРиски.ПустаяСсылка)
		|	КОНЕЦ КАК Статус,
		|	ВЫБОР
		|		КОГДА РегИндексы.Активен ЕСТЬ NULL
		|			ТОГДА ДАТАВРЕМЯ(1, 1, 1)
		|		КОГДА РегИндексы.Активен
		|			ТОГДА РегИндексы.ДатаСтатуса
		|		ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
		|	КОНЕЦ КАК ДатаСтатуса
		|ИЗ
		|	ВТ_Контрагенты КАК ВТ_Контрагенты
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИндексыСПАРКРиски КАК РегИндексы
		|		ПО ВТ_Контрагенты.Контрагент = РегИндексы.Контрагент";
	
КонецФункции

Функция ТекстЗапросаСписокОбновленияКонтрагентов()
	
	Возврат
		"ВЫБРАТЬ ПЕРВЫЕ 1000
		|	ВТ_Контрагенты.Контрагент КАК Контрагент,
		|	ВТ_Контрагенты.ИНН КАК ИНН,
		|	ВТ_Контрагенты.ВидКонтрагента КАК ВидКонтрагента
		|ИЗ
		|	ВТ_Контрагенты КАК ВТ_Контрагенты
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИндексыСПАРКРиски КАК РегИндексы
		|		ПО ВТ_Контрагенты.Контрагент = РегИндексы.Контрагент
		|			И (РегИндексы.ИНН = ВТ_Контрагенты.ИНН)
		|ГДЕ
		|	ВТ_Контрагенты.ИННКорректный
		|	И ЕСТЬNULL(РегИндексы.ДатаОбновления, ДАТАВРЕМЯ(1, 1, 1)) <= &СрокГодности
		|
		|УПОРЯДОЧИТЬ ПО
		|	ИНН";
		
КонецФункции

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

Функция ЗагрузитьИндексыКонтрагентов(
	ОбластьДанных,
	ОписаниеКонтрагентов,
	ЕстьОшибки)
	
	РезультатВызоваВебСервиса = СПАРКРискиСервис.ЗагрузитьИндексыКонтрагентов(
		ОбластьДанных,
		ОписаниеКонтрагентов);
		
	ОписаниеКонтрагентов = Новый Массив;
	ЕстьОшибки = РезультатВызоваВебСервиса.ВидОшибки <> Перечисления.ВидыОшибокСПАРКРиски.ПустаяСсылка();
	
	Возврат РезультатВызоваВебСервиса;
	
КонецФункции

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

#КонецЕсли

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