ТекстЗапросаДляОчисткиФайлов (БСП)

Автор: 1С
ОбщийМодуль.РаботаСФайламиСлужебный
БСП

Текст запроса для очистки файлов. Очистка ненужных файлов

////////////////////////////////////////////////////////////////////////////////
// Очистка ненужных файлов

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

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

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

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

ТекстЗапросаПолногоОбъемаФайлов (БСП)

ТекстЗапросаДляИзвлеченияТекста (БСП)

ОбъектыИсключенияПриОчисткеФайлов (БСП)

ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов (БСП)

ОчиститьНенужныеФайлы (БСП)

ИР Адаптер - ошибка при разборе текста запроса

Крашится контекстная подсказка при работе в тексте запроса.

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз