СоздатьВременнуюТаблицуСсылокДляОбработки (БСП)

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

Создать временную таблицу ссылок для обработки. Создает временную таблицу ссылок, которые не обработаны в текущей очереди

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

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

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

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

СоздатьВременнуюТаблицуРегистраторовРегистраДляОбработки (БСП)

СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияСсылок (БСП)

СоздатьВременнуюТаблицуИзмеренийНезависимогоРегистраСведенийДляОбработки (БСП)

Создает временную таблицу по набору записей

Создать временную таблицу, с данными учета времени и состояний сотрудников

Создать временную таблицу из таблицы значений

Создать временную таблицу по имени регистра СрезПоследних

Создать временную таблицу "Штатное расписание"

СоздатьВременнуюТаблицуЗаблокированныхДляЧтенияИИзмененияДанных (БСП)

1С Менеджер конфигураций