Порядок действий
Можете просто скачать расширение и наслаждаться результатом. Ниже я указал, на что следует обратить внимание при разработке своих расширений.
Шаг 1. В конфигураторе в меню "Конфигурация" - "Поддержка" - "Настройка поддержки" необходимо включить возможность изменения конфигурации и установить правила поддержки в положение "Объект поставщика редактируется с сохранением поддержки".
Шаг 2. Установить режим совместимости конфигурации в положение "Не использовать", если у вас платформа 8.3.20 или в положение "8.3.20", если пользуетесь более старшей версией платформы.
Шаг 3. Если прямо сейчас запустить 1С в режиме Предприятие то увидите ошибку, что конфигурация не может работать в режиме совместимости 8.3.20. По этому отключаем эту проверку. Создаём расширение и заимсвуем в него процедуру общего модуля СтандартныеПодсистемыСервер.ПередЗапускомПрограммы().
СтандартныеПодсистемыСервер.ПередЗапускомПрограммы()
&Вместо("ПередЗапускомПрограммы")
Процедура ВерсСО_ПередЗапускомПрограммы()
Если ТекущийРежимЗапуска() = Неопределено
И ДлительныеОперации.ЭтоЗапускБезВызоваПередЗапускомПрограммы() Тогда
Возврат;
КонецЕсли;
// Проверка основного языка программирования, установленного в конфигурации.
ТекущийЯзыкВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка["Русский"];
Если Метаданные.ВариантВстроенногоЯзыка <> ТекущийЯзыкВстроенногоЯзыка Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Вариант встроенного языка конфигурации ""%1"" не поддерживается.
|Используйте вариант языка ""%2"".';
|en = 'The built-in configuration language option ""%1"" is not supported.
|Use language option ""%2"" instead.'"),
Метаданные.ВариантВстроенногоЯзыка,
Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка["Русский"]);
КонецЕсли;
// Проверка настройки совместимости конфигурации с версией платформы.
СистемнаяИнформация = Новый СистемнаяИнформация;
МинимальнаяВерсияПлатформы = "8.3.14.1694";
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, МинимальнаяВерсияПлатформы) < 0 Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для запуска необходима версия платформы 1С:Предприятие %1 или выше.';
|en = 'The application requires 1C:Enterprise version %1 or later.'"), МинимальнаяВерсияПлатформы);
КонецЕсли;
Режимы = Метаданные.СвойстваОбъектов.РежимСовместимости;
ТекущийРежим = Метаданные.РежимСовместимости;
ПоддерживаемаяВерсияПлатформы = "8.3.16";
ВерсияПлатформы = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);
Если ТекущийРежим = Режимы.НеИспользовать Тогда
ПоддерживаемыеВерсииПлатформы = СтрРазделить("8.3.14, 8.3.15, 8.3.16, 8.3.17, 8.3.20", ", ", Ложь);
Если ПоддерживаемыеВерсииПлатформы.Найти(ВерсияПлатформы) <> Неопределено Тогда
НеПоддерживаемаяВерсияПлатформы = "";
Иначе
НеПоддерживаемаяВерсияПлатформы = ВерсияПлатформы;
КонецЕсли;
ИначеЕсли ТекущийРежим = Режимы.Версия8_1 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.1"
ИначеЕсли ТекущийРежим = Режимы.Версия8_2_13 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.2.13"
ИначеЕсли ТекущийРежим = Режимы.Версия8_2_16 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.2.16";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_1 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.1";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_2 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.2";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_3 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.3";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_4 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.4";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_5 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.5";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_6 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.6";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_7 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.7";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_8 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.8";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_9 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.9";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_10 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.10";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_11 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.11";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_12 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.12";
ИначеЕсли ТекущийРежим = Режимы.Версия8_3_13 Тогда
НеПоддерживаемаяВерсияПлатформы = "8.3.13";
Иначе
ТекущийРежимСтрокой = Строка(ТекущийРежим);
Если СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_14")
Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_15")
Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_16")
Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_20")
Или СтрЗаканчиваетсяНа(ТекущийРежимСтрокой, "8_3_17") Тогда
НеПоддерживаемаяВерсияПлатформы = "";
Иначе
НеПоддерживаемаяВерсияПлатформы = ТекущийРежимСтрокой;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(НеПоддерживаемаяВерсияПлатформы) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Режим совместимости конфигурации с 1С:Предприятием версии %1 не поддерживается.
|Для запуска установите в конфигурации режим совместимости ""Не использовать"" при разработке на версии %2
|(или ""Версия %2"" при разработке на более старших версиях).';
|en = 'Configuration compatibility mode ""Version %1"" is not supported.
|To start the application, set the compatibility mode to ""None"" (on 1C:Enterprise version %2)
| or to ""Version %2"" (on a later 1C:Enterprise version).'"),
НеПоддерживаемаяВерсияПлатформы, ПоддерживаемаяВерсияПлатформы);
КонецЕсли;
// Проверка заполнения версии конфигурации.
Если ПустаяСтрока(Метаданные.Версия) Тогда
ВызватьИсключение НСтр("ru = 'Не заполнено свойство конфигурации Версия.';
|en = 'The Version configuration property is blank.'");
Иначе
Попытка
НулеваяВерсия = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Метаданные.Версия, "0.0.0.0") = 0;
Исключение
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не правильно заполнено свойство конфигурации Версия: ""%1"".
|Правильный формат, например: ""1.2.3.45"".';
|en = 'The Version configuration property has invalid value: %1.
|Use the following format: ""1.2.3.45"".'"),
Метаданные.Версия);
КонецПопытки;
Если НулеваяВерсия Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не правильно заполнено свойство конфигурации Версия: ""%1"".
|Версия не может быть нулевой.';
|en = 'The Version configuration property has invalid value: %1.
|The version cannot be zero.'"),
Метаданные.Версия);
КонецЕсли;
КонецЕсли;
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Не ТекущийПользовательИБ.АутентификацияСтандартная
И Не ТекущийПользовательИБ.АутентификацияОС
И Не ТекущийПользовательИБ.АутентификацияOpenID Тогда
ВызватьИсключение НСтр("ru = 'Вход в программу запрещен. Обратитесь к администратору.';
|en = 'Signing-in denied. Contact the Administrator.'");
КонецЕсли;
Если Не Метаданные.ОсновныеРоли.Содержит(Метаданные.Роли.АдминистраторСистемы)
Или Не Метаданные.ОсновныеРоли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда
ВызватьИсключение
НСтр("ru = 'В конфигурации в свойстве ОсновныеРоли не указаны
|стандартные роли АдминистраторСистемы и ПолныеПрава.';
|en = 'The DefaultRoles configuration property does not include
|the following standard roles: SystemAdministrator and FullAccess.'");
КонецЕсли;
// Проверка возможности выполнения обработчиков установки параметров сеанса для запуска программы.
ПроверитьВозможностьЗапуска();
Если Не ЗначениеЗаполнено(ПользователиИнформационнойБазы.ТекущийПользователь().Имя)
И (Не ОбщегоНазначения.РазделениеВключено()
Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных())
И ОбновлениеИнформационнойБазыСлужебный.ВерсияИБ("СтандартныеПодсистемы",
ОбщегоНазначения.РазделениеВключено()) = "0.0.0.0" Тогда
ПользователиСлужебный.УстановитьНачальныеНастройки("");
КонецЕсли;
ИнтеграцияПодсистемБСП.ПередЗапускомПрограммы();
СкорректироватьНачальнуюСтраницуНеразделенногоПользователя();
ОбработатьОчередьСкопированныхНастроек();
КонецПроцедуры
Теперь программа должна открываться без ошибок.
Шаг 4. В расширении создаём новый документ и для красоты сразу прицепляем его в отдельную подсистему.
При необходимости, указываем служебные реквизиты в модуле менеджера документа, чтобы скрыть их из отчёта версионирования.
Модуль менеджера документа
// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
//принять решение о необходимости скрытия из отчетов по версиям реквизитов и табличных частей,
//имеющих техническое назначение. Для скрытия реквизитов и табличных частей необходимо в
//процедуре ПриОпределенииНастроекВерсионированияОбъектов модуля менеджера объекта добавить следующий код:
//Настройки.ПриПолученииСлужебныхРеквизитов = Истина;
КонецПроцедуры
// Ограничивает видимость реквизитов объекта в отчете по версии.
//
// Параметры:
// Реквизиты - Массив - список имен реквизитов объекта.
Процедура ПриПолученииСлужебныхРеквизитов(Реквизиты) Экспорт
//Реквизиты.Добавить("ИмяРеквизита"); // реквизит объекта
//Реквизиты.Добавить("ИмяТабличнойЧасти.*"); // табличная часть объекта
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
В модуле формы документа в событии ПриСозданииНаСервере() должна быть инициализация.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ВерсионированиеОбъектов
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов
КонецПроцедуры
Шаг 5. Находим в основной конфигурации общую команду «ИсторияИзменений» и копируем в расширение. Именно копируем, а не заимствуем! В типе параметров команды указываем наши документы.
Шаг 6. Находим в основной конфигурации подписку на событие «Записать версию документа» и тоже копируем в расширение. В качестве источника указываем наш документ.
Шаг 7. Заимствуем в расширение форму «НастройкиХраненияИстории» регистра сведений «НастройкиВерсионированияОбъектов». Добавляем в расширение код, который будет выполняться после процедуры ЗаполнитьТипыОбъектовВДеревеЗначений(). Здесь смысл в том, чтобы дополнить типами объектов расширения массив типов.
Обратите внимание на те строчки, где стоит комментарий //ёё
Адаптируйте под свои названия эти строчки.
Модуль формы регистра сведений «НастройкиВерсионированияОбъектов»
&НаСервере
&После("ЗаполнитьТипыОбъектовВДеревеЗначений")
Процедура ВерсСО_ЗаполнитьТипыОбъектовВДеревеЗначений()
НастройкиВерсионирования = ТекущиеНастройкиВерсионирования();
ДеревоОМ = РеквизитФормыВЗначение("ДеревоОбъектовМетаданных");
// Тип параметра команды ИсторияИзменений содержит состав объектов для которых
// применяется версионирование.
МассивТипов = Метаданные.ОбщиеКоманды.ВерсСО_ИсторияИзменений.ТипПараметраКоманды.Типы(); //ёё
ЕстьБизнесПроцессы = Ложь;
ВсеСправочники = Справочники.ТипВсеСсылки();
ВсеДокументы = Документы.ТипВсеСсылки();
УзелСправочники = Неопределено;
УзелДокументы = Неопределено;
УзелБизнесПроцессы = Неопределено;
Для Каждого Тип Из МассивТипов Цикл
Если Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда
Продолжить;
КонецЕсли;
Если ВсеСправочники.СодержитТип(Тип) Тогда
Если УзелСправочники = НеОпределено Тогда
УзелСправочники = ДеревоОМ.Строки.Добавить();
УзелСправочники.СинонимНаименованияОбъекта = НСтр("ru = 'Справочники';
|en = 'Catalogs'");
УзелСправочники.КлассОбъекта = "01КлассСправочникиКорень";
УзелСправочники.КодКартинки = 2;
КонецЕсли;
НоваяСтрокаТаблицы = УзелСправочники.Строки.Добавить();
НоваяСтрокаТаблицы.КодКартинки = 19;
НоваяСтрокаТаблицы.КлассОбъекта = "КлассСправочники";
ИначеЕсли ВсеДокументы.СодержитТип(Тип) Тогда
Если УзелДокументы = НеОпределено Тогда
УзелДокументы = ДеревоОМ.Строки.Добавить();
УзелДокументы.СинонимНаименованияОбъекта = НСтр("ru = 'Документы';
|en = 'Documents'");
УзелДокументы.КлассОбъекта = "02КлассДокументыКорень";
УзелДокументы.КодКартинки = 3;
КонецЕсли;
НоваяСтрокаТаблицы = УзелДокументы.Строки.Добавить();
НоваяСтрокаТаблицы.КодКартинки = 20;
НоваяСтрокаТаблицы.КлассОбъекта = "КлассДокументы";
ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда
Если УзелБизнесПроцессы = Неопределено Тогда
УзелБизнесПроцессы = ДеревоОМ.Строки.Добавить();
УзелБизнесПроцессы.СинонимНаименованияОбъекта = НСтр("ru = 'Бизнес-процессы';
|en = 'Business processes'");
УзелБизнесПроцессы.КлассОбъекта = "03БизнесПроцессыКорень";
УзелБизнесПроцессы.ТипОбъекта = "БизнесПроцессы";
КонецЕсли;
НоваяСтрокаТаблицы = УзелБизнесПроцессы.Строки.Добавить();
НоваяСтрокаТаблицы.КлассОбъекта = "КлассБизнесПроцессы";
ЕстьБизнесПроцессы = Истина;
ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда
ИмяГруппы = "04ПланыСчетовКорень";
ПредставлениеГруппы = НСтр("ru = 'Планы счетов';
|en = 'Charts of accounts'");
ТипОбъектовГруппы = "ПланыСчетов";
Группа = ДеревоОМ.Строки.Найти(ИмяГруппы, "КлассОбъекта");
Если Группа = Неопределено Тогда
Группа = ДеревоОМ.Строки.Добавить();
Группа.СинонимНаименованияОбъекта = ПредставлениеГруппы;
Группа.КлассОбъекта = ИмяГруппы;
Группа.ТипОбъекта = ТипОбъектовГруппы;
КонецЕсли;
НоваяСтрокаТаблицы = Группа.Строки.Добавить();
НоваяСтрокаТаблицы.КлассОбъекта = "КлассПланыСчетов";
ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда
ИмяГруппы = "05ПланыВидовХарактеристикКорень";
ПредставлениеГруппы = НСтр("ru = 'Планы видов характеристик';
|en = 'Charts of characteristic types'");
ТипОбъектовГруппы = "ПланыВидовХарактеристик";
Группа = ДеревоОМ.Строки.Найти(ИмяГруппы, "КлассОбъекта");
Если Группа = Неопределено Тогда
Группа = ДеревоОМ.Строки.Добавить();
Группа.СинонимНаименованияОбъекта = ПредставлениеГруппы;
Группа.КлассОбъекта = ИмяГруппы;
Группа.ТипОбъекта = ТипОбъектовГруппы;
КонецЕсли;
НоваяСтрокаТаблицы = Группа.Строки.Добавить();
НоваяСтрокаТаблицы.КлассОбъекта = "КлассПланыВидовХарактеристик";
ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда
ИмяГруппы = "06ПланыВидовРасчетаКорень";
ПредставлениеГруппы = НСтр("ru = 'Планы видов расчета';
|en = 'Charts of calculation types'");
ТипОбъектовГруппы = "ПланыВидовРасчета";
Группа = ДеревоОМ.Строки.Найти(ИмяГруппы, "КлассОбъекта");
Если Группа = Неопределено Тогда
Группа = ДеревоОМ.Строки.Добавить();
Группа.СинонимНаименованияОбъекта = ПредставлениеГруппы;
Группа.КлассОбъекта = ИмяГруппы;
Группа.ТипОбъекта = ТипОбъектовГруппы;
КонецЕсли;
НоваяСтрокаТаблицы = Группа.Строки.Добавить();
НоваяСтрокаТаблицы.КлассОбъекта = "КлассПланыВидовРасчета";
КонецЕсли;
МетаданныеОбъекта = Метаданные.НайтиПоТипу(Тип);
НоваяСтрокаТаблицы.ТипОбъекта = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Тип);
НоваяСтрокаТаблицы.СинонимНаименованияОбъекта = МетаданныеОбъекта.Синоним;
НайденныеНастройки = НастройкиВерсионирования.НайтиСтроки(
Новый Структура("ТипОбъекта", ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Тип))
); //ёё
Если НайденныеНастройки.Количество() > 0 Тогда
НоваяСтрокаТаблицы.ВариантВерсионирования = НайденныеНастройки[0].ВариантВерсионирования;
НоваяСтрокаТаблицы.СрокХраненияВерсий = НайденныеНастройки[0].СрокХраненияВерсий;
Если Не ЗначениеЗаполнено(НайденныеНастройки[0].СрокХраненияВерсий) Тогда
НоваяСтрокаТаблицы.СрокХраненияВерсий = Перечисления.СрокиХраненияВерсий.Бессрочно;
КонецЕсли;
Иначе
НоваяСтрокаТаблицы.ВариантВерсионирования = Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать;
НоваяСтрокаТаблицы.СрокХраненияВерсий = Перечисления.СрокиХраненияВерсий.Бессрочно;
КонецЕсли;
Если НоваяСтрокаТаблицы.КлассОбъекта = "КлассДокументы" Тогда
НоваяСтрокаТаблицы.Проводится = ? (МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить, Истина, Ложь);
КонецЕсли;
КонецЦикла;
ДеревоОМ.Строки.Сортировать("КлассОбъекта");
Для Каждого УзелВерхнегоУровня Из ДеревоОМ.Строки Цикл
УзелВерхнегоУровня.Строки.Сортировать("СинонимНаименованияОбъекта");
КонецЦикла;
ЗначениеВРеквизитФормы(ДеревоОМ, "ДеревоОбъектовМетаданных");
КонецПроцедуры
Шаг 8. Заимствуем в расширение функцию общего модуля ОбщегоНазначения.ИдентификаторОбъектаМетаданных() и немного дорабатываем.
ОбщегоНазначения.ИдентификаторОбъектаМетаданных()
&ИзменениеИКонтроль("ИдентификаторОбъектаМетаданных")
Функция ВерсСО_ИдентификаторОбъектаМетаданных(ОписаниеОбъектаМетаданных, ВызыватьИсключение)
#Вставка
Если ТипЗнч(ОписаниеОбъектаМетаданных) = Тип("Строка") Тогда
ИдентификаторРасширения = Справочники.ИдентификаторыОбъектовРасширений.НайтиПоНаименованию(ОписаниеОбъектаМетаданных, Истина);
Если ЗначениеЗаполнено(ИдентификаторРасширения) Тогда
Возврат ИдентификаторРасширения;
КонецЕсли;
КонецЕсли;
#КонецВставки
Возврат Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторОбъектаМетаданных(
ОписаниеОбъектаМетаданных, ВызыватьИсключение);
КонецФункции
Шаг 9. Запускаем программу в режиме 1С:Предприятие. Заходим в «НСИ и администрирование» - «Администрирование» - «Общие настройки» - «История изменений» - «Настроить»
Там наш документ будет находиться в отдельной группе «Документы», обособленно от документов основной конфигурации.
Шаг 10. Тестируем и наслаждаемся результатом
Используемые статьи и идеи
Требования к ПО
Предложенное расширение протестировано на платформе 1С:Предприятие 8.3.20.1710
Конфигурация, на основе которой было создано расширение: 1С:ERP Управление предприятием 2 (2.5.8.171)