Регламентное задание: Очистка регистра сведений "Версии объектов"

28.06.18

База данных - Свертка базы

У каждого была проблема «растущего» регистра "Версии объектов". Мы дорастили просто до чудовищных размеров(20 мил.) почистить обработкой очень трудоемко, плюс баз у нас много. Решили написать  регламентное задание.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка «Очистки Регистра сведений 'Версии объектов'»:
.epf 6,68Kb
21
21 Скачать (1 SM) Купить за 1 850 руб.

Постановка задачи:

  • Чистит каждую ночь по 5 часов

  • Удаляет записи прошлых лет

  • Оставляет всегда 1 самую старую версию.

  • После отработки пишет в журнал регистрации информацию по проделанной работе.

Все входные параметры легко зашиваются на константы.

Проверено на УПП 107.2.1.3 платформа (8.3.8.1933). 

После очистки рекомендую сделать сжатие базы.

Листинг регламентированного задания.

 

Процедура ВыполнитьОчисткуПоВидуОбъекта() Экспорт

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

     КоличествоВерсий = СтрокаОбъект.НомерВерсии;

    //Вводим 2 цикл для того чтоб оставить только 1 самую новую версию

    Пока КоличествоВерсий > 1 цикл

            КоличествоВерсий = КоличествоВерсий - 1;

            НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();

            НаборЗаписей.Отбор.НомерВерсии.Установить(КоличествоВерсий);

            НаборЗаписей.Отбор.Объект.Установить(СтрокаОбъект.Объект);

            НаборЗаписей.Записать();

            СчетчикВерсий = СчетчикВерсий + 1;

            СчетчикОбъектов = СчетчикОбъектов + 1;

            // Прекращаем работу, если время прошло

            Если ТекущаяДата() > ОстановитьПосле Тогда

                    ДатаОкончания = ТекущаяДата();

                    ВремяВыполнения = ДатаОкончания - ДатаНачало;

                    ИмяСобытия = "Замер времени очистки Регистра сведений 'Версии объектов'";

                    Комментарий = "Объектов обработано " +СчетчикОбъектов + ", удалено: "+ СчетчикВерсий + " версий. Затрачено "+ВремяВыполнения+" секунд.";            

                    ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,,, Комментарий);                

                    Возврат

            КонецЕсли;

        КонецЦикла;

    КонецЦикла;

//Вдруг чудо и закончили раньше 5 часов

ДатаОкончания = ТекущаяДата();

ВремяВыполнения = ДатаОкончания - ДатаНачало;

ИмяСобытия = "Замер времени очистки Регистра сведений 'Версии объектов'";

Комментарий = "Объектов обработано " +СчетчикОбъектов + ", удалено: "+ СчетчикВерсий + " версий. Затрачено "+ВремяВыполнения+" секунд.";            

ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,,, Комментарий);                

КонецПроцедуры

 

Помидорами не кидаемся.

См. также

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7865    58    23    

69

Перенос данных 1C Оптовая торговля Свертка базы Системный администратор Программист Бухгалтер Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Хотите точно знать, что вы выгружаете? Хотите сворачивать товары по НДС или фильтровать товары по доп. реквизиту? Вы волшебник, которому необходимо превращать одних контрагентов в других? Хотите при выгрузке превратить группу товаров в один? Или просто нужен удобный OLE обмен между 1C:Управление торговлей (ред. 11 или 10) и 1С:Бухгалтерия предприятия (ред. 2 или 3). Тогда эта обработка для вас!

10900 руб.

19.04.2013    171998    365    397    

334

Чистка данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

Позволяет удалить организации из любых из информационных баз 1С на управляемых формах (БП 3.0, УТ 11, КА 2, ERP 2, ЗУП 3.0, УНФ, Розница 2.0 и пр.). Главное требование - программа должна содержать справочник "Организации". Реализован самый быстрый алгоритм непосредственного удаления объектов. Работает даже на базах большого размера. Для ускорения работы алгоритма не запускается проверка контроля ссылочной целостности. Проверку учета можно запустить отдельно с помощью дополнительной обработки. Необходимо перед удалением самостоятельно проверить базу на наличие перекрестных ссылок разных организаций в одном документе. Эту дополнительную обработку проверки перекрестных ссылок по запросу предоставляем бесплатно нашим покупателям.

3582 руб.

16.03.2015    172166    209    81    

244

Чистка данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 10 1С:Управление торговлей 11 Платные (руб)

