gifts2017

Удаление помеченных объектов (немонопольное) для управляемых (UPD: и обычных) форм

Опубликовал в раздел Администрирование - Чистка базы

Добавлен немонопольный режим.
Добавлена возможность частичного удаления, предварительно сделав отбор по метаданным (ссылочные типы).
Добавлена возможность интерактивной корректировки списка исключаемых типов ссылок.

Изнаначально взято из конфигурации 1с Документооборот.

В 1с Документооборот Используются справочники для представления документов и, т.к. для элементов справочников нет понятия проведение, при контроле ссылочной целостности некоторые ссылки исключаются. Далее удаление производится автоматически по ведущему измерению регистра.
Список исключаемых метаданных берется из ОбщегоНазначенияПереопределяемый.ПолучитьИсключенияПоискаСсылок().
Добавлена возможность интерактивной корректировки списка исключаемых типов ссылок.

Используется форма ВыборОбъектовМетаданных, взятая из общих форм 1с Документооборот. Подошла без единого исправления, даже позаимствовал функцию ЗначениеПометкиЭлементов в основную форму обработки.

В встроенной в кофигурацию обработке процедуры расположены в модуле менеджера. Пришлось перенести их в модуль объекта. Возможно вставка в конфигурацию.

Есть аналогичные публикации, например, http://forum.infostart.ru/forum24/topic43769/.
Отличий не знаю, т.к. у меня нет прав на скачивание Cry.

Это есть мои упражнения с управляемыми формами.
Попробовал передать таблицу значений между сервером и клиентом (не очень удачно).
Попытался использовать серверную функцию в процедуре ПриАктивизацииСтроки (не потому, что надо, а потому, что хочетсяSmile).
Замечено, что не совпадает удаление в монопольном и немонопольном режимах (в монопольном, обычно, удаляет больше объектов).
Представляется как есть, без гарантий.

UPD: Добавлена обычная форма. Некоторые изменения, в основном, косметического характера.

UPD2: Исправлена часть ошибок, добавленная при предыдущем обновлении :). Добавлены флажки "Сообщать об удаленных" и "Удалять в транзакции". Количество удаляемых в монопольном и немонопольном режимах, практически, сравнялось.

       

 //Удаляемые = осОбработкаОбъект.ПолучитьПомеченныеНаУдаление();
 Удаляемые = осОбработкаОбъект.ПолучитьПомеченныеНаУдаление().Результат;
 //ЗначениеВРеквизитФормы(осОбработкаОбъект, "Объект");



UPD3: Исправлены замеченные ошибки.

UPD4: Исправлена ошибка: планы видов расчета не включались в дерево метаданных - ошибка копи-пасты, перенесенная из 1с-Документооборот. Конечно, документообороту виды расчета глубоко параллельны, но мне вот понадобились :).

UPD5: Добавлены ПРОЦЕДУРЫ И ФУНКЦИИ РЕГИСТРАЦИИ обработки в информационной базе

UPD6: Исправлены замеченные ошибки отображения статуса возможности удаления. Замечено, что если установлена дата запрета редактирования и есть ссылки на записи периодическго регистра сведений с более ранним периодом, чем дата запрета редактирования, то статус зеленый (можно удалить), но удалить невозможно. Пока ничего не делал по этому поводу.

UPD7: Добавил планы обмена.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
_УдалениеПомеченныхОбъектов_8_2
.epf 100,45Kb
01.09.12
839
.epf 100,45Kb 839 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

3. alex wi (wialex) 11.04.12 23:42
Полезная обработка. Очень пригодилась.
4. ivdic (ivdic) 14.04.12 14:40
пробовал на документообороте ПРОФ выдает ошибку
{Форма.ОсновнаяФормаУ.Форма(766)}: Ошибка при вызове метода контекста (ЗагрузитьЗначения)
сзУдаляемые.ЗагрузитьЗначения(Удаляемые);
по причине:
Несоответствие типов (параметр номер '1')
5. gks 15.04.12 01:15
Спасибо. Действительно, не протестировал режим полного удаления в УФ при апгрейде. Подправил.
6. Сергей Ожерельев (Поручик) 28.04.12 12:44
(5) Дарю. Вставьте этот фрагмент в модуль обработки. Он нужен для регистрации в справочнике дополнительные отчеты и обработки для конфигураций на БСП.

//////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ РЕГИСТРАЦИИ ОБРАБОТКИ
//

// Сервисная экспортная функция. Вызывается в основной программе при регистрации обработки в информационной базе
// Возвращает структуру с параметрами регистрации
//
// Возвращаемое значение:
//		Структура с полями:
//			Вид - строка, вид обработки, один из возможных: "ДополнительнаяОбработка", "ДополнительныйОтчет", 
//					"ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов"
//			Назначение - Массив строк имен объектов метаданных в формате: 
//					<ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>]. 
//					Например, "Документ.СчетЗаказ" или "Справочник.*". Параметр имеет смысл только для назначаемых обработок, для глобальных может не задаваться.
//			Наименование - строка - Наименование обработки, которым будет заполнено наименование элемента справочника по умолчанию.
//			Информация  - строка - Краткая информация или описание по обработке.
//			Версия - строка - Версия обработки в формате “<старший номер>.<младший номер>” используется при загрузке обработок в информационную базу.
//			БезопасныйРежим - булево - Принимает значение Истина или Ложь, в зависимости от того, требуется ли устанавливать или отключать безопасный режим 
//							исполнения обработок. Если истина, обработка будет запущена в безопасном режиме. 
//
//
Функция СведенияОВнешнейОбработке() Экспорт
	
	//Инициализируем структуру с параметрами регистрации
	
	ПараметрыРегистрации = ПолучитьПараметрыРегистрации();
	ПараметрыРегистрации.Вид = "ДополнительнаяОбработка";
	ПараметрыРегистрации.Версия = "1.0.4";

	//Определяем команды для вывода формы
	
	ТаблицаКоманд = ПолучитьТаблицуКоманд();

	ДобавитьКоманду(ТаблицаКоманд,
		ПараметрыРегистрации.Наименование, // Представление команды в пользовательском интерфейсе
		"УдалениеПомеченныхОбъектов",		// Уникальный идентификатор команды
		"ОткрытиеФормы"
	);

	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	Возврат ПараметрыРегистрации;

КонецФункции

//
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ РЕГИСТРАЦИИ ОБРАБОТКИ
//

// Формирует структуру с параметрами регистрации регистрации обработки в информационной базе
//
// Параметры:
//	ОбъектыНазначенияФормы - Массив - Массив строк имен объектов метаданных в формате: 
//					<ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>]. 
//					или строка с именем объекта метаданных 
//	НаименованиеОбработки - строка - Наименование обработки, которым будет заполнено наименование элемента справочника по умолчанию.
//							Необязательно, по умолчанию синоним или представление объекта
//	Информация  - строка - Краткая информация или описание обработки.
//							Необязательно, по умолчанию комментарий объекта
//	Версия - строка - Версия обработки в формате “<старший номер>.<младший номер>” используется при загрузке обработок в информационную базу.
//
//
// Возвращаемое значение:
//		Структура
//
Функция ПолучитьПараметрыРегистрации(ОбъектыНазначенияФормы = Неопределено, НаименованиеОбработки = "", Информация = "", Версия = "1.0")

	Если ТипЗнч(ОбъектыНазначенияФормы) = Тип("Строка") Тогда
		ОбъектНазначенияФормы = ОбъектыНазначенияФормы;
		ОбъектыНазначенияФормы = Новый Массив;
		ОбъектыНазначенияФормы.Добавить(ОбъектНазначенияФормы);
	КонецЕсли; 
	
	ПараметрыРегистрации = Новый Структура;
	ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
	ПараметрыРегистрации.Вставить("Назначение", ОбъектыНазначенияФормы);
	
	Если Не ЗначениеЗаполнено(НаименованиеОбработки) Тогда
		НаименованиеОбработки = ЭтотОбъект.Метаданные().Представление();
	КонецЕсли; 
	ПараметрыРегистрации.Вставить("Наименование", НаименованиеОбработки);
	
	Если Не ЗначениеЗаполнено(Информация) Тогда
		Информация = ЭтотОбъект.Метаданные().Комментарий;
	КонецЕсли; 
	ПараметрыРегистрации.Вставить("Информация", Информация);
	
	ПараметрыРегистрации.Вставить("Версия", Версия);

	Возврат ПараметрыРегистрации;

КонецФункции

