Имя: Пароль:
1C
1С v8
Регистрация изменений объектов быстро и ненакладно.
0 Torquader
 
14.03.13
00:02
Сегодня случайно обнаружил в одной базе включение регистрации изменений объектов - пользователи включили, чтобы знать, кто и что поменял.
Реализация этого "чуда" была сделана через периодический регистр сведений, где измерения "Пользователь,Компьютер,Объект", а ресурсом была строка неограниченной длины, куда впихнули XML-сериализацию изменяемого объекта.
Наверное, не надо рассказывать, что база пухла прямо-таки на глазах и выгрузка базы перестала загружаться в файловый вариант.
(Почему, думаю, объяснять не надо - попытка проведения документа с контролем остатков приводила к тому, что один документ записывали несколько раз - и на разных компьютерах).

Это история (грустная) - сейчас это "чудо" отключили.

Вопрос, я думаю, известный, но как-то быстро не ищется - как наиболее удачно сделать регистрацию изменений объектов, чтобы не превращала базу в помойку, ну и работала в SQL-варианте, а также позволяла в том же SQL поднять копию базы (и не перепутать изменения).

Заранее благодарен за ссылки.
P.S. чего-то мне уже не нравится эта восьмёрка, которая даже регистр вычистить быстро не может.
Удачи.
1 shuhard
 
14.03.13
00:03
(0) это не чудо
это типовое версионирование от УПП/КА
2 rotting
 
14.03.13
00:07
типовое решение, чем не устраивает то?
3 rotting
 
14.03.13
00:09
P.S. восьмерка сырая еще, рано на не переходить
4 Конфигуратор1с
 
14.03.13
00:13
(0) На инфостарте куча вариантов реализации истории, где хранится только изменение реквизитов, а не все объекты. Правда там тоже есть отдельные нюансы.
5 Torquader
 
14.03.13
00:14
(1) Почему нужно писать в XML весь документ (со всеми табличными частями), а не только изменяемые реквизиты, а подный объект записывать раз в день или при каком-то определённом накопленном количестве измерений.
И потом - регистр сведений - это вещь индексируемая (там ещё и полнотекстовый поиск включён), а данные изменения маловероятно, что кому-то нужны в таком виде.
Поэтому и возник вопрос - зачем это в базе (500 гигов мусора).
6 Конфигуратор1с
 
14.03.13
00:15
7 Torquader
 
14.03.13
00:16
(4) У меня в семёрке всё пишется в обычный журнал регистрации, и только изменения - и получается, что много места, но такого торможения, как в восьмёрке нету.

И З_А_Ч_Е_М писать документ, если в нём вообще ничего, кроме времени записи не поменялось ? Можно же вообще сделать регламентное задание, которое просто будет писать мусор в базу - и то нагрузки на систему будет меньше - регистр-то ещё и на блокировки напарывается.
8 Конфигуратор1с
 
14.03.13
00:20
(7) Я же говорю - есть такие подсистемы на инфостарте. Я видел нетленку с такой подсистемой, там записывается документ только при создании и потом только новые реквизиты. Но есть там минус - сортировку таб.части воспринимает как изменение документа и пишет все строки. А так - чудненькая вещь
9 Torquader
 
14.03.13
00:22
(8) Как писать, и что писать, понятно - меня интересует вопрос - куда ?
Регистр сведений, как-то не очень хорошее место для записи того, что нужно достаточно редко.
10 Конфигуратор1с
 
14.03.13
00:31
(9) Почему? По моему самое оно. Хотя если у вас не распределенка, то я за внешнюю базу. Правда это гемморойно
11 shuhard
 
14.03.13
00:46
(9) место то самое
то, что перед записью не проверяется модифицированность объекта - фича
12 Sammo
 
14.03.13
04:02
Речь таки про регистрацию изменений (фиксацию факта изменения рбъекта) или про версионирование (фиксацию факта того кто, когда и что изменил)?
13 PLUT
 
14.03.13
06:19
(0) регистры в 8-ке чистятся очень быстро. в регистрах нет метода удалить  :) есть только записать
14 Рэйв
 
14.03.13
06:47
15 Web00001
 
