Удаление данных из БД в MS-SQL

Тестировалось на платформе 8.3.9.х и MS-SQL 2016.

Алгоритм:

1) запускается обработка, заполняете поля для подключения к БД.

2) нажимаете Проверка, если все ок, то заполнятся соответствующие ТЧ.

3) выбираете нужные данные для удаления, нажимаете Удалить (работает в активной странице).

4) заходите в конфигуратор – Администрирование – Тестирование и исправление. Устанавливаете:

Проверка ссылочной и логической целостности ИБ, Тестирование и исправление, Очищать ссылки,

Удалять объект.

Код обработки (модуль формы):
 


#Область Флажки
&НаКлиенте
Процедура УстановитьФлажки(Команда)
	Если Элементы.Страницы.ТекущаяСтраница = Элементы.Документы Тогда
		Для Каждого ТекСтр из ВыбрДокументы Цикл
			ТекСтр.Фл = 1;
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Журнал Тогда
		Для Каждого ТекСтр из ВыбрЖурДокументы Цикл
			ТекСтр.Фл = 1;
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Справочники Тогда
		Для Каждого ТекСтр из ВыбрСправочники Цикл
			ТекСтр.Фл = 1;
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегСведений Тогда
		Для Каждого ТекСтр из ВыбрРегистрыСведений Цикл
			ТекСтр.Фл = 1;
		КонецЦикла;	
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегНакопления Тогда
		Для Каждого ТекСтр из ВыбрРегистрыНакопления Цикл
			ТекСтр.Фл = 1;
		КонецЦикла;	
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ИнвертироватьФлажки(Команда)
	Если Элементы.Страницы.ТекущаяСтраница = Элементы.Документы Тогда
		Для Каждого ТекСтр из ВыбрДокументы Цикл
			ТекСтр.Фл = ?(ТекСтр.Фл=1, 0, 1);
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Журнал Тогда
		Для Каждого ТекСтр из ВыбрЖурДокументы Цикл
			ТекСтр.Фл = ?(ТекСтр.Фл=1, 0, 1);
	КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Справочники Тогда
		Для Каждого ТекСтр из ВыбрСправочники Цикл
			ТекСтр.Фл = ?(ТекСтр.Фл=1, 0, 1);
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегСведений Тогда
		Для Каждого ТекСтр из ВыбрРегистрыСведений Цикл
			ТекСтр.Фл = ?(ТекСтр.Фл=1, 0, 1);
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегНакопления Тогда
		Для Каждого ТекСтр из ВыбрРегистрыНакопления Цикл
			ТекСтр.Фл = ?(ТекСтр.Фл=1, 0, 1);
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры 

&НаКлиенте
Процедура СнятьФлажки(Команда)
	Если Элементы.Страницы.ТекущаяСтраница = Элементы.Документы Тогда
		Для Каждого ТекСтр из ВыбрДокументы Цикл
			ТекСтр.Фл = 0;
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Журнал Тогда
		Для Каждого ТекСтр из ВыбрЖурДокументы Цикл
			ТекСтр.Фл = 0;
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Справочники Тогда
		Для Каждого ТекСтр из ВыбрСправочники Цикл
			ТекСтр.Фл = 0;
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегСведений Тогда
		Для Каждого ТекСтр из ВыбрРегистрыСведений Цикл
			ТекСтр.Фл = 0;
		КонецЦикла;	
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегНакопления Тогда
		Для Каждого ТекСтр из ВыбрРегистрыНакопления Цикл
			ТекСтр.Фл = 0;
		КонецЦикла;	
	КонецЕсли;
КонецПроцедуры
#КонецОбласти

#Область Проверка
Функция ПодключениеSQL()
	
	СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLСервер +
	(";UID=") + Логин + ("; PWD=") + Пароль + (";");
	
	Подключение = Новый ComObject("ADODB.Connection");
	Подключение.ConnectionString=СтрокаСоединения;
	Попытка
		Подключение.Open(СтрокаСоединения);
		//Сообщить("Подключение к серверу SQL");
		Возврат Подключение;
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат Неопределено;
	КонецПопытки;
	
КонецФункции