// Формирует таблицу значений с командами печати
//	
// Возвращаемое значение:
//		ТаблицаЗначений
//
Функция ПолучитьТаблицуКоманд()

	Команды = Новый ТаблицаЗначений;
	
	//Представление команды в пользовательском интерфейсе
	Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
	
	//Уникальный идентификатор команды или имя макета печати
	Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
	
	//Способ вызова команды: "ОткрытиеФормы", "ВызовКлиентскогоМетода", "ВызовСерверногоМетода"
	// "ОткрытиеФормы" - применяется только для отчетов и дополнительных отчетов
	// "ВызовКлиентскогоМетода" - вызов процедуры Печать(), определённой в модуле формы обработки
	// "ВызовСерверногоМетода" - вызов процедуры Печать(), определённой в модуле объекта обработки
	Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
	
	//Показывать оповещение.
	//Если Истина, требуется показать оповещение при начале и при завершении работы обработки. 
	//Имеет смысл только при запуске обработки без открытия формы
	Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
	
	//Дополнительный модификатор команды. 
	//Используется для дополнительных обработок печатных форм на основе табличных макетов.
	//Для таких команд должен содержать строку ПечатьMXL
	Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

	Возврат Команды;

КонецФункции

// Вспомогательная процедура.
//
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ВызовСерверногоМетода", ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL")

	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление = Представление;
	НоваяКоманда.Идентификатор = Идентификатор;
	НоваяКоманда.Использование = Использование;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
	НоваяКоманда.Модификатор = Модификатор;

КонецПроцедуры
...Показать Скрыть
9. Сергей Ожерельев (Поручик) 30.08.12 13:33
(7) Если будете обновлять, не забудьте по ПланыОбмена.
Планы обмена не включаются в дерево метаданных при выборочном удалении - ошибка копи-пасты, перенесенная из 1с-Документооборот. Конечно, документообороту обмены глубоко параллельны, но мне вот понадобились.
10. gks 04.09.12 12:07
(9) Поручик,
Добавил. Гран мерси за конструктивные предложения.
Правда, планы обмена не совсем побоку для 1с-Документооборот, а вот планов счетов или планов видов расчетов там, действительно нет. Ведь по сути Документооборот- это АРМ секретаря (делопроизводителя). И даже объекты метаданных типа документ, в отличие от большинства конфигураций, носят вспомогательный характер. Основные объекты - справочники и бизнес-процессы.
А по планам расчетов там, действительно, была ошибка. И до сих пор есть (смотрел в релизе 1.2.5.3 от 30.08.12). Выглядит так:
КоллекцииОбъектовМетаданных_НоваяСтрока("ПланыВидовРасчета",            "Планы видов характеристик",      БиблиотекаКартинок.ПланВидовХарактеристик, БиблиотекаКартинок.ПланВидовХарактеристикОбъект, Ложь, КоллекцииОбъектовМетаданных);

Правда, эта общая форма там, по-моему, не используется, держат на всякий случай.
11. Илья Кочетков (ilya2184) 18.02.13 11:41
Все хорошо и так работает, но я в коде изменил кое-что:
Модуль объекта строка примерно 284 (чтобы не при каждой итерации медленный поиск в метаданных был)
ИзмеренияРегистра = Метаданные.НайтиПоПолномуИмени(лИмяМетаданных).Измерения;
Для каждого лИзмерение Из ИзмеренияРегистра Цикл


В модуле формы "ОсновнаяФормаУ" чобы влоделца не в попытке получал:
МД_Справочники = Метаданные.Справочники; //перед циклом
Для Каждого МассивПомеченныхЭлемент Из МассивПомеченных Цикл
	...
	ТекущееМД = МассивПомеченныхЭлемент.Метаданные(); //внутри цикла: платим памятью за быстродействие
	...
	Если МД_Справочники.Найти(ТекущееМД.Имя)<>Неопределено И ТекущееМД.Владельцы.Количество()>0 Тогда
		лВладелецЭлемента = МассивПомеченныхЭлемент.Владелец;
	КонецЕсли;
	...
