Здоровья всем страждущим!
Давеча необходимо было добавить документу версионирование.
Нашел статью, но там было много пунктов, показавшихся мне неактуальными, да и вышла она несколько лет назад. Решил обновить информацию отдельной статьей.
1. Начнем с базы, согласно ИТС. Для документов захватываем на расширении только определяемый тип "ВерсионируемыеДанные" (тип ссылка).
Если у вас другой тип объекта, например Справочник, тогда также захватываем "ВерсионируемыеДанныеОбъект" (тип объект).
При этом по умолчанию встает тип "Произвольный", необходимо в расширении оставить только типы объектов расширения.
2. Во всех формах версионируемых объектов и документов в обработчике "ПриСозданииНаСервере" добавить фрагмент кода:
// СтандартныеПодсистемы.ВерсионированиеОбъектов
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
Во всех модулях менеджера объектов (элементов), для которых встраивается версионирование, добавить фрагмент кода:
// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
Если необходимо скрыть из отчетов по версиям технические реквизиты и табличные части, необходимо в процедуру определения настроек модуля менеджера добавить:
Настройки.ПриПолученииСлужебныхРеквизитов = Истина;
И в том же модуле менеджера:
// Ограничивает видимость реквизитов объекта в отчете по версии.
//
// Параметры:
// Реквизиты - Массив - список имен реквизитов объекта.
Процедура ПриПолученииСлужебныхРеквизитов(Реквизиты) Экспорт
Реквизиты.Добавить("ИмяРеквизита"); // реквизит объекта
Реквизиты.Добавить("ИмяТабличнойЧасти.*"); // табличная часть объекта
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
Конец базы :)
3. Захватываем подписку на событие "ЗаписатьВерсиюДокументаЗарплатаКадрыБазовая" и в источнике указываем наши объекты.
4. Для корректной работы формы регистра сведений "НастройкиВерсионированияОбъектов" захватываем его форму списка "НастройкиХраненияИстории" на расширении, далее захватываем в расширение реквизит формы "ДеревоОбъектовМетаданных" и расширяем колонку реквизита "ТипОбъекта" типом ИдентификаторыОбъектовРасширений.
5. Захватываем в общем модуле "ОбщегоНазначения" функцию "ИдентификаторОбъектаМетаданных" и дополняем следующим кодом (взято из указанной выше статьи):
&ИзменениеИКонтроль("ИдентификаторОбъектаМетаданных")
Функция РасширениеА_ИдентификаторОбъектаМетаданных(ОписаниеОбъектаМетаданных, ВызыватьИсключение)
#Вставка
Если ТипЗнч(ОписаниеОбъектаМетаданных) = Тип("Строка") Тогда
ИдентификаторРасширения = Справочники.ИдентификаторыОбъектовРасширений.НайтиПоНаименованию(ОписаниеОбъектаМетаданных, Истина);
Если ЗначениеЗаполнено(ИдентификаторРасширения) Тогда
Возврат ИдентификаторРасширения;
КонецЕсли;
КонецЕсли;
#КонецВставки
Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторОбъектаМетаданных(
ОписаниеОбъектаМетаданных, ВызыватьИсключение);
КонецФункции
Захватываем общий модуль "ВерсионированиеОбъектов" и скорректируем процедуру:
&ИзменениеИКонтроль("ЗаписатьНастройкуВерсионированияПоОбъекту")
Процедура РасширениеА_ЗаписатьНастройкуВерсионированияПоОбъекту(Знач ТипОбъекта, Знач ВариантВерсионирования, Знач СрокХраненияВерсий)
#Вставка
Если ТипЗнч(ТипОбъекта) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных")
И ТипЗнч(ТипОбъекта) <> Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда
#КонецВставки
#Удаление
Если ТипЗнч(ТипОбъекта) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда
#КонецУдаления
ТипОбъекта = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипОбъекта);
КонецЕсли;
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных();
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиВерсионированияОбъектов");
ЭлементБлокировки.УстановитьЗначение("ТипОбъекта", ТипОбъекта);
Блокировка.Заблокировать();
Настройка = РегистрыСведений.НастройкиВерсионированияОбъектов.СоздатьМенеджерЗаписи();
Настройка.ТипОбъекта = ТипОбъекта;
Если СрокХраненияВерсий = Неопределено Тогда
Настройка.Прочитать();
Если Настройка.Выбран() Тогда
СрокХраненияВерсий = Настройка.СрокХраненияВерсий;
Иначе
Настройка.ТипОбъекта = ТипОбъекта;
СрокХраненияВерсий = Перечисления.СрокиХраненияВерсий.Бессрочно;
КонецЕсли;
КонецЕсли;
Настройка.СрокХраненияВерсий = СрокХраненияВерсий;
Настройка.Вариант = ВариантВерсионирования;
Настройка.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
6. Включаем сохранение версий для ваших объектов: Администрирование - Общие настройки - История изменений - Настроить
В конечном итоге, не считая ваших объектов, состав расширения следующий (в скриншоте я работаю с хранилищем):

Тестировал на 1С:Предприятие 8.3 (8.3.26.1656), Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.36.39) .
Вступайте в нашу телеграмм-группу Инфостарт
