Удаление версий объектов (истории изменения)
1C-admin
12.03.2019
В типовых конфигурациях и конфигурациях на БСП есть регистр сведений «Версии объектов», хранящий информацию об изменениях в объектах.
Эта обработка позволяет удалить определенные или все записи в регистре.
Отборы:
- Период — удаляются версии объектов записанные в указанный период (границы периода включаются).
- Пользователь — удаляются версии записанные определенным пользователем.
- Объекты — удаляются версии указанных объектов.
Все отборы являются не обязательными. Например можно удалить версии записанные определенным пользователем до определенной даты (задать пользователя и конец периода). Если оставить все отборы пустыми — удаляться все записи регистра.
Проверялось на БСП версии 2.3.4, но похоже структура регистра остается не изменной и в других версиях библиотеки (по крайней мере в текущей последней версии 2.4.5 она такая же). Должно помочь в БП 3.0, ЗУП 3.1 и других типовых на 8.3.
Перед удалением рекомендую сделать бэкап.
&НаКлиенте
Процедура Удалить(Команда)
УдалитьНаСервере();
ПоказатьПредупреждение(,"Удаление версий закончено.");
КонецПроцедуры
&НаСервере
Процедура УдалитьНаСервере()
//если все отборы пусты - стирается весь регистр
Если Не ЗначениеЗаполнено(Объект.Объекты) И Не ЗначениеЗаполнено(Объект.ПериодС)
И Не ЗначениеЗаполнено(Объект.ПериодПо) И Не ЗначениеЗаполнено(Объект.Пользователь) Тогда
НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВерсииОбъектов.Объект КАК Объект,
| ВерсииОбъектов.НомерВерсии КАК НомерВерсии
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
|
|УПОРЯДОЧИТЬ ПО
| Объект,
| НомерВерсии УБЫВ";
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(Запрос.Текст);
ОператорВыбрать = Схема.ПакетЗапросов[0].Операторы[0];
Если ЗначениеЗаполнено(Объект.Пользователь) Тогда
ОператорВыбрать.Отбор.Добавить("ВерсииОбъектов.АвторВерсии = &Пользователь");
Запрос.УстановитьПараметр("Пользователь",Объект.Пользователь);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ПериодС) Тогда
ОператорВыбрать.Отбор.Добавить("ВерсииОбъектов.ДатаВерсии >= &ПериодС");
Запрос.УстановитьПараметр("ПериодС",Объект.ПериодС);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ПериодПо) Тогда
ОператорВыбрать.Отбор.Добавить("ВерсииОбъектов.ДатаВерсии <= &ПериодПо");
Запрос.УстановитьПараметр("ПериодПо",Объект.ПериодПо);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Объекты) Тогда
ОператорВыбрать.Отбор.Добавить("ВерсииОбъектов.Объект В (&Объекты)");
Запрос.УстановитьПараметр("Объекты",Объект.Объекты);
КонецЕсли;
Запрос.Текст = Схема.ПолучитьТекстЗапроса();
Выборка = Запрос.Выполнить().Выбрать();
КоличествоЗаписейВТранзакции = 200;
Инд = 1;
НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
Если Инд >= КоличествоЗаписейВТранзакции Тогда
ЗафиксироватьТранзакцию();
Инд = 1;
НачатьТранзакцию();
КонецЕсли;
НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Выборка.Объект);
НаборЗаписей.Прочитать();
КоличествоВерсийОбъекта = НаборЗаписей.Количество();
//удалении выбранной записи
ЗаписьРегистра = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Объект = Выборка.Объект;
ЗаписьРегистра.НомерВерсии = Выборка.НомерВерсии;
Попытка
ЗаписьРегистра.Удалить();
Исключение
ЗаписьЖурналаРегистрации("ИнформационнаяБаза.УдалениеЗаписейРегистраВерсииОбъектов",
УровеньЖурналаРегистрации.Ошибка,,,"Не удалось удалить версию "+Выборка.НомерВерсии+" объекта "+Выборка.Объект+ОписаниеОшибки());
КонецПопытки;
//изменение версий последующих записей
Для ИндВерсии = Выборка.НомерВерсии + 1 По КоличествоВерсийОбъекта Цикл
ЗаписьРегистра = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Объект = Выборка.Объект;
ЗаписьРегистра.НомерВерсии = ИндВерсии;
ЗаписьРегистра.Прочитать();
ЗаписьРегистра.НомерВерсии = ИндВерсии - 1;
Попытка
ЗаписьРегистра.Записать();
Исключение
ЗаписьЖурналаРегистрации("ИнформационнаяБаза.ИзменениеНомеровПоследующихВерсий",
УровеньЖурналаРегистрации.Ошибка,,,"Не удалось изменить версию "+ИндВерсии+" объекта "+Выборка.Объект+ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Инд = Инд + 1;
КонецЦикла;
ЗафиксироватьТранзакцию();
КонецПроцедуры
Еще вот такую вещь можно посмотретьhttps://infostart.ru/public/191128/
Срочно нужно как стартмaни закинуть))
(2) Под спойлером весь код обработки, останется только нарисовать форму как на картинке) К сожалению, инфостарт не дает выложить файл бесплатно.
(3) как-то один автор писал, что можно написать модератору — тот сменит на «бесплатно».
можно четвертый отбор сделать: оставить, допустим, только три последние версии каждого объекта