КонецЦикла;
...Показать Скрыть
12. Роман Г (Stradivari) 07.05.13 16:04
выручила обработочка, спсб)
13. Серега Путин (Confucius) 07.08.13 10:08
Подскажите обработка не проверяет ссылочную целостность? Запустил автоматическое и все удалила..хотя куча ссылок было и не удаляемых объектов дофига. Начал по коду смотреть и увидел УдалитьОбъекты(УдаляемыеОбъекты, Ложь);
А в справке пишите что проверяется ссылочная целостность... Как быть щас?
14. Игорь (Signal) 26.08.13 13:42
Здравствуйте, при удалении помеченных ошибка:
{ВнешняяОбработка.УдалениеПомеченныхОбъектов.МодульОбъекта(561)}: Ошибка при вызове метода контекста (УдалитьОбъекты)
УдалитьОбъекты(лМассив, Ложь);
по причине:
Нарушение прав доступа!

Управление торговлей, редакция 11.1 (11.1.2.10)
1С:Предприятие 8.2 (8.2.18.109)
15. Игорь (Signal) 26.08.13 13:44
При установке режима удаления Частичное вываливается ошибка "Неизвестное имя формы. Имя "Обработка.УдалениеПомеченныхОбъектов.Форма.ВыборОбъектовМетаданныхУ"
16. Сергей Ожерельев (Поручик) 19.03.14 09:24
(0) Обработка не открывается при вызове из дополнительных обработок в конфигурациях на БСП.
В форме ОсновнаяФормаУ режим открытия окна РежимОткрытияОкна поменять на Независимый. Сейчас там установлено Блокировать окно владельца. Именно это мешает открытию обработки.
sinitsin86; Йожкин Кот; +2 Ответить
17. Виталий Настрою 1С (nastrou1c) 23.04.14 12:51
Скачал. Удобная обработка, активно использую. Рекомендую другим.
18. Евгений Кредько (kredko) 15.05.14 17:28
Я пока так и не понял - как работает данная обработка. Базу вешает наглухо. Ошибок при этом никаких. Буду пробовать ещё раз на Документообороте.
19. gks 16.05.14 07:49
В какой базе вешается?
К сожалению, будучи вытесненным из стройных рядов оденснегов, перешел на подножный корм (эмбеддед программирование) :).
По возвращении постараюсь устранить замеченные ошибки.
20. Евгений Кредько (kredko) 19.05.14 05:11
Разобрался. Работает вроде как. Но с большим объёмом информации эта обработка выполняется пол дня и кажется, что база зависла.
21. Евгений Кредько (kredko) 27.05.14 07:58
Проверил. Работает. Но только сразу поставил Автоматическое удаление.
23. Сергей Ожерельев (Поручик) 22.08.14 11:22
(0) В 8.3.5 управляемая форма не работает. При открытии выдаётся окно с сообщением

