1. Начальное заполнение истории по всем данным нерационально, предлагается вместо этого выполнять запись в историю только при первом изменений объекта.
2. Если объект сохраняется при отсутствии изменений, тогда прсто выполняем отказ от записи. Объект для сравнения объекта записывается в регистр сведения для временного хранения данных.
3. Обновление истории в ФормаИсторииИзмененийИсторииДанных отключаем и выполняем обновление через регламентное задание.
4. Для скачивания размещена обработка УправлениеИОчисткаИсторииДанных.epf позволяет управлять механизмом истории в режиме 1С Предприятии. Полезно для включения/отключать механизм истории данных, очистки истории. Полезно также для отключения историии в подчиненных узлах РИБ (если этот механизм не нужен).
Проверено на платформе 1С:Предприятие 8.3 (8.3.13.1809).
Для примера запись истории для справочника (используется подписка на события):
// Вставляем в подписку на события: Справочник Объект, ПередЗаписью
Процедура Справочники_ПередЗаписью(Источник, Отказ) Экспорт
Попытка
Если Источник.Метаданные().ИсторияДанных =Метаданные.СвойстваОбъектов.ИспользованиеИсторииДанных.Использовать Тогда
Настройки = ИсторияДанных.ПолучитьНастройки(Источник.Метаданные());
Если Настройки = Неопределено Тогда
Использование=Истина;
Иначе
Использование=Настройки.Использование;
КонецЕсли;
Если НЕ Источник.ЭтоНовый () И НЕ Отказ И Использование Тогда
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Источник.Ссылка.ПолучитьОбъект(), НазначениеТипаXML.Явное);
СериализованныйОбъект=ЗаписьJSON.Закрыть();
ЗапРег=РегистрыСведений.ОбъектВХранилище.СоздатьМенеджерЗаписи();
ЗапРег.СсылкаОбъекта=Источник.Ссылка;
ЗапРег.ОбъектВХранилище=Новый ХранилищеЗначения(СериализованныйОбъект);
ЗапРег.Записать();
Отбор = Новый Структура;
Отбор.Вставить( "Данные", Источник.Ссылка);
Версии = ИсторияДанных.ВыбратьВерсии(Отбор, "НомерВерсии, Дата",,1);
Если Версии.Количество()=0 Тогда
ТекущийПользовательИБ=ПользователиИнформационнойБазы.ТекущийПользователь();
ЗапРег=РегистрыСведений.РегистрацияВерсииИсторииДанных.СоздатьМенеджерЗаписи();
ЗапРег.СсылкаОбъекта=Источник.Ссылка;
ЗапРег.ОбъектВХранилище=Новый ХранилищеЗначения(СериализованныйОбъект);
ЗапРег.Дата=ТекущаяДата();
ЗапРег.ВидИзмененияДанных=Строка(ВидИзмененияДанных.Добавление);
ЗапРег.Комментарий="Начальное заполнение истории данных";
ЗапРег.ТекущийПользователь=Новый ХранилищеЗначения (ТекущийПользовательИБ);
ЗапРег.Записать();
КонецЕсли;
Иначе
Если НЕ Отказ Тогда
КонецЕсли;
КонецЕсли;
КонецЕсли;
Исключение
Сообщить ( ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Вставляем в подписку на события: Справочник Объект, ПриЗаписи
Процедура Справочники_ПриЗаписи(Источник, Отказ) Экспорт
Попытка
Если Источник.Метаданные().ИсторияДанных =Метаданные.СвойстваОбъектов.ИспользованиеИсторииДанных.Использовать Тогда
Настройки = ИсторияДанных.ПолучитьНастройки(Источник.Метаданные());
Если Настройки = Неопределено Тогда
Использование=Истина;
Иначе
Использование=Настройки.Использование;
КонецЕсли;
Если НЕ Источник.ЭтоНовый () И НЕ Отказ И Использование Тогда
ЗапРег=РегистрыСведений.ОбъектВХранилище.Получить( Новый Структура("СсылкаОбъекта",Источник.Ссылка));
ЗапРег=РегистрыСведений.ОбъектВХранилище.СоздатьМенеджерЗаписи();
ЗапРег.СсылкаОбъекта= Источник.Ссылка;
ЗапРег.Прочитать();
Если ЗапРег.Выбран() Тогда
ОбъектПередЗаписью =ЗапРег.ОбъектВХранилище.Получить();
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Источник, НазначениеТипаXML.Явное);
ОбъектПриЗаписи=ЗаписьJSON.Закрыть();
СравнениеСтр= Новый СравнениеЗначений ;
Если СравнениеСтр.Сравнить(ОбъектПередЗаписью, ОбъектПриЗаписи)= 0 Тогда
Отказ=Истина;
КонецЕсли;
ЗапРег.ОбъектВХранилище= Неопределено;
ЗапРег.Удалить();
Иначе
Источник.УстановитьКомментарийВерсииИсторииДанных("создание нового объекта");
КонецЕсли;
КонецЕсли;
Иначе
Если НЕ Отказ Тогда
//Источник.УстановитьКомментарийВерсииИсторииДанных("новый объект");
КонецЕсли;
КонецЕсли;
Исключение
Сообщить ( ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
//Процедуроа стандартной формы ФормаИсторииИзмененийИсторииДанных
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Перем МетаданныеДанных, ЭтоПодчиненныйРегистрСведений;
МетаданныеДанных = Параметры.Данные.Метаданные();
Если Не ПравоДоступа("ПросмотрИсторииДанных", МетаданныеДанных) Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Отбор.Вставить("Данные", Параметры.Данные);
Элементы.ВерсииКомментарий.ТолькоПросмотр = Не ПравоДоступа("РедактированиеКомментарияВерсииИсторииДанных", МетаданныеДанных);
ЭтоПодчиненныйРегистрСведений = Метаданные.РегистрыСведений.Содержит(МетаданныеДанных)
И МетаданныеДанных.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору;
Если ЭтоПодчиненныйРегистрСведений
Или Не ПравоДоступа("ПереходНаВерсиюИсторииДанных", МетаданныеДанных) Тогда
Элементы.ФормаПерейтиНаВерсию.Видимость = Ложь;
Элементы.ВерсииКонтекстноеМенюПерейтиНаВерсию.Видимость = Ложь;
КонецЕсли;
Заголовок =
ПолучитьПредставлениеДанных(МетаданныеДанных, Параметры.Данные) + " (" +
NStr("ru = 'История изменений'; SYS = 'DataHistory.VersionsTitle'", "ru")
+ ")";
//ИсторияДанных.ОбновитьИсторию(Параметры.Данные);
ВыбратьВерсии();
ОбновитьДоступностьОтключенияОтбора();
КоманднаяПанель.ПодчиненныеЭлементы.ФормаОбновитьРучками.Видимость= РольДоступна("ПолныеПрава");
КонецПроцедуры