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

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

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

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