ЕстьДанныеДляОбработки (БСП)

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

Есть данные для обработки. Проверяет, есть ли еще необработанные данные.

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

	ТекстЗапроса = СтрСоединить(ТекстыЗапроса, Соединитель);
	
	Если Очередь = Неопределено Тогда
		УсловиеОтбораУзла = "	ТаблицаИзменений.Узел ССЫЛКА ПланОбмена.ОбновлениеИнформационнойБазы ";
	Иначе
		УсловиеОтбораУзла = "	ТаблицаИзменений.Узел В (&Узлы) ";
		Если ТипЗнч(Очередь) = Тип("Массив") Тогда
			Запрос.УстановитьПараметр("Узлы", Очередь);
		Иначе
			Запрос.УстановитьПараметр("Узлы", ОчередьСсылкой(Очередь));
		КонецЕсли;
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораУзла", УсловиеОтбораУзла);
	
	Если Не ОтборУстановлен Тогда
		Запрос.УстановитьПараметр("Отбор", Отбор);
	КонецЕсли;
		
	Запрос.Текст = ТекстЗапроса;
	
	Возврат Не Запрос.Выполнить().Пустой(); 
	
КонецФункции

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

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

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

ОбработкаДанныхОтменена (БСП)

ДополнительныеПараметрыВыборкиДанныхДляОбработки (БСП)

ПриОбработкеОбластиДанных (БСП)

TurboConf 6 - расширение Конфигуратора 1С