Ошибка отображения типов:
Отсутствует отображение для типа 'ОбъектМетаданных'

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'v':
форма: Элемент
имя: {http://v8.1c.ru/8.2/uobjects}v
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ОбъектМетаданных'


Где там на форме ОбъектыМетаданных, ума не приложу. Процедура ПриСозданииНаСервере не отрабатывается, видимо ошибка получается при построении формы.
24. Сергей Ожерельев (Поручик) 22.08.14 11:39
() В 8.3.5.1098. Сейчас скачиваю более свежую версию, попробую на другой конфе.
25. Владимир Гуров (Гуррыч) 02.10.14 23:05
26. Марина Семёнова (SemenovaMarinaV) 15.10.14 17:14
Говорят что в последних версиях 3.0 удаление и так немонопольное. У меня пока требует монопольного режима.
27. Игорь Дзеса (Kamikadze) 28.11.14 09:48
Да, для БСП обработка не работает. в ERP 2.0 не открывается.
28. Сергей Ожерельев (Поручик) 28.11.14 10:20
(27) По крайней мере в 8.3.5.1186 обработка работает даже в режиме такси. Сейчас сам проверил.

БСП это всего лишь библиотека прцедур, которая никаким боком к данной обработке. Вот у меня конфа на БСП и что?
29. Михаил Семенов (mchammer4) 10.12.14 18:50
УТ 11.1.4
при открытии - не открывается, пишет -
Ошибка отображения типов:
Отсутствует отображение для типа "ОбъектМетаданных"
30. Сергей Ожерельев (Поручик) 12.12.14 09:03
(29) Поставьте платформу посвежей.
31. Алекс Ю (AlexO) 22.02.15 17:59
(0)
Есть аналогичные публикации, например, http://forum.infostart.ru/forum24/topic43769/.
Например, там нет УФ.
32. Алекс Ю (AlexO) 22.02.15 18:00
А так - во всех без исключения ПоискИУдалениеПомеченных используется "НайтиПомеченныеНаУдаление" и "НайтиПоСсылкам".
А это самый главный косяк и недостаток всех обработок, т.к. не позволяет в принципе обрабатывать огромные базы с сотнями тысяч помеченных на удаление объектов.
33. Алекс Ю (AlexO) 23.02.15 18:33
(0)
Изнаначально взято из конфигурации 1с Документооборот.
Не знаю, из какого Документооборота обработка взята - но не из 1С-Документооборот 1.3.
Там совсем другая. И, кстати, проверил: ваша обработка виснет в Документообороте, - т.е. не открывается вовсе.
34. Алекс Ю (AlexO) 26.02.15 22:58
(32) Нашел наконец-то ограничение (или косяк, называйте, как кому нравится) платформы, связанное со встроенными функциями "НайтиПомеченныеНаУдаление" и "НайтиПоСсылкам":
При удалении где-то в интервале от 150 тыс до 200 тыс документов (именно документов - они в силу особенности хранения в нескольких таблицах одного "объекта" оказались наиболее "тяжелые" для поиска и удаления) не доходит даже до "НайтиПомеченныеНаУдаление" - виснет на "НайтиПоСсылкам" (т.е. на этапе поиска помеченных на удаление).
На другой базе, где большая часть из 150 тыс удаляемых объектов - записи РС, все проходит достаточно быстро (как в 8.2 в режиме ОФ, так и в режиме УФ).
А вот на другой базе, где более 300 тыс разнообразных объектов (в основном - документы), виснет полностью.
35. Эдуард Ахматнуров (Ekater) 27.02.15 13:09
Скажите, на платформе 8.3, конфиг 2.0 будет работать?
36. Алекс Ю (AlexO) 27.02.15 13:20
(35) Ekater,
на платформе 8.3, конфиг 2.0 будет работать?
да, все будет работать.
37. Эдуард Ахматнуров (Ekater) 27.02.15 13:51
Скачал. Действительно работает.
38. Эдуард Ахматнуров (Ekater) 02.03.15 07:48
Удаляет даже то, что стандартной обработкой в монопольном удалить нельзя из-за ссылок в других объектах! Осторожно!

Вопрос - это как-то повлияет на работу 1С? А то что-то я заволновался - было около 2000 объектов, которые не удалялись из-за ссылок в других документах. А здесь взяли и удалились в автоматическом режиме.
39. Александр Синцов (Sintson) 22.07.15 13:02
Добрый день!
Обработка вылетела на 1C 8.3 (8.3.5.1443) 1С: УТ (11.1.9.56) с ошибкой:

{ОбщийМодуль.ДополнительныеОтчетыИОбработкиКлиент.Модуль(400)}: Ошибка при вызове метода контекста (ОткрытьФорму)
ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОбработки, Форма);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'v':
форма: Элемент
имя: {http://v8.1c.ru/8.2/uobjects}v
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ОбъектМетаданных'

40. Владимир Насыров (Spacer) 23.03.16 11:57
Ошибочка!

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'v':
форма: Элемент
имя: {http://v8.1c.ru/8.2/uobjects}v
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ОбъектМетаданных'
41. Сергей Ожерельев (Поручик) 25.03.16 08:59
42. Осипов Сергей (fixin) 30.04.16 11:49
блин, не стал рисковать, т.к. тут пишут, что не контролируется ссылочная целостность, а код анализировать лень.
43. Холод Заринск (HolodZar) 19.09.16 05:11
Не открывается


{Форма.Форма.Форма(153,28)}: Тип не определен (КомпоновщикМакетаКомпоновкиДанных)
КомпоновщикМакета = Новый <<?>>КомпоновщикМакетаКомпоновкиДанных;
{Форма.Форма.Форма(154,28)}: Тип не определен (ДанныеРасшифровкиКомпоновкиДанных)
ДанныеРасшифровки = Новый <<?>>ДанныеРасшифровкиКомпоновкиДанных;
{Форма.Форма.Форма(162,36)}: Тип не определен (ПроцессорКомпоновкиДанных)
ПроцессорКомпоновкиДанных = Новый <<?>>ПроцессорКомпоновкиДанных;
{Форма.Форма.Форма(167,26)}: Тип не определен (ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений)
ПроцессорВывода = Новый <<?>>ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначени­й;
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа