Сравниваются два состояния одной настоящей учебной карточки, включая её собственную табличную часть.
Где и как запускать
Сервер своей учебной обработки; чтение только истории УчебныеКарточкиИстории.
Подготовка
Только собственная отдельная учебная база. Создайте Справочники → УчебныеКарточкиИстории. Справочник: код Строка 10, наименование 100, реквизит КомментарийИстории Строка 100. Вручную создайте Книгу, затем измените собственный комментарий.
У этого своего объекта включите ИсторияДанных; у дополнительного поля КомментарийИстории, если оно используется, также включите участие в истории. Подготовьте две версии только собственных данных; включение флага само не создаёт задним числом версии.
Дождитесь штатного обновления своей истории. Для ручного обновления выбирайте конкретные свои данные / свои метаданные и не вызывайте бесконтрольное ОбновитьИсторию() без отбора в рабочей базе.
В своём справочнике УчебныеКарточкиИстории добавьте табличную часть СтрокиКниг: КодКниги Строка 20 и Количество Число 10.0. Включите участие табличной части и полей в истории до создания учебных версий.
Для первой версии одной новой своей карточки вручную заполните A=1, B=2, C=3, D=4. Во второй версии измените количество A, уберите B, перенесите D вверх и добавьте E. Дождитесь штатной записи истории именно этих двух версий.
Основной блок — тело серверной процедуры своей обработки. Дополнительную функцию разместите на верхнем уровне того же серверного модуля; она выбирает две настоящие версии одной собственной карточки. Для чистого опыта в этом учебном справочнике используйте одну карточку.
Пример только читает уже существующую историю. Удаление строки табличной части не означает удаления самой карточки. Ничего не записывайте программно ради демонстрации.
ДанныеИстории = ПолучитьПаруУчебныхВерсий();
Различия = ИсторияДанных.ПолучитьРазличияВерсий(ДанныеИстории.Данные,
ДанныеИстории.ПослеИзменения, ДанныеИстории.ДоИзменения);
Если Различия = Неопределено Тогда
Сообщить("После изменения объект удалён; сравнение строк недоступно");
Возврат;
КонецЕсли;
Если Не Различия.Свойство("СтрокиКниг", ИзмененияСтрок) Тогда
Сообщить("В выбранной паре нет изменений собственной табличной части");
Возврат;
КонецЕсли;
Найдено = 0;
Для Каждого Изменение Из ИзмененияСтрок Цикл
Если Изменение.ВидИзмененияСтрокиДанных = ВидИзмененияСтрокиДанных.Добавление Тогда
Найдено = Найдено + 1;
Сообщить("До: " + Строка(Изменение.НомерСтрокиВВерсииДоИзменения)
+ "; после: " + Строка(Изменение.НомерСтрокиВВерсииПослеИзменения));
КонецЕсли;
КонецЦикла;
Сообщить("Записей различий вида Добавление: " + Строка(Найдено));Тот же серверный модуль: выбрать две настоящие версии
Функция ПолучитьПаруУчебныхВерсий()
Отбор = Новый Структура("Метаданные", Метаданные.Справочники.УчебныеКарточкиИстории);
ПерваяВыборка = ИсторияДанных.ВыбратьВерсии(Отбор, "Данные,НомерВерсии", "НомерВерсии Возр", 1);
Если ПерваяВыборка.Количество() = 0 Тогда
ВызватьИсключение "Подготовьте историю собственных данных по инструкции";
КонецЕсли;
Данные = ПерваяВыборка[0].Данные;
ОтборДанных = Новый Структура("Данные", Данные);
Версии = ИсторияДанных.ВыбратьВерсии(ОтборДанных, "НомерВерсии", "НомерВерсии Возр", 2);
Если Версии.Количество() < 2 Тогда
ВызватьИсключение "Для одного своего объекта нужны две реальные версии";
КонецЕсли;
Возврат Новый Структура("Данные,ДоИзменения,ПослеИзменения", Данные, Версии[0].НомерВерсии, Версии[1].НомерВерсии);
КонецФункцииРазбор по шагам
Подготовьте две реальные версии своей карточки с указанными строками.
Получите различия выбранной пары версий.
Отберите записи массива по настоящему виду изменения строки.
Как проверить результат
ВидИзмененияСтрокиДанных берётся из фиксированных структур, возвращённых ПолучитьРазличияВерсий, а не из искусственно созданного массива.
Номера до / после относятся к разным состояниям. Для Добавление и Удаление позиция служит ориентиром; перестановки могут менять номера соседних строк. Номера не являются постоянными идентификаторами книги.
Нулевая выборка честно означает отсутствие данного вида в этой паре. Записи различий могут описывать несколько строк через КоличествоИзмененныхСтрок; счётчик примера считает записи массива, а не физические строки.
Ожидаемый результат
Есть собственная схема, реальные версии и типизированный результат сравнения без записи истории.
На что обратить внимание
Не заменяйте отсутствующую историю самодельными фиксированными структурами.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.