Имя: Пароль:
1C
1С v8
Интересная задача по определению разницы двух табличных частей
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
Надо будет плотнее посмотреть на реализацию версионирования в УПП.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.