Функция ПроверкаБазы(ИмяТаблицы_)
	
	Подключение = ПодключениеSQL(); 
	Если Подключение=Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ТекстSQL = "SELECT TOP (10) *
	|FROM ["+SQLБаза + "].[dbo].[" + ИмяТаблицы_ + "]";
	
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.NamedParameters = True;
	СоединениеSQL.CommandText = ТекстSQL;
	СоединениеSQL.CommandType = 1;
	//СоединениеSQL.Prepared = Истина;
	
	//если надо параметры
	//Param1 = СоединениеSQL.CreateParameter("n",3,1,1,1);
	//СоединениеSQL.Parameters.Append(Param1);
	//
	//Param2 = СоединениеSQL.CreateParameter("ДатаПриходаС",200,1,8,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
	//СоединениеSQL.Parameters.Append(Param2);
	//
	//Param3 = СоединениеSQL.CreateParameter("ДатаПриходаПо",200,1,8,Формат(КонецПериода,"ДФ=ггггММдд"));
	//СоединениеSQL.Parameters.Append(Param3);
	//
	//СоединениеSQL.Parameters.Refresh();
	
	Попытка
		//Сообщить("Выполнение запроса SQL");
		ЗаписиSQL = Новый ComObject("ADODB.RecordSet");	
		ЗаписиSQL = СоединениеSQL.Execute();
		
		Таблица = Новый ТаблицаЗначений;
		//Сообщить ("Заполнение временной таблицы");
		Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
			ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
			Таблица.Колонки.Добавить(ИмяСтолбца);
			//Сообщить(ИмяСтолбца);
		КонецЦикла;	
		
		Пока ЗаписиSQL.EOF = 0 Цикл // Заполнение созданной таблицы		
			НоваяСтрока =  Таблица.Добавить();
			Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
				ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
				НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
				Сообщить ("" + ИмяСтолбца + " " + ЗаписиSQL.Fields(ИмяСтолбца).Value);
			КонецЦикла;		
			ЗаписиSQL.MoveNext();		
		КонецЦикла;
		
		//Сообщить("Закрываем соединение с SQL");
		ЗаписиSQL.Close();
		Подключение.Close();
		Возврат 1;
		
	Исключение	
		Сообщить("Ошибка при проверке! " + ОписаниеОшибки());
		Подключение.Close();
		Возврат Неопределено;
	КонецПопытки;
	
КонецФункции

