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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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