(7) Посмотри как это работает в БСП ВерсионированиеОбъектов.
Нам наоборот пришлось уйти от стандартной схемы, т.к. в документах есть общий реквизит "ДатаОперации" и другие, незначащие - и у нас писалось даже и при перезаписи объекта.
Функция ВерсияОтличаетсяОтРанееЗаписанной(Объект)
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ВерсииОбъектов.КонтрольнаяСумма
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
|ГДЕ
| ВерсииОбъектов.Объект = &Объект
|
|УПОРЯДОЧИТЬ ПО
| ВерсииОбъектов.НомерВерсии УБЫВ";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Объект", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Не ПустаяСтрока(Выборка.КонтрольнаяСумма) Тогда
Возврат Выборка.КонтрольнаяСумма <> КонтрольнаяСумма(ДанныеДляХранения(Объект));
КонецЕсли;
Возврат Объект.ЭтоНовый() Или КонтрольнаяСумма(ДанныеДляХранения(Объект)) <> КонтрольнаяСумма(ДанныеДляХранения(Объект.Ссылка.ПолучитьОбъект()));
КонецФункции
Функция КонтрольнаяСумма(Данные) Экспорт
ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
Если ТипЗнч(Данные) = Тип("Структура") Тогда
ХешированиеДанных.Добавить(Данные.Объект);
Если Данные.Свойство("ДополнительныеРеквизиты") Тогда
ХешированиеДанных.Добавить(ОбщегоНазначения.ЗначениеВСтрокуXML(Данные.ДополнительныеРеквизиты));
КонецЕсли;
Иначе
ХешированиеДанных.Добавить(Данные);
КонецЕсли;
Возврат СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
КонецФункции
(8) Да с чего тормоза. Версионирование во всех типовых работает и норм.