14.03.13
06:54
Судя по описанию в (0) речь таки про версионирование, но какие то ужасы рассказывает ТС 500гигов, действительно много.
Я писал свое версионирование, храню в справочнике(хотя по умному надо в регистре, но мне так удобнее), только измененные значения. В справочнике, потому что специфика требовала, что бы запись каждого объекта была целой(то есть надо видеть что было изменено именно в этот момент, кто сколько чего), вариант в (14) тоже интересный, только абсодютно бесполезен если надо запросом выбрать какие были изменения по пользователю, в каких изменениях мелькала номеннклатура и тд, вообще обработка, почти невозможна или будет слишком сложно (разварачивать каждый объект что бы узнать есть ли там нужные данные, про запросы вообще забыть) .
16 Torquader
 
14.03.13
13:55
(15) Там ничего страшного-то не было. Включили версионирование, которое в регистр пишет весь объект.
Потом обменом переносили из одной базы в другую, если что-то шло не так, то удаляли и переносили снова.
А потом - база стала очень большой и неповоротливой.
Если в регистре хранить сам факт изменения, то это так много места не займёт.
Если хранить строку переменной длины, то для SQL это поле BLOB, которое, насколько я помню, с 2048 байт начинается (или какой там размер сегмента поставили).
Вопрос первый - зачем все версии всех объектов в одном регистре сведений - про сбор всех фактов изменения в одном регистре я ничего плохого не говорю, но сами изменения нужно хранить отдельно.

(15) Что касается хранения данных внутри самого объекта - это смертельный случай, так как при любом получении объекта из базы мы загрузим в память всю эту кучу - вопрос - а оно нам надо.

P.S. продолжаем обсуждение - решений много.
Но у меня ещё один вопрос - насколько часто бывает нужна это "чудесная" запись изменений, и насколько в ней востребована возможность быстрого поиска по объектам и реквизитам.
Например, если мы пишем все изменения в текстовый файл, то поиск строки GUID в этом файле через RegExpt будет не такой уж затратный, а запись - плюнул и забыл.
Удачи.
17 Лефмихалыч
 
14.03.13
13:58
(0) надо нормально спроектировать профили пользователей и не давать лишних прав, тогда и необходимости такой не будет.
В теории.
18 kotletka
 
14.03.13
14:05
берешь настраиваешь на типовой обмен и выгружаешь данные по нему, в результате с этого момента у тебя начинает работать стандартный метод регистрации объектов для обмена (немного правда допилить придется в плане кто менял, но это недолго)
19 Web00001
 
14.03.13
14:27
>>Например, если мы пишем все изменения в текстовый файл, то поиск строки GUID в этом файле через RegExpt будет не такой уж затратный, а запись - плюнул и забыл.
Надо выбрать все изменения по объекту? Считай ВЕСЬ файлик  метров на 200-300(вариант хранить для каждого объекта метаданных свой файлик). Как определить какая именно номенклатура была в табличной части? Та которая сейчас с таким названием или та которую потом переименовали?
20 Torquader
 
14.03.13
15:23
(18) Обмен регистрирует факт изменения объекта в определённый момент времени (в промежутке между обменами), но не фиксирует сделанных изменений.
(17) Вопрос в том, что пользователь должен иметь возможность править документы и вводить их (а иначе вообще зачем нужны пользователи) просто иногда пользователь может сделать что-то не так, тогда нужно ему объяснить, что он был не прав.
(19) Вопрос в том, что если это нужно один раз в неделю, то пофиг, сколько будет жеваться файл - мы получим ответ, а вот писаться файл будет гораздо быстрее, чем регистр.
И, если кто-то переименовал номенклатуру, то для системы документ не поменялся - поменялась номенклатура, и то, что на печати было одно, а будет другое - это вопрос проектирования системы, где допускается переименование товаров.
21 Web00001
 
14.03.13
16:01
(24)Хотя да если хранить гуид вместо наименования, вопрос решится.
22 Жан Пердежон
 
14.03.13
16:15
в БСП версионированию 100 лет в обед уже;
принцип примерно тот же: в ресурсе РС хранилище значения с пожатым бинарным xml (fastinfoset).
23 Конфигуратор1с
 
14.03.13
17:56
(20) " мы получим ответ, а вот писаться файл будет гораздо быстрее, чем регистр.  " разница если и есть то очень незаметная
24 Конфигуратор1с
 
14.03.13
17:57
(20) тем более чем больше файл тем дольше будет пистаься. чего не скажешь о регистре.
25 Torquader
 