Данные обработки помогут Вам легко и, главное быстро, выполнить удаление любых данных в Ваших базах 1С на платформах 8.1-8.3. Обработки помогут легко просмотреть связи ссылок в виде дерева, выбрать что удалять, а что нет, используя любые отборы. Это позволит уменьшить объем лишней и не нужной информации в справочниках и документах, планах видов характеристик и др. объектах и облегчит работу с данными пользователям и Вам. Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. (Обновление от 29.06.2023, версия 4.2)

9600 руб.

22.02.2013    138413    258    144    

429

Свертка базы Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Платные (руб)

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

6000 руб.

22.05.2024    3007    13    7    

22

Чистка данных Программист Пользователь Платформа 1С v8.3 Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Обработка позволяет удобно и выборочно удалить данные из базы 1С. Это могут быть как неиспользуемые элементы справочников, так и неактуальные организации. При этом есть возможность провести анализ пересечений документов с другими организациями и таким образом уберечься от того, что при удалении обороты по другой организации изменятся.

3350 руб.

28.11.2019    25861    59    16    

74

Свертка базы Программист Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Управленческий учет Платные (руб)

Обработка свертки базы 1С УНФ 1.6 выполнена в виде расширения конфигурации, которое встраивается в вашу базу без снятия с поддержки, и адаптирована под релиз УНФ 1.6.

4800 руб.

20.04.2021    16883    51    34    

58

Оптовая торговля Логистика, склад и ТМЦ Чистка данных Программист Бухгалтер Пользователь Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Если вы начали работать в программном продукте Управление Торговлей, редакция 11 или Комплексная Автоматизация редакция 2 и включили механизм учёта серий, то перейти обратно в учёт без серий будет не так-то просто. Сложность заключается в том, что нужно очистить серии в табличной части документа, например, Реализация Товаров и услуг. Предлагаем алгоритм перехода на учет без серий для программного продукта УТ11. (Очистка серий.)

2400 руб.

09.04.2019    29056    43    14    

45
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ice-net 19 28.06.18 15:01 Сейчас в теме
Мне кажется так будет быстрее + время будет тратиться только на удаление существующих записей + можно получать данные для удаления порциями
Процедура ВыполнитьОчисткуПоВидуОбъекта() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 5000
	|	ВерсииОбъектов.Объект,
	|	МАКСИМУМ(ВерсииОбъектов.НомерВерсии) КАК НомерВерсии
	|ПОМЕСТИТЬ ВТ
	|ИЗ
	|	РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
	|ГДЕ
	|	НАЧАЛОПЕРИОДА(ВерсииОбъектов.ДатаВерсии, ДЕНЬ) <= &Период
	|
	|СГРУППИРОВАТЬ ПО
	|	ВерсииОбъектов.Объект
	|
	|ИМЕЮЩИЕ
	|	КОЛИЧЕСТВО(ВерсииОбъектов.Объект) > 1
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВТ.Объект КАК Объект,
	|	ВерсииОбъектов.НомерВерсии КАК НомерВерсии
	|ИЗ
	|	ВТ КАК ВТ
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
	|		ПО ВТ.Объект = ВерсииОбъектов.Объект
	|			И ВТ.НомерВерсии > ВерсииОбъектов.НомерВерсии";
	Запрос.УстановитьПараметр("Период", НачалоГода(ТекущаяДата()));
		
	
	ДатаНачала = ТекущаяДата();
	ОстановитьПосле = ДатаНачала + 5*3600; //Через 5 часов
	СчетчикВерсий = 0;
	СчетчикОбъектов = 0;
	
	УдалитьСтарыеВерсии(Запрос, СчетчикВерсий, СчетчикОбъектов, ОстановитьПосле);
	
	
	ВремяВыполнения = ТекущаяДата() - ДатаНачала;
	ИмяСобытия = "Замер времени очистки Регистра сведений 'Версии объектов'";
	Комментарий = "Объектов обработано " +СчетчикОбъектов + ", удалено: "+ СчетчикВерсий + " версий. Затрачено "+ВремяВыполнения+" секунд.";
	ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,,, Комментарий);               
	
КонецПроцедуры


//Рекурсия
Процедура УдалитьСтарыеВерсии(Запрос, СчетчикВерсий, СчетчикОбъектов, ОстановитьПосле)
	
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли;
	
	НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
	
	Выборка = Результат.Выбрать();
	н=0; Всего = Выборка.Количество();
	Пока Выборка.Следующий() Цикл
		н=н+1;
		НаборЗаписей.Отбор.НомерВерсии.Установить(Выборка.НомерВерсии);
		НаборЗаписей.Отбор.Объект.Установить(Выборка.Объект);
		НаборЗаписей.Записать();
		
		#Если Клиент Тогда
			ОбработкаПрерыванияПользователя();
			Если н%50=0 Тогда
				Состояние("Обработано в этой порции данных" + н+"/"+Всего);
			КонецЕсли;
		#КонецЕсли
		
		СчетчикВерсий = СчетчикВерсий + 1;
		СчетчикОбъектов = СчетчикОбъектов + 1;
		
		Если ТекущаяДата() >= ОстановитьПосле Тогда
			Возврат
		КонецЕсли;
	КонецЦикла;
	
	УдалитьСтарыеВерсии(Запрос, СчетчикВерсий, СчетчикОбъектов, ОстановитьПосле);
	
