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

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

Выбрать регистраторы регистра для обработки. Возвращает порцию регистраторов, по которым нужно переформировать движения.

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

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

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

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

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

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

ОтметитьРегистраторыКОбработке (БСП)

СпособВыборкиРегистраторыРегистра (БСП)

Остатки по регистру накопления при отборе по реквизиту регистратора

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

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

ОчиститьРегистрыЗамерыВремени (БСП)

ВыбратьРежимИРедактироватьФайл (БСП)

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