14.03.13
18:02
(24) В регистр пишется очень быстро, а вот строки неограниченной длины или двоичные данные - они пишутся одинаково медленно.
Если файл писать последовательно (командной дозаписи), то от размера файла вообще ничего не зависит - от размера зависит только поиск. Только вот 1С не умеет писать в режиме дозаписи.
С хранилищем должно быть проще, но придётся хранить все изменения одного объекта в одном хранилище, а в регистре писать только факт изменения, ну и какие реквизиты менялись.
P.S. просто, данные об изменениях нужны в течении какого-то периода - потом их можно удалять - регистр придётся чистить, а если у нас файл, то их должно быть несколько - и менять каждый день, чтобы не вырезать кусок.
26 YF
 
14.03.13
18:05
...
27 Torquader
 
14.03.13
19:40
(23) В общем, подумали и решили, что писаться в базе будет в регистр, но не всё, а только изменения.
И будет процесс (фоновый и ночью), который этот регистр будет "укладывать" в другую базу, где будет жить история изменений.
При создании рабочей копии базы мы максимум запишем в регистр только один день, а если кому-то нужно будет выявить историю, то будет подключаться к другой базе, в режиме только чтения и смотреть, что и кто делал.
Потом базу истории можно рассматривать как BackUp.
Идея файла, отдельной sql-базы или хранения в текущей базе отпадает, так как у нас несколько пользователей, и не хочется делать несколько файлов или несколько соединений к базе истории.
Что вы думаете по этому поводу ?
28 Web00001
 
15.03.13
03:51
>>или хранения в текущей базе отпадает
эта идея почему отпадает?
(27)>>Что вы думаете по этому поводу ?
Очень много написать придется, особенно что бы реализовать:
>>Потом базу истории можно рассматривать как BackUp.
При таких объемах я бы заморочился созданием правил и выгрузкой изменений через РИБ(именно изменений). И не хранил бы историю в базе вообще.
29 shuhard
 
15.03.13
07:15
(27)[Что вы думаете по этому поводу]
не удачный вариант
любое хранение версий вне базы порочно и бессмысленно
30 Torquader
 
15.03.13
19:28
(28) Пока делается ежедневный BackUp sql, который прекрасно разворачивается обратно (когда нужна тестовая база - быстрее его развернуть).
Потом, основная задача - видеть кто и что поменял, в случае обмена данными мы видим только общие изменения за какой-то период или придётся очень часто вызывать обмен.

(29) Хранение изменений в самой базе очень сильно увеличивает размер базы, что сказывается на времени резервного копирования. Основная цель вынесения регистрации изменений в отдельное место - это снижение нагрузки на основную базу и уменьшение её объёма.

Кроме того, регистрация изменений - это классический пример очереди, когда запись идёт в конец, а стирание должно идти сначала.

Отдельно обсуждается вопрос регистрации изменений документов только после первого проведения - пока документ не проведён, это заготовка, в которую вводят данные и никакого смысла в регистрации изменений в нём нет.

Также бессмысленно регистрировать изменения в объектах, которые создаются и заменяются обработками, так как в этом случае заранее известно, что будет в результате.

P.S. стереть регистр в лоб не получилось - памяти не хватило, зато работа с регистром на уровне выбора записи и анализ затрат процессорного времени показал, что на самом деле никаких проблем в поиске нет - тупит система только в случае выборки всего набора записей (их просто очень много), а отборы по объекту работают достаточно сносно.
Индексы делают своё дело.
Но, оказалось, что никто и не разу в этот регистр не заглядывал - посему он не очень-то и нужен.
31 catena
 
15.03.13
19:41
У меня логирование законодательно обязательно. Рассматривали варианты, остановились на какой-то разработке (наверное с инфостарта) на справочниках. Удобный поиск, удобно организовывать защиту. Хранит только измененные реквизиты. Допилила логирование только изменений и логирование независимых регистров. С 4 марта запустили, в начале апреля буду замерять, на сколько пухнет база.
32 Torquader
 
15.03.13
19:58
(31) Так в ЗУП-е оно должно быть, так как есть закон о персональных данных (а там данные работников).
Что касается управленческих баз, то там персональных данных нет, так как ФИО работника и его рабочий телефон не являются персональными данными.
Другое дело, что у нас была обработка, которая чистит ПрайсЛист и создаёт новый, а "умная" система логирования это всё записывает (вполне понятно, что достаточно было бы зафиксировать только факт очистки Прайс-Листа).