&НаСервере
Процедура ПроверкаНаСервере()
	
	Подключение = ПодключениеSQL(); 
	Если Подключение=Неопределено Тогда
		Возврат;
	КонецЕсли;
	ДляТеста = "";
	
	ВыбрДокументы.Очистить();
	Сч = 1;
	Для Каждого Док из Метаданные.Документы Цикл
		//Сообщить(Док);
		НовСтр = ВыбрДокументы.Добавить();
		НовСтр.Фл = 0;
		НовСтр.Наименование = Док.Имя;
		МассивИменМетаданных = Новый Массив();
		//МассивИменМетаданных.Добавить("Документ.РасходнаяНакладная");
		МассивИменМетаданных.Добавить("Документ."+Док.Имя);
		СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
		НовСтр.SQL = СтрукБД[0].ИмяТаблицыХранения;
		ДляТеста = СтрукБД[0].ИмяТаблицыХранения;
		//Сообщить(СтрукБД.Количество());
		//Для Каждого ТекСтр ИЗ СтрукБД Цикл
		//	Сообщить(ТекСтр.ИмяТаблицыХранения);
		//КонецЦикла;
		//Если сч = 2 Тогда
		//	Прервать;
		//КонецЕсли;
		Сч = Сч+1; 		
	КонецЦикла;	
	
	ВыбрЖурДокументы.Очистить();
	Сч = 1;
	Для Каждого ЖДок из Метаданные.ЖурналыДокументов Цикл
		//Сообщить(жДок);
		НовСтр = ВыбрЖурДокументы.Добавить();
		НовСтр.Фл = 0;
		НовСтр.Наименование = жДок.Имя;
		МассивИменМетаданных = Новый Массив();
		//МассивИменМетаданных.Добавить("Документ.РасходнаяНакладная");
		МассивИменМетаданных.Добавить("ЖурналДокументов."+жДок.Имя);
		СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
		НовСтр.SQL = СтрукБД[0].ИмяТаблицыХранения;
		//Сообщить(СтрукБД.Количество());
		//Для Каждого ТекСтр ИЗ СтрукБД Цикл
		//	Сообщить(ТекСтр.ИмяТаблицыХранения);
		//КонецЦикла;
		//Если сч = 2 Тогда
		//	Прервать;
		//КонецЕсли;
		Сч = Сч+1; 		
	КонецЦикла;	
	
	ВыбрСправочники.Очистить();
	Сч = 1;
	Для Каждого Спр из Метаданные.Справочники Цикл
		//Сообщить(Спр);
		НовСтр = ВыбрСправочники.Добавить();
		НовСтр.Фл = 0;
		НовСтр.Наименование = Спр.Имя;
		МассивИменМетаданных = Новый Массив();
		//МассивИменМетаданных.Добавить("Справочник.Номенклатура");
		МассивИменМетаданных.Добавить("Справочник."+Спр.Имя);
		СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
		НовСтр.SQL = СтрукБД[0].ИмяТаблицыХранения;
		ДляТеста = СтрукБД[0].ИмяТаблицыХранения; 
		//Сообщить(СтрукБД.Количество());
		//Для Каждого ТекСтр ИЗ СтрукБД Цикл
		//	Сообщить(ТекСтр.ИмяТаблицыХранения);
		//КонецЦикла;
		//Если сч = 2 Тогда
		//	Прервать;
		//КонецЕсли;
		Сч = Сч+1; 		
	КонецЦикла;
	
	ВыбрРегистрыСведений.Очистить();
	Сч = 1;
	Для Каждого РегСв из Метаданные.РегистрыСведений Цикл
		//Сообщить(РегСв);
		НовСтр = ВыбрРегистрыСведений.Добавить();
		НовСтр.Фл = 0;
		НовСтр.Наименование = РегСв.Имя;
		МассивИменМетаданных = Новый Массив();
		МассивИменМетаданных.Добавить("РегистрСведений.ШтрихкодыНоменклатуры");
		МассивИменМетаданных.Добавить("РегистрСведений."+РегСв.Имя);
		СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
		НовСтр.SQL = СтрукБД[0].ИмяТаблицыХранения;
		//Сообщить(СтрукБД.Количество());
		//Для Каждого ТекСтр ИЗ СтрукБД Цикл
		//	Сообщить(ТекСтр.ИмяТаблицыХранения);
		//КонецЦикла;
		//Если сч = 2 Тогда
		//	Прервать;
		//КонецЕсли;
		Сч = Сч+1; 		
	КонецЦикла;
	
	ВыбрРегистрыНакопления.Очистить();
	Сч = 1;
	Для Каждого РегНак из Метаданные.РегистрыНакопления Цикл
		//Сообщить(РегНак);
		НовСтр = ВыбрРегистрыНакопления.Добавить();
		НовСтр.Фл = 0;
		НовСтр.Наименование = РегНак.Имя;
		МассивИменМетаданных = Новый Массив();
		МассивИменМетаданных.Добавить("РегистрНакопления.ДвижениеТоваров");
		МассивИменМетаданных.Добавить("РегистрНакопления."+РегНак.Имя);
		СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
		НовСтр.SQL = СтрукБД[0].ИмяТаблицыХранения;
		//Сообщить(СтрукБД.Количество());
		//Для Каждого ТекСтр ИЗ СтрукБД Цикл
		//	Сообщить(ТекСтр.ИмяТаблицыХранения);
		//КонецЦикла;
		//Если сч = 2 Тогда
		//	Прервать;
		//КонецЕсли;
		Сч = Сч+1; 		
	КонецЦикла;
	
	Если ПроверкаБазы(ДляТеста)=Неопределено Тогда
		ВыбрДокументы.Очистить();
		ВыбрЖурДокументы.Очистить();
		ВыбрСправочники.Очистить();
		ВыбрРегистрыСведений.Очистить();
		ВыбрРегистрыНакопления.Очистить();
	КонецЕсли;
	
	Подключение.Close();
	
КонецПроцедуры

&НаКлиенте
Процедура Проверка(Команда)
	ПроверкаНаСервере();
КонецПроцедуры
#КонецОбласти

#Область Удаление
&НаСервере
Функция УдалениеSQL(ИмяТаблицыSQL)	
	Подключение = ПодключениеSQL(); 
	
	Если Подключение=Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ТекстSQL = "TRUNCATE TABLE [" + SQLБаза + "].[dbo].[" + ИмяТаблицыSQL + "]";
	
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.NamedParameters = True;
	СоединениеSQL.CommandText = ТекстSQL;
	СоединениеSQL.CommandType = 1;
	
	Попытка
		//Сообщить("Выполнение запроса SQL");
		СоединениеSQL.Execute();
		Подключение.Close();
		Возврат "Удалили: " + ИмяТаблицыSQL;
	Исключение
		Сообщить(""+ОписаниеОшибки());
		Подключение.Close();
		Возврат Неопределено;
	КонецПопытки;
	
	Подключение.Close();	
КонецФункции

