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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Временная таблица периодического регистра с периодами

Синтакс-помощник БСП с нейросетевым ассистентом