Небольшой теоретический экскурс
История данных - специальный механизм, который позволяет хранить в базе данных версии объектов конфигурации, упорядоченные по времени. Другими словами это типовой механизм для версионирования данных. Базовая информация о нём есть в интернете и на ИТС, поэтому в данной статье я напишу то, что касается стандартных форм.
Для механизма разработаны 3 общие типовые формы:
ФормаИсторииИзмененийИсторииДанных
– это та форма, которая показывает список версий данных, она открывается при вызове команды История изменений;ФормаДанныхВерсииИсторииДанных
– это та форма, которая показывает отчёт о данных версии, она открывается из формы истории изменений;ФормаРазличийВерсийИсторииДанных
– это та форма, которая показывает отчёт о различиях между версиями, она также открывается из формы истории изменений.
У объектов, у которых включена история изменений, так есть возможность их переопределения форм в Конфигураторе:
- Основная форма истории изменений истории данных
- Основная форма данных версии истории данных
- Основная форма различий версий истории данных
Программно с общими формами можно работать через типовые методы ПолучитьФорму
/ ОткрытьФорму
ОткрытьФорму("ФормаДанныхВерсииИсторииДанных", ПараметрыФормы)
ОткрытьФорму("ФормаИсторииИзмененийИсторииДанных", ПараметрыФормы)
ОткрытьФорму("ФормаРазличийВерсийИсторииДанных", ПараметрыФормы)
При программной работе с данными формами требуется обязательно передавать параметры формы, иначе открытие формы не сработает. Вот какие параметры нужны для каждой из форм я и напишу далее.
Небольшой лайфхак! Стандартные формы можно сохранить из конфигурации для просмотра и анализ кода обработчиков, н-р: для анализа ПриСозданииНаСервере
. Делается это командой:
ПутьКФорме = "v8res://mngbase/DataHistoryVersionDataRuForm.lf";
ПутьНаДиске = "c:/temp/DataHistoryVersionDataRuForm.lf";
КопироватьФайл(ПутьКФорме, ПутьНаДиске);
Имена форм истории:
ФормаИсторииИзмененийИсторииДанных
– DataHistoryChangeHistoryRuForm.lfФормаДанныхВерсииИсторииДанных
– DataHistoryVersionDataRuForm.lfФормаРазличийВерсийИсторииДанных
– DataHistoryVersionDifferencesRuForm.lf
Тестовый случай
Есть конфигурация, в которой создан справочник "Номенклатура", создан регистр сведений "ЦеныНоменклатуры" (измерение "Номенклатура", Ресурс "цена") и для регистра включена история. Попробуем для одной из записей открыть все упомянутые выше формы. Все работы ведутся на версии платформы 8.3.20.1613.
Открытие формы ФормаИсторииИзмененийИсторииДанных
Тут всё просто. В параметры формы необходимо передать 1 параметр - "Данные", в котором будет либо ссылка на объект, либо ключ записи для регистра сведений.
&НаКлиенте
Процедура История(Команда)
ПараметрыФормы = ПолучитьПараметрыФормыДляОткрытия_ФормаИсторииИзмененийИсторииДанных();
ОткрытьФорму("ФормаИсторииИзмененийИсторииДанных", ПараметрыФормы);
КонецПроцедуры
&НаСервере
Функция ПолучитьПараметрыФормыДляОткрытия_ФормаИсторииИзмененийИсторииДанных()
КлючЗаписи = ПодготовитьТестовыйКлючЗаписи();
ПараметрыФормы = Новый Структура("Данные", КлючЗаписи);
Возврат ПараметрыФормы;
КонецФункции
&НаСервере
Функция ПодготовитьТестовыйКлючЗаписи()
ПараметрыКлючаЗаписи = новый Структура;
ПараметрыКлючаЗаписи.Вставить("Период", Дата(2022, 7, 5));
ПараметрыКлючаЗаписи.Вставить("Номенклатура", Справочники.Номенклатура._ТестоваяНоменклатура);
КлючЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьКлючЗаписи(ПараметрыКлючаЗаписи);
Возврат КлючЗаписи;
КонецФункции
Открытие формы ФормаДанныхВерсииИсторииДанных
Тут уже сложнее. Требуется передать как 2 параметра: - "Данные" и "НомерВерсии". Естественно номер версии требуется откуда-то перед этим узнать. Если передать номер версии удалённого объекта - платформа выдаст ошибку.
&НаКлиенте
Процедура ИсторииВерсии(Команда)
ПараметрыФормы = ПолучитьПараметрыФормыДляОткрытия_ФормаДанныхВерсииИсторииДанных();
ОткрытьФорму("ФормаДанныхВерсииИсторииДанных", ПараметрыФормы);
КонецПроцедуры
&НаСервере
Функция ПолучитьПараметрыФормыДляОткрытия_ФормаДанныхВерсииИсторииДанных()
КлючЗаписи = ПодготовитьТестовыйКлючЗаписи();
ТестовыйНомер = 2;
ПараметрыФормы = Новый Структура("Данные, НомерВерсии", КлючЗаписи, ТестовыйНомер);
Возврат ПараметрыФормы;
КонецФункции
Открытие формы ФормаРазличийВерсийИсторииДанных
Можно передать как 3 параметра: - "Данные", "НомерВерсииДоИзменения", "НомерВерсииПослеИзменения", тогда программа откроет окно сравнения версий. Если передать номер версии удалённого объекта - платформа выдаст ошибку.
&НаКлиенте
Процедура СравениеВерсий(Команда)
ПараметрыФормы = ПолучитьПараметрыФормыДляОткрытия_ФормаРазличийВерсийИсторииДанных();
ОткрытьФорму("ФормаРазличийВерсийИсторииДанных", ПараметрыФормы);
КонецПроцедуры
&НаСервере
Функция ПолучитьПараметрыФормыДляОткрытия_ФормаРазличийВерсийИсторииДанных()
КлючЗаписи = ПодготовитьТестовыйКлючЗаписи();
ТестовыйНомерДо = 2;
ТестовыйНомерПосле = 4;
ПараметрыФормы = Новый Структура("Данные, НомерВерсииДоИзменения, НомерВерсииПослеИзменения",
КлючЗаписи, ТестовыйНомерДо, ТестовыйНомерПосле);
Возврат ПараметрыФормы;
КонецФункции
На этом я и закончу сей рассказ. Спасибо за внимание.
П.С. К статье прилеплена cf, в которой воспроизведён тестовый пример со всем вышеуказанным кодом, ничего сверх этого там нет, поэтому для скачивания она не обязательна.
Источники, которые помогли разобраться с вопросом: