БСП великолепна. Я ни в коей мере не критикую ни саму БСП, ни ее разработчиков, этой статьей хочу подсветить важность выбора терминов.
Три вопроса
Начну с трех вопросов. Вы хорошо знаете подсистему БСП "Версионирование объектов"?
Ну конечно же, хорошо. На собеседованиях все кандидаты упоминают эту подсистему, когда заходит речь о БСП. Программисты умеют добавлять в версионирование свои справочники и документы, а аналитики обожают смотреть отчет об истории изменений. Некоторые даже не знают о платформенном механизме "История данных", но про версионирование из БСП все знают.
А вы знаете, что эта подсистема позволяет настраивать время хранения версий и автоматически удалять устаревшие версии?
Думаю, примерно все видели эту настройку. Есть регистр сведений НастройкиВерсионированияОбъектов, где для измерения ТипОбъекта (тип - идентификатор объектов метаданных) задается ресурс СрокХраненияВерсий. Интересно, что срок хранения версий - это перечисление СрокиХраненияВерсий, где заданы следующие значения: ЗаПоследнююНеделю, ЗаПоследнийМесяц, ЗаПоследниеТриМесяца, ЗаПоследниеШестьМесяцев, ЗаПоследнийГод, Бессрочно. То есть мы не можем задать срок хранения версий, например, один день (хотя это и бессмысленно) или два года.
А вы знаете, что версии на самом деле не удаляются?
Да-да. Версии при автоматическом удалении версий не удаляются. Из записи версии только удаляется "слепок объекта" (вычищается реквизит ВерсияОбъекта, где в хранилище значения записан текущий на момент записи версии объект). Сама запись остается на месте, она занимает минимум места, так как поле с объектом пустое, но она есть.
Не помню уже, когда при изучении кода БСП наткнулся на этот факт, но в моем окружении все удивляются, когда узнают, что версии не удаляются. Все уверены, что история удаляется. Есть же настройка длительности хранения, есть регламент, для чего это все, если не для удаления?
И увы, никто никогда не читает документацию...

Путаница в терминах
Кажется, само наличие свойства "Срок хранения версий" подразумевает, что версии хранятся какой-то срок, по истечении которого, они удаляются.
А что такое версия? Тут и начинается неоднозначность. С одной стороны, регистр ВерсииОбъектов подразумевает, что версия - это запись этого регистра, то есть совокупность ссылки на объект, самого объекта в виде двоичных данных, информации об авторе изменения, дате и прочее. С другой стороны, у этого регистра есть реквизит ВерсияОбъекта, где и хранится сжатый объект. Я понимаю "срок хранения версий" как "срок хранения всей записи о конкретной версии в регистре сведений ВерсииОбъектов", а разработчики БСП как "срок хранения реквизита ВерсияОбъекта в записи регистра сведений ВерсииОбъектов".
Далее, даже сам регламент так и называется - ОчисткаУстаревшихВерсийОбъектов. Если вдуматься, ну какое удаление. Очистка - это же когда какой-то предмет никуда не девается, просто очищается от чего-то. Как раз записи регистра остаются, просто очищаются от двоичных данных. А с другой стороны, ну какая собственно разница между словами "очистка" и "удаление"? Это же по сути одно и то же.

Так и откладывается в головах, что устаревшие версии удаляются.
Не помогает в понимании того, что на самом деле происходит, и типовая форма настройки версий. Посмотрите, группа названа "Очистка устаревших версий", а флажок, управляющий включенностью регламента, называется "Автоматически удалять устаревшие версии".

Тут же прямо написано - удалять!
А что в коде?
В свернутом блоке код одного из первых вариантов регламента очистки версий
Ищем записи, в которых еще есть данные версии запросом поиска, текст которого дозаполняется в методе ЗапросПоУстаревшимВерсиям, и в записях регистра просто очищается ВерсияОбъекта (так как это тип ХранилищеЗначений, просто присваиваем ему Неопределено). Возможно кому-то в этом коде будет непонятно, как же так, ищем записи с булевым реквизитом ЕстьДанныеВерсии, а при очистке потом просто затираем ВерсияОбъекта, не трогая ЕстьДанныеВерсии? В следующий запуск поиска устаревших версий мы ведь будем обрабатывать те же самые записи? Нет, дело в том, что при записи версии срабатывает обработчик ПередЗаписью, расположенный в модуле набора записей регистра. Он и устанавливает значение ЕстьДанныеВерсии в Ложь.
А вот код из самой последней на сегодня БСП ветки 3.2, предназначенной для платформы 8.5
Бросается в глаза, что усложнили получение текста запроса для поиска устаревших версий. Вы обратили внимание, что теперь в шаблоне запроса выборки записей получаем только первые 1000 строк? Стало оптимальнее. Представьте, у нас миллион устаревших записей. В старых версиях БСП и запрос дольше выполняется и в выборку попадают все записи, затем долго и мучительно очищаются. Сейчас мы получаем ограниченное количество записей, обрабатываем их, затем делаем следующий запрос. Если он что-то вернул - продолжаем очистку, нет - выходим из регламента.
Почему плохо оставлять записи о версиях?
У меня два возражения против очищенных версий.
Версионирование объектов - это сервисная подсистема. В наличии или отсутствии версий нет большой ценности для бизнеса. Версии нужны техподдержке, аналитикам, продвинутым пользователям, но они нужны полные, с возможностью посмотреть изменение реквизитов и восстановления объекта. А из очищенных записей мы видим, кто и когда изменил объект, посмотреть, какие именно реквизиты были изменены, не получится. Но в журнале регистрации и так есть информация о том, кто и когда изменил объект! Получается, мы дублируем журнал регистрации. Поэтому нет никакого смысла оставлять пустые записи о версиях.
Подумаем еще о производительности приложения. Регистр ВерсииОбъектов очень коварен из-за того, что измерение Объект имеет тип ВсеСсылки. Это нужно для универсальности. Но обратная сторона универсальности - падение производительности. При добавлении или удаление справочника или документа в конфигурацию будет происходить реструктуризация регистра. Когда регистр маленький, реструктуризация быстрая. Когда большой - ну все зависит от железа, вида реструктуризации (вы пользуетесь второй версией?) и погоды за окном (а это уже шутка). Обидно, если значительная часть записей регистра - это пустышки.

Хорошо, версии не удаляются, принято. А как же удалить версии?
Изначально я хотел выложить свое расширение, которое в регламенте вместо очистки хранилища из записи позволяет удалить саму запись.
Но все-таки прорекламирую уже существующее на инфостарте решение Владимира Чанова Удаление записей версий объектов для типовых конфигураций. Он реализовал еще и настройку, с помощью которой можно управлять поведением - удалять версии или же просто очищать.
Что дальше?
Говорят, на "партнерке" есть форум с обсуждением БСП, куда можно отправить предложения разработчикам. К сожалению, у меня нет туда доступа.
Очень помогло бы, если бы на форме настройки версий появилась бы декорация с пояснением работы механизма очистки. Что-то типа текста из документации.
Ну и призываю всех тщательнее относиться к выбору терминов. Кто знает, как их будут трактовать пользователи?
Вступайте в нашу телеграмм-группу Инфостарт