КонецПроцедуры
Показать
2. abadonna83 45 28.06.18 15:12 Сейчас в теме
Нравится решение

НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();

Пока Выборка.Следующий() Цикл

Далее уже отборы и запись.
3. mike_pol 29 29.06.18 15:07 Сейчас в теме
Есть ряд замечаний:
1. не понятно, вы хотите оставить самый первый или самый последний экземпляр? Удаляя все записи, кроме первой или последней, вы лишаете себя возможности видеть все изменения, вносимые пользователями. В результате прояснить: кто, когда изменил документ и что изменено не представляется возможным. ( в случает отличия с печатной формой).
2. Ежедневно выставляя параметр запроса "Период" как начало года, вы не уменьшаете объем данных регистра за текущий год.(т.е. весь текущий год регистр растет)- текущий год не обрабатывается. ( запускать обработку ежедневно не имеет смысла - только раз в году). Обработав первый раз регистр "Версии объектов" в 2018 году, набор данных за 2017 год и ранее мало изменится, т.к. вам навряд ли разрешат изменять данные закрытых периодов, а реквизит регистра ДатаВерсии будет = дате записи, внесения изменений или перепроведения - в любом случае>01.01.2018
4. abadonna83 45 05.07.18 10:35 Сейчас в теме
Постановка задачи:
Оставляем самую свежую запись за 2017 год.Общая история хранится в бекапах.
При больших объемах регистра в 20 мил записей до 2017 г. удалять приходится порциями.
Закрытие периода не влияет на регистр "Версии объектов". Ночные задания проходят под правами администратора.

Все входные параметры(Период отбора, Количество оставляемых версия, Время работы) можно зашить на Константы в таком случае работа механизма будет гибкой.
5. shard 281 16.07.18 13:05 Сейчас в теме
у себя для очистки версий использую следующий принцип:
1) запросом выбираю объекты, которые не изменялись с какого-то момента времени (например с 01.01.18) - эти записи уже можно назвать условно постоянными и история по ним в рабочей базе не так важна.
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ВерсииОбъектов.Объект,
	МАКСИМУМ(ВерсииОбъектов.НомерВерсии) КАК НомерВерсииДо18,
	0 КАК МаксНомерВерсии
ПОМЕСТИТЬ ВТ
ИЗ
	РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
ГДЕ
	ВерсииОбъектов.ДатаВерсии < ДАТАВРЕМЯ(2018, 1, 1, 0, 0, 0)

СГРУППИРОВАТЬ ПО
	ВерсииОбъектов.Объект

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
	ВерсииОбъектов.Объект,
	0,
	МАКСИМУМ(ВерсииОбъектов.НомерВерсии)
ИЗ
	РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов

СГРУППИРОВАТЬ ПО
	ВерсииОбъектов.Объект
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.Объект,
	СУММА(ВТ.НомерВерсииДо18) КАК НомерВерсииДо18,
	СУММА(ВТ.МаксНомерВерсии) КАК МаксНомерВерсии
ИЗ
	ВТ КАК ВТ

СГРУППИРОВАТЬ ПО
	ВТ.Объект
имеющие
	СУММА(ВТ.НомерВерсииДо18) = СУММА(ВТ.МаксНомерВерсии)
	
Показать

2) очищаю версии этих объектов
Инд = 0; Всего = РезультатТаблица.Количество();
нз=регистрысведений.ВерсииОбъектов.создатьнаборзаписей();
отбор=нз.отбор.объект;

Для Каждого Выборка Из РезультатТаблица Цикл
	ОбработкаПрерыванияПользователя();
	
	отбор.установить(выборка.объект);
	нз.записать();

	Состояние(""+Инд+" из "+Всего);
	Инд = Инд + 1;
КонецЦикла; 
Показать


обращаю внимание что определения переменных НЗ и ОТБОР вынесены за пределы цикла. 480 тысяч записей по 130 тысячам объектов были освобождены в течение 5-6 минут.
6. abadonna83 45 16.07.18 17:05 Сейчас в теме
Непонятно зачем эта строка

отбор=нз.отбор.объект;
Оставьте свое сообщение