Но есть недочеты в этой системе, программа не проверяет, является ли текущая записываемая версия объекта дублем (аналогична предыдущей версии), что в итоге захламляет базу и существенно увеличивает её объем.
Предлагаю использовать такую схему проверки дублей перед записью:
Исходя из схемы:
- Справочники — будут исключаться дубли без исключений;
- Документы — будет проверка на исключаемые типы и проверка на дубли, если не исключен.
Для чего нужен список исключенных? Для таких документов, как «РасчетСебестоимостиВыпуска», «ОпределениеФинансовыхРезультатов» и тд. которые не содержат табличных частей или проведение которых само по себе делает много изменений в базе.
Исключенные по умолчанию документы имеют очень маленький размер для каждой версии в отличие от, например, документа «Реализация товаров и услуг», имеющего сотни, а то и тысячи строк в табличных частях.
Для интеграции в базу нужно создать общий модуль (или использовать имеющийся нетиповой), для того, чтобы не возникало проблем при обновлении конфигурации, и вставить эту функцию проверки дублей версионирования:
//* фикс дублей версионирования // Евсенкин 23.12.15
Функция ЯвляетсяДублем(Источник,ТекущаяВерсия) Экспорт
// * перечисленные типы писать всегда
ИсключаемыеТипы = Новый Массив;
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.РасчетСебестоимостиВыпуска"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.КорректировкаЗаписейРегистров"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.ОпределениеФинансовыхРезультатов"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.ПереоценкаВалютныхСредств"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.СписаниеРасходовБудущихПериодов"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.ЗакрытиеГода"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.РегламентныеОперацииНалоговогоУчетаПоНалогуНаПрибыль"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.ПогашениеСтоимости"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.АмортизацияОС"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.РасчетыПоНалогуНаПрибыль"));
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.ОперацияБух"));
Исключать = ?(ИсключаемыеТипы.Найти(ТипЗнч(Источник)) = Неопределено, Ложь, Истина);
// *
Если Исключать Тогда // сразу вовращаем истину
ЗаписатьДубль = Истина;
Иначе // выполним проверку
РегистрВерсий = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
ОтборОбъект = РегистрВерсий.Отбор.Найти("Объект");
ОтборОбъект.ВидСравнения = ВидСравнения.Равно;
ОтборОбъект.Значение = Источник;
ОтборОбъект.Использование = Истина;
РегистрВерсий.Прочитать();
Индекс = РегистрВерсий.Количество() - 1;
Если Индекс >= 0 Тогда
ПредыдущаяВерсия = РегистрВерсий[Индекс].ВерсияОбъекта;
ПредыдущаяВерсияВнутр = ЗначениеВСтрокуВнутр(ПредыдущаяВерсия);
ТекущаяВерсияВнутр = ЗначениеВСтрокуВнутр(ТекущаяВерсия);
ЭтоДубль = ПредыдущаяВерсияВнутр = ТекущаяВерсияВнутр;
Иначе
ЭтоДубль = Ложь;
КонецЕсли;
ИстМет = Источник.Метаданные();
Если Метаданные.Справочники.Содержит(ИстМет) Тогда // у справочника удаляем все дубли
ЗаписатьДубль = Не ЭтоДубль;
ИначеЕсли Метаданные.Документы.Содержит(ИстМет) Тогда // документы проверяем на исключаемые типы и дубль
ЗаписатьДубль = Не ЭтоДубль;
КонецЕсли;
КонецЕсли;
Возврат ЗаписатьДубль;
КонецФункции
//*
Для интеграции нужно сделать небольшие изменения в общем модуле «ВерсионированиеОбъектов» процедуры
МеханизмВерсионированияОбъектов_ПриЗаписиОбъекта(Источник, Отказ)
Требуется найти строку 21
ВерсионированиеОбъектовПривилегированный.ЗаписатьВерсиюОбъекта(Источник.Ссылка, ЧислоВерсийОбъекта, ХранилищеДанных);
и заменить на
//*Проверка дубля версии объекта
Если _НазваниеВащегоОбщегоМодуля_.ЯвляетсяДублем(Источник.Ссылка,ХранилищеДанных) Тогда
ВерсионированиеОбъектовПривилегированный.ЗаписатьВерсиюОбъекта(Источник.Ссылка, ЧислоВерсийОбъекта, ХранилищеДанных);
КонецЕсли;
//*
Темпы роста базы значительно снизятся.
P.S. Список исключаемых документов можно изменить, так как использован тот, который подходит мне.
http://evsenkin.ru/programmirovanie-1s-8-x/versionirovanie-obektov-v-1s-upp-1-3-fiks-dublej.html
История:
23.12.15г. — оптимизировал код, теперь не МнОгОбУкОв
Готовое решение, спасибо
(1) Muxomop, рад, что помог.
оптимизировал код, теперь не МнОгОбУкОв