&НаСервере
Процедура УдалитьНаСервере()
	
	Сч = 0;
	Если Элементы.Страницы.ТекущаяСтраница = Элементы.Документы Тогда
		Для Каждого ТекСтр из ВыбрДокументы Цикл
			Если ТекСтр.Фл = 1 Тогда
				МассивИменМетаданных = Новый Массив();
				//МассивИменМетаданных.Добавить("Документ.РасходнаяНакладная");
				МассивИменМетаданных.Добавить("Документ."+СтрЗаменить(ТекСтр.Наименование, " ", ""));
				СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
				//Сообщить(СтрукБД.Количество());
				Для Каждого ТекСтр ИЗ СтрукБД Цикл
					Сч = Сч  + 1;					
					Ответ = УдалениеSQL(ТекСтр.ИмяТаблицыХранения);
					Если Ответ=Неопределено Тогда
						Прервать;
					КонецЕсли;
					Сообщить(""+СЧ + ") " + Ответ);					
				КонецЦикла;				
			КонецЕсли;	
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Журнал Тогда
		Для Каждого ТекСтр из ВыбрЖурДокументы Цикл
			Если ТекСтр.Фл = 1 Тогда
				МассивИменМетаданных = Новый Массив();
				//МассивИменМетаданных.Добавить("Документ.РасходнаяНакладная");
				МассивИменМетаданных.Добавить("ЖурналДокументов."+СтрЗаменить(ТекСтр.Наименование, " ", ""));
				СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
				//Сообщить(СтрукБД.Количество());
				Для Каждого ТекСтр ИЗ СтрукБД Цикл
					Сч = Сч  + 1;					
					Ответ = УдалениеSQL(ТекСтр.ИмяТаблицыХранения);
					Если Ответ=Неопределено Тогда
						Прервать;
					КонецЕсли;
					Сообщить(""+СЧ + ") " + Ответ);
				КонецЦикла;				
			КонецЕсли;	
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Справочники Тогда
		Для Каждого ТекСтр из ВыбрСправочники Цикл
			Если ТекСтр.Фл = 1 Тогда
				МассивИменМетаданных = Новый Массив();
				МассивИменМетаданных.Добавить("Справочник."+СтрЗаменить(ТекСтр.Наименование, " ", ""));
				СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
				//Сообщить(СтрукБД.Количество());
				Для Каждого ТекСтр ИЗ СтрукБД Цикл
					Сч = Сч  + 1;					
					Ответ = УдалениеSQL(ТекСтр.ИмяТаблицыХранения);
					Если Ответ=Неопределено Тогда
						Прервать;
					КонецЕсли;
					Сообщить(""+СЧ + ") " + Ответ);
				КонецЦикла;				
			КонецЕсли;
		КонецЦикла;
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегСведений Тогда
		Для Каждого ТекСтр из ВыбрРегистрыСведений Цикл
			Если ТекСтр.Фл = 1 Тогда
				МассивИменМетаданных = Новый Массив();
				//МассивИменМетаданных.Добавить("Документ.РасходнаяНакладная");
				МассивИменМетаданных.Добавить("РегистрСведений."+СтрЗаменить(ТекСтр.Наименование, " ", ""));
				СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
				//Сообщить(СтрукБД.Количество());
				Для Каждого ТекСтр ИЗ СтрукБД Цикл
					Сч = Сч  + 1;					
					Ответ = УдалениеSQL(ТекСтр.ИмяТаблицыХранения);
					Если Ответ=Неопределено Тогда
						Прервать;
					КонецЕсли;
					Сообщить(""+СЧ + ") " + Ответ);
				КонецЦикла;				
			КонецЕсли;
		КонецЦикла;	
		
	ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.РегНакопления Тогда
		Для Каждого ТекСтр из ВыбрРегистрыНакопления Цикл
			Если ТекСтр.Фл = 1 Тогда
				МассивИменМетаданных = Новый Массив();
				//МассивИменМетаданных.Добавить("Документ.РасходнаяНакладная");
				МассивИменМетаданных.Добавить("РегистрНакопления."+СтрЗаменить(ТекСтр.Наименование, " ", ""));
				СтрукБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИСТИНА);
				//Сообщить(СтрукБД.Количество());
				Для Каждого ТекСтр ИЗ СтрукБД Цикл
					Сч = Сч  + 1;					
					Ответ = УдалениеSQL(ТекСтр.ИмяТаблицыХранения);
					Если Ответ=Неопределено Тогда
						Прервать;
					КонецЕсли;
					Сообщить(""+СЧ + ") " + Ответ);
				КонецЦикла;				
			КонецЕсли;
		КонецЦикла;	
	КонецЕсли;
	
	Сообщить("Очистили: " + Сч);
	
КонецПроцедуры

&НаКлиенте
Процедура Удалить(Команда)
	Режим = РежимДиалогаВопрос.ДаНет;
	Текст = "Данные в базе " + SQLБаза + " будут уничтожены без возможности восстановления. Вы сделали резервную копию и хотите продолжить?";
	Ответ = Вопрос(Текст, Режим, 0);	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		УдалитьНаСервере();
	КонецЕсли;
КонецПроцедуры
#КонецОбласти

В КАТАЛОГ »