Версионирование объектов в 1С УПП 1.3. Фикс дублей

В 1С УПП 1.3 есть такой замечательный механизм "версионирование объектов", который позволяет узнать: кто, когда и что изменил в документах и справочниках.
Но есть недочеты в этой системе, программа не проверяет, является ли текущая записываемая версия объекта дублем (аналогична предыдущей версии), что в итоге захламляет базу и существенно увеличивает её объем.

Предлагаю использовать такую схему проверки дублей перед записью:

Схема по исключению дублей объектов

Исходя из схемы:

  • Справочники — будут исключаться дубли без исключений;
  • Документы — будет проверка на исключаемые типы и проверка на дубли, если не исключен.

Для чего нужен список исключенных? Для таких документов, как «РасчетСебестоимостиВыпуска», «ОпределениеФинансовыхРезультатов» и тд. которые не содержат табличных частей или проведение которых само по себе делает много изменений в базе.

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

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

//* фикс дублей версионирования // Евсенкин 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г. — оптимизировал код, теперь не МнОгОбУкОв 

3 Comments

  1. Muxomop

    Готовое решение, спасибо

    Reply
  2. tehas

    (1) Muxomop, рад, что помог.

    Reply
  3. tehas

    оптимизировал код, теперь не МнОгОбУкОв

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *