|
Интересная задача по определению разницы двух табличных частей | ☑ | ||
---|---|---|---|---|
0
Diversus
21.10.11
✎
10:43
|
Пишу подсистему типа http://infostart.ru/public/18588/ (Бизнес-Плюс:Журнал изменений)
Опишу сначала работу, т.к. не понятно будет если вопрос задам сразу. Вся история хранится во внешней БД SQL Server. Наткнулся на следующую проблему и никак не могу нормально ее решить. В базе делаются изменения, каждый раз в БД помещается полный образ объекта (все реквизиты, все элементы всех табличных частей), регламентное задание запускается один раз в 10 минут и производит "сжатие" объектов, т.е. удаляет реквизиты которые не изменились по сравнению с предыдущей версией, тем самым уменьшая размер хранимых данных. Вот для затравки. http://s017.radikal.ru/i405/1110/b3/eea523188ee6.jpg http://s017.radikal.ru/i422/1110/d5/a6f868962c41.jpg http://i011.radikal.ru/1110/56/7601f0de4850.jpg Но есть одна проблема - это сжатие объектов. Сейчас сжатие происходит криво в табличных частях, т.к. если скажем мы отсортировали табличную часть в справочнике, то по идее никаких изменений не произошло, но не мону придумать как это лучше сделать. Теперь о проблеме. Есть две таблицы значений следующей структуры: ТЧ = Новый ТаблицаЗначений; ТЧ.Колонки.Добавить("НомерСтроки"); ТЧ.Колонки.Добавить("ИмяТЧ"); ТЧ.Колонки.Добавить("ИмяРеквизита"); ТЧ.Колонки.Добавить("НомерСтрокиТЧ"); ТЧ.Колонки.Добавить("СтароеЗначение"); ТЧ.Колонки.Добавить("НовоеЗначение"); ТЧ.Колонки.Добавить("СтароеПредставление"); ТЧ.Колонки.Добавить("НовоеПредставление"); ТЧ.Колонки.Добавить("ТипРеквизита"); Для реквизитов ИмяТЧ пустая строка, НомерСтрокиТЧ равен нулю. Одна таблица содержит полный образ объекта до изменения, вторая, собственно, полный образ не сжатого измененного объекта (заполнены только НовоеЗначение и НовоеПредставление). Нужно найти разницу этих таблиц значений и выявить, что во второй было изменено и оставить только измененные строки, заполнить СтароеЗначение и СтароеПредставление. Предположим в справочниее отсортировали одну табличную часть и сохранили, по факту это не изменение объекта, должны получить пустую вторую таблицу значений. Вопрос как это лучше сделать? Кто нибудь решал что-то подобное. |
|||
1
mikecool
21.10.11
✎
10:45
|
ничего интересного
|
|||
2
butterbean
21.10.11
✎
10:45
|
запросом
|
|||
3
Asmody
21.10.11
✎
10:48
|
(0) а если не изобретать велосипед, воспользоваться встроенными возможностями журналирования изменений?
|
|||
4
Diversus
21.10.11
✎
10:48
|
(1) А сам то сможешь такое сделать?
|
|||
5
IamAlexy
21.10.11
✎
10:48
|
изобретать велосипеды влом..
версионирование рулит и заруливает - свою задачу вполняет на все 110% |
|||
6
Diversus
21.10.11
✎
10:48
|
(3) Моя подсистема показывает изменения вплоть до реквизита стандартный журнал регистрации этого не умеет делать
|
|||
7
IamAlexy
21.10.11
✎
10:49
|
(6) стандартная подсистема версионирования умеет.. и сжимает...
|
|||
8
IamAlexy
21.10.11
✎
10:49
|
(4) ага точно.. так их http://lurkmore.ru/images/9/9d/Dobeisa.jpeg
|
|||
9
Diversus
21.10.11
✎
10:50
|
(5) Преимущество в том, что изменения не хранятся в базе 1С, а во внешней SQL Server
Соответственно потом, если Вы захотите выгрузить ИБ и на файловой что то попробовать, то с этим версионированием это Вам вряд ли удастся так как в файловой ограничение на 4 Гб на одну таблицу |
|||
10
IamAlexy
21.10.11
✎
10:52
|
(9) версии принято чистить..
|
|||
11
Diversus
21.10.11
✎
10:54
|
(10) Согласен, но я все же сторонник хранения до упора :)
|
|||
12
IamAlexy
21.10.11
✎
10:55
|
(11) переделать штатную на запись во внешнюю базу - делов то...
|
|||
13
acsent
21.10.11
✎
10:57
|
(10) Зачем их чистить?
|
|||
14
IamAlexy
21.10.11
✎
10:58
|
(13) ну типа есть мнение что базу которую 100 пользователе задним числом каждый день переколбашивают и исправляют документы - типа там регистр с версиями типа будет в 100 гигобайт и все умрут
|
|||
15
hhhh
21.10.11
✎
10:58
|
(11) вообще-то по факту сортировка - это изменение объекта. И если ваше версионирование считает наоборот, то его надо сразу в топку.
|
|||
16
pumbaEO
21.10.11
✎
10:59
|
или даже сделать план обмена и выгружать только один регистр версии в одну сторону?
|
|||
17
Diversus
21.10.11
✎
11:00
|
(15) В элементе справочника сортировка в табличной части это изменение объекта? А что же изменилось? Порядок строк?
|
|||
18
pumbaEO
21.10.11
✎
11:01
|
(15) это изменение объекта! Вы же не знаете, может кто-то в своих суперских алгоритмах смотрит на номер строки и для этого убрал командную панель, убрал возможность сортировки?
|
|||
19
vmv
21.10.11
✎
11:01
|
в УПП общий модуль ОбщегоНазначенияСервер
может не нужно делать а самокат, а посмотреть примеры вызова этих методов // Функция возвращает результат вычитания элементов множества таблицы // ТаблицаВычитаемая из ТаблицаОсновная. // Функция ВычестьТаблицу(знач ТаблицаОсновная, знач ТаблицаВычитаемая, знач КолонкаСравненияОсновнойТаблицы = "", знач КолонкаСравненияВычитаемойТаблицы = "") Экспорт Если Не ЗначениеЗаполнено(КолонкаСравненияОсновнойТаблицы) Тогда КолонкаСравненияОсновнойТаблицы = "Значение"; КонецЕсли; Если Не ЗначениеЗаполнено(КолонкаСравненияВычитаемойТаблицы) Тогда КолонкаСравненияВычитаемойТаблицы = "Значение"; КонецЕсли; ТаблицаРезультат = Новый ТаблицаЗначений; ТаблицаРезультат = ТаблицаОсновная.Скопировать(); Для Каждого Элемент Из ТаблицаВычитаемая Цикл Значение = Элемент[КолонкаСравненияОсновнойТаблицы]; НайденнаяСтрока = ТаблицаРезультат.Найти(Значение, КолонкаСравненияОсновнойТаблицы); Если НайденнаяСтрока <> Неопределено Тогда ТаблицаРезультат.Удалить(НайденнаяСтрока); КонецЕсли; КонецЦикла; Возврат ТаблицаРезультат; КонецФункции // Функция возвращает таблицу созданную на основе ТаблицаИнициализации. // Если ТаблицаИнициализации не указана, то создается пустая таблица. // Функция СоздатьТаблицуСравнения(ТаблицаИнициализации = Неопределено, ИмяКолонкиСравнения = "Значение") Экспорт Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить(ИмяКолонкиСравнения); Если ТаблицаИнициализации <> Неопределено Тогда МассивЗначений = ТаблицаИнициализации.ВыгрузитьКолонку(ИмяКолонкиСравнения); Для Каждого Элемент Из ТаблицаИнициализации Цикл НоваяСтрока = Таблица.Добавить(); НоваяСтрока.Установить(0, Элемент[ИмяКолонкиСравнения]); КонецЦикла; КонецЕсли; Возврат Таблица; КонецФункции |
|||
20
Diversus
21.10.11
✎
11:03
|
(19) Спасибо
|
|||
21
Diversus
21.10.11
✎
11:04
|
Надо будет плотнее посмотреть на реализацию версионирования в УПП.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |