Удаление организаций из информационных баз 1С

Публикация № 1155114

Администрирование - Администрирование данных 1С - Чистка базы

Обработка удаление организации

Обработка предназначена для удаления организаций из любых информационных баз 1С, имеющих в своем составе справочник "Организации". Работает на обычных и управляемых формах, на базах любого формата и размера. Обработка проверялась на следующих типовых релизах 1С: БП 2.0.66.84, БП 3.0.71.77, БГУ 1.0.59.3, БГУ 2.0.65.17, УТ 10.3.55.3, УТ 11.4.10.57, ЗУП 3.1.11.106, ЗГУ 3.1.11.106, КА 2.4.9.98, УПП 1.3.126.1, УНФ 1.6.18.168, но должна работать и на более старых, так как обработке нужен только справочник "Организации".

Довольно часто возникает задача разделения информационных баз по организациям. Одним из способов решения этой задачи является удаление ненужных организаций.

Традиционный способ – пометка на удаление организаций и всех связанных с ними данных с последующим удалением помеченных объектов – является трудоёмким, затратным по времени и ресурсам, а, значит, не эффективным.

Предлагаемая обработка по удалению организаций является простой в использовании и очень быстрой, так как удаляет связанные данные непосредственно, без контроля ссылочной целостности. Единственным условием работоспособности обработки является наличие в информационной базе справочника «Организации». Обработка работает как на обычных, так и на управляемых формах.

Так выглядит обработка на управляемых формах:

Управляемая форма

Так выглядит обработка на обычных формах:

Обычная форма

Перед удалением организаций полезно убедиться, что связанные с организациями данные используются правильно. Под правильностью использования понимается следующее: если в каком-нибудь объекте используется некая организация, то связанные с ней данные не должны принадлежать другим организациям. Например, если в документе начисления зарплаты указана одна организация, а подразделение – другой организации, то такое использование связанных данных считается неправильным.

Почему так важно соблюдать правильность использования связанных данных? Дело в том, что при удалении организации будут удалены все связанные с ней справочники, документы и так далее. Если связанные с удаляемой организацией данные будут использованы неправильно, например, присутствовать в документах других организаций, то эти документы также будут удалены, что неминуемо исказит картину по оставшимся организациям.

Для проверки правильности использования связанных данных служит специальная кнопка. При её нажатии обработка проверяет правильность использования связанной информации по выбранным организациям. Если будут обнаружены объекты, в которых связанные данные используются неправильно, они будут выведены в специальную таблицу в правой части обработки. Колонка «Ссылка на объект» будет содержать ссылку на объект с неправильными данными, колонка «Имя владельца» будет содержать имя реквизита объекта, который является «владельцем» связанной информации. Как правило, этот реквизит называется «Организация», но могут быть и другие имена. Колонка «Значение владельца» будет содержать ссылку на значение реквизита-владельца. Колонка «Имя подчиненного» будет содержать имя реквизита объекта, который «подчинён» реквизиту-владельцу, а колонка «Значение подчиненного» будет содержать ссылку на значение подчинённого реквизита. У этого реквизита, как правило, другой владелец.

Сами организации удаляются по кнопке «Удалить отмеченные организации». Так как операция удаления является необратимой, настоятельно рекомендуется перед удалением сделать архивную копию информационной базы. Удаление происходит в монопольном режиме, поэтому с базой не должны работать другие пользователи. Так же в базе не должно быть запущенных фоновых заданий.

Если обработка смогла перейти в монопольный режим, начинается процесс удаления. В этот момент обработка не реагирует на действия пользователя. Это сделано сознательно, чтобы ничего не могло помешать удалению. Данные из базы удаляются непосредственно, без проверки ссылочной целостности. Процесс удаления может длиться от нескольких минут до нескольких часов и даже суток. Всё зависит от объёма удаляемой информации и производительности техники. Прерывать работу обработки путём аварийного завершения программы нельзя, так как данные будут удалены частично, а база будет непригодна для дальнейшего использования.

После того, как обработка завершит свою работу, необходимо обязательно запустить процесс тестирования и исправления информационной базы через меню «Администрирование» в режиме конфигуратора. Параметры тестирования и исправления показаны на следующем рисунке:

Тестирование и исправление информационной базы

Код обработки открыт всем желающим. Буду признателен за отзывы, замечания и предложения.

История изменений:

10.01.2020. Исправлена ошибка, возникавшая при обработке табличных частей объектов с количеством строк более 1000.

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.

Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.

Для возврата оплаты просто свяжитесь с нами.

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Alien_RS_Forever 10.12.19 17:16 Сейчас в теме
Даа, "хорошо" что есть подобные разработки. Благодаря им у нас есть работа. Клиентов конечно жалко..
3. Техподдержка 11.12.19 03:57
(1) Поконкретнее, пожалуйста. Что Вас не устраивает?
11. alex_4x 81 16.06.20 12:05 Сейчас в теме
Мои пять копеек. Эту обработку эту не использовал, ничего плохого или хорошего сказать не могу.
Нужно было "срочно" удалять организации из разных очень больших баз.
Вопрос был решен достаточно просто. Обработка получилась в стиле "сделано на коленке" и распространять её опасно на мой взгляд, но если интерес будет - обращайтесь.
Принцип работы такой: Автоматом проверяются все документы и справочники, имеющие в шапке реквизит Организация, формируются запросы по выборке объектов к удалению, эти объекты удаляются без контроля ссылочной целостности. Это нехорошо конечно, но быстро. Далее такие справочники как физлица, сотрудники, контрагенты - проверяются на наличие ссылок на них в базе (так как реализации, поступления, договора контрагентов с организацией и т.д. - уже удалены) и если ссылок нет или ссылки только в регистрах "соответсвия объектов для обмена" и "версии объектов" - то они тоже удаляются. Примерно так же проверятся номенклатура, но там и документы "установки цен номенклатуры" не считаются важными, если движений номенклатуры по остающимся в базе организациям нет - то номенклатуру удаляем. Всё это делать можно не монопольно, так как используется штатный механизм Объект.Удалить()

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




Функция УдалитьЭлементыСправочникаБезСсылокВДокументах(СтрТипСправочника)
	Запрос = Новый Запрос();
	Найден = Ложь;
	
	Для Каждого Справочник Из Метаданные.Справочники Цикл
		Если Справочник.Имя = СтрТипСправочника Тогда
			Если Справочник.Иерархический И Справочник.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда
				Запрос.Текст = "ВЫБРАТЬ
	               |	Спр.Ссылка
	               |ИЗ
	               |	Справочник."+СтрТипСправочника+" КАК Спр
	               |ГДЕ
	               |	Спр.ЭтоГруппа = ЛОЖЬ";
			Иначе
				Запрос.Текст = "ВЫБРАТЬ
	               |	Спр.Ссылка
	               |ИЗ
	               |	Справочник."+СтрТипСправочника+" КАК Спр";
			КонецЕсли;
			Найден = Истина;
		КонецЕсли;
	КонецЦикла;
	
	Если НЕ Найден Тогда
		Сообщить("Справочник "+СтрТипСправочника+" не найден");
		Возврат Ложь;
	КонецЕсли;
	
	ТЗ = Запрос.Выполнить().Выгрузить();
	Ссылки = Новый Массив(1);
	ВсегоОбъектов = ТЗ.Количество();
	ТекущийОбъект = 0;
	ПоследнееДействие = "";
	Для Каждого СтрТЗ из ТЗ Цикл
		ОбработкаПрерыванияПользователя();
		ТекущийОбъект = ТекущийОбъект+1;
		Проц = Окр(ТекущийОбъект/ВсегоОбъектов*100,2);
		Состояние("Обрабатывается "+СтрТипСправочника+" "+Проц+"%	"+ПоследнееДействие);
		Ссылки[0] = СтрТЗ.Ссылка;
		ТабСсылок = НайтиПоСсылкам(Ссылки);
		НеУдалять = Ложь;
		Для Каждого Ссылка из ТабСсылок Цикл
			Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка[1])) Тогда
				Если СокрЛП(ТипЗнч(Ссылка[1])) = "Установка цен номенклатуры" ИЛИ
					 СокрЛП(ТипЗнч(Ссылка[1])) = "Условия поставок по договорам контрагентов" Тогда
					//Сообщить("НЕНУЖНЫЙ ДОКУМЕНТ 	"+ТипЗнч(Ссылка[1])+" // "+Ссылка[1]);
				Иначе
					НеУдалять = Истина;
					//Сообщить("ВАЖНЫЙ ДОКУМЕНТ   	"+ТипЗнч(Ссылка[1])+" // "+Ссылка[1]);
					Прервать;
				КонецЕсли;
			Иначе
				//Сообщить("НЕ ДОК!                  "+ТипЗнч(Ссылка[1])+" // "+Ссылка[1]);
			КонецЕсли;
		КонецЦикла;
		Если НеУдалять Тогда
			// Оставляем
			ПоследнееДействие = "Оставляем "+СтрТЗ.Ссылка;
		Иначе
			// Удаляем
			//Сообщить("Удаляем "+СтрТЗ.Ссылка);
			ОбъектСправочника = СтрТЗ.Ссылка.ПолучитьОбъект();
			ПоследнееДействие = "Удаляем "+СтрТЗ.Ссылка;
			Попытка
				ОбъектСправочника.Удалить();
			Исключение
				Сообщить("Не удалось удалить "+СтрТипСправочника+" "+ОбъектСправочника);
				ОбработкаПрерыванияПользователя();
			КонецПопытки;			
		КонецЕсли;
	КонецЦикла;
	Сообщить("ЗАКОНЧИЛИ Удаление "+СтрТипСправочника);
	Возврат Истина;
КонецФункции
Показать
2. nomad_irk 47 10.12.19 17:32 Сейчас в теме
(0)в чем выйгрыш по сравнению с типовым корректным удалением?

Потратить время на удаление данных из базы и потом еще на ТиИ, которое доудалит данные и для своего выполнения может потребовать времени, гораздо больше, чем процесс удаления данных? А оно реально надо за 3000р. весь этот геморрой?
4. Техподдержка 11.12.19 04:05
(2) Вы когда-нибудь удаляли организацию из базы? А две? А несколько, когда собственники расходятся и делят конторы? И не просто нажать "удаление помеченных объектов", а сначала пометить удаляемые данные на удаление, а потом ещё почистить их, чтобы следа не осталось. Вот это геморрой не на один день и не за 3000 р. Или может Вас цена смущает?
5. nomad_irk 47 11.12.19 06:13 Сейчас в теме
(4) https://infostart.ru/public/1125435/ - вот здесь ответ на ваш вопрос про удаление данных по организациям из баз.

По поводу конкретно вашего способа очистки БД от данных по организации(-ям) могу дать идею как ускорить процесс удаления: просто удалите выбранные организации, остальное удалится при ТиИ.
6. Техподдержка 11.12.19 06:41
(5) Согласен, опыт есть. Особенно впечатлило:

После примерно месяца мытарств с типовым удалением, которое так и не выполнилось до конца, мне пришлось создать данную обработку.


Ваша обработка реашет ту же задачу, что и моя, но работает ли она на файловых базах? И каков будет результат, если имеется неправильное использование данных?

Ну, а по поводу Вашего совета, боюсь он не сильно поможет. ТиИ во многих случаях очистит в объектах ссылки на удалённую организацию, вместо того, чтобы их удалить. Кстати, в моём случае ТиИ как раз очищает ссылки, например, в справочнике "Контрагенты" на договоры по умолчанию.
7. nomad_irk 47 11.12.19 07:22 Сейчас в теме
(6)моя обработка решает задачу многократно быстрее, чем типовой механизм и ваш - в этом вся ее прелесть.

В файловой базе она сгененирует скрипт, но нужен "эмулятор" СУБД, который сможет выполнить скрипт и применить это к файлу БД.

Я предусмотрел вариант очистки договоров по-умолчанию, но потестить особо не где, поэтому не знаю на сколько корректно работает.

В общем, вопрос остается открытым: в чем именно заслуга этой обработки, т.к. подобных обработок вагон и маленькая тележка причем за меньшую цену.
8. Техподдержка 11.12.19 07:55
(7) Значит дело, всё-таки в деньгах.

Хорошо, отвечу на Ваш вопрос так: моя обработка - очередной велосипед, только другой модели. Обработка функционирует в рамках лицензионных ограничений 1С и не требует "эмуляторов" СУБД.

Обработка корректно справляется с договорами по умолчанию и с более изощрёнными зависимостями (проверял на специально созданной для этого конфигурации).

Возможно, обработка не стоит таких денег, но за решение задач разделения баз по организациям заказчики платят гораздо больше. В любом случае, спасибо Вам за комментарии.
9. suhoi 41 29.05.20 07:29 Сейчас в теме
Заинтересовала обработка. Есть вопрос - а как получать новые версии - Только покупкой техподдержки?
10. Техподдержка 29.05.20 07:56
(9) Здравствуйте! Новые версии пока не планируются. Покупка техподдержки обязывает отвечать на вопросы покупателя. Ошибки обработки устраняются бесплатно.
Оставьте свое сообщение

См. также

Публикаций не найдено

Попробуйте расширить область поиска, проверьте поисковый запрос и повторите попытку.

Или закажите индивидуальную разработку вашего решения.

Создать заказ на разработку