Имя: Пароль:
1C
1С v8
Отслеживать изменения в регистрах сведений
0 DCKiller
 
07.11.11
07:52
Задача следующая: необходимо реализовать что-то наподобие системы продвинутого контроля изменений пользователем значений независимых регистров сведений. Т.е. в истории должна фиксироваться информация о том, кто, когда и что изменил в регистре. Для фиксации этих действий будет предназначен в свою очередь спец. регистр сведений, сама фиксация изменений осуществляется по подписке на событие "ПроверкаЗаполнения".

Проблема состоит в следующем: если пользователь что-либо меняет в записи регистра сведений, то как это отследить? Как при записи в историю изменений регистра определить, к какой именно записи регистра из зафиксированных в истории это изменение относится. По сути, речь идет о чем-то вроде УИДа для записей регистров сведений, по которому мы с этими записями при фиксации изменений в них в историю будем обращаться, но как реализовать такое решение? Создавать в каждом регистре сведений, чью историю изменений планируется фиксировать, отдельное измерение для хранения этого УИДа, слишком геморно. Есть еще варианты?
1 IamAlexy
 
07.11.11
07:55
в форме записи события нет типа призаписи?
2 Wobland
 
07.11.11
07:57
(1) а если без формы?
3 Wobland
 
07.11.11
07:57
в модуле набора записей есть событие
4 DCKiller
 
07.11.11
07:58
(1) Есть, но "Проверказаполнения" мне здесь больше подходит. Собственно, суть не в этом, потому что вид события, при котором это должно происходить, поставленной проблемы не решает.
5 DCKiller
 
07.11.11
07:59
(3) Какое событие?
6 IamAlexy
 
07.11.11
08:00
(4) сделай свою форму редактирования записи.
в форме сделай свою кнопку сохранения
на кнопку повесь что угодно.. проверки, регистрирование в подсистеме версионирования..
затем после всех проверок и регистраций пиши в базу..

в чем проблема?
7 smitru
 
07.11.11
08:04
(0) А может задуматься над сутью задачи???? Какой смысл городить у НЕобъектных данных тот функционал, который есть у объектных???
8 DCKiller
 
07.11.11
08:08
(6) Я, кажется, не совсем ясно выразил свой вопрос...
Видишь ли, проблема как раз в "проверки, регистрирование в подсистеме версионирования.." и т.д. Как организовать эту проверку? Допустим, у нас есть регистр сведений "История", следующего состава:

Измерения:

ОбъектБазы - собственно наименование регистра сведений, изменения записей которого фиксируются
Пользователь - кто изменил
Период - момент изменения
ПолеРегистра - измерение/ресурс/реквизит регистра

Ресурсы:

Значение - новое значение поля регистра

Понятно, что пользователь может изменить сразу несколько записей регистра. И как определить, какая именно запись была изменена?

(7) Смысл тот, что нужно фиксировать таким образом историю изменений записей регистров.
9 Wobland
 
07.11.11
08:10
(5) ПриЗаписи событие. попадаешь туда, и делаешь, что надо. пост 8 не читал
10 Starhan
 
07.11.11
08:11
а пример, что считать изменением? например только изменение рессурса или добавление записей по одонму из измерений.?
11 DCKiller
 
07.11.11
08:15
(9) Зря не читал. Там вся проблема изложена. Ищо раз.
(10) Изменение полей существующей записи, добавление новой записи, удаление записи. Ну понятное дело, что для вида изменений можно создать доп. измерение в регистре истории, куда заносить информацию о том, что это было: добавление, удаление или изменение записи.
12 Starhan
 
07.11.11
08:21
а регистр 1, несколько или любой. И откуда есть возможность его менять (из каких форм)?

гм Подписка на событие перед записью и по каждой строке проверка. Есть запись, нет записи с каикими ресурсами запись.
13 catena
 
07.11.11
08:24
(9)Проблема не в самой регистрации изменений, а в идентификации измененной записи. При изменении эл-та справочника, например, можно по УИД определить, что меняли. А в независимом РС нет.
14 Starhan
 
07.11.11
08:28
(12)+ или при записи (не помню старые данные еще в базе или нет.) Потомучто перед записью может быть отказ. У тебя будет информация что юзер изменил регистр а на самом деле нет.

(13) А я так понял, что требуется именно понять изменили или нет. А сравнить текущее значение в наборе и старое значение в ресурсе по тем же измерениям - не проблема.

что значит понять по уид что меняли? ) при изменении поля в справочнике у него меняется УИД? )))
15 DCKiller
 
07.11.11
08:29
(12) Регистров несколько. Изменения м.б. как непосредственно из формы списка, так и из тех форм, где размещена таблица, имеющая тип РегистрСведенийСписок.<ЭтотРегистр>.
С подпиской на событие я уже разобрался. См. (13), там проблема объяснена.
(13) Именно так! В этом и есть проблема.
16 Starhan
 
07.11.11
08:30
(15) я ж те уже сказал по каждой строке в наборе записей ищешь по тем же измерениям строчку в регистре и сам определяешь изменеине.
17 Starhan
 
07.11.11
08:31
нормлаьно будет работать если там не 100 строк сразу меняют (в друг обраоткой есть какое то массовое заполнение)
18 DCKiller
 
07.11.11
08:31
(15) Позже увидел :) А в каком событии получить набор записей до изменения? ПередЗаписью? Или лучше "проверка заполнения"?
19 Мимохожий Однако
 
07.11.11
08:36
Посмотри версионирование в БСП.
20 Starhan
 
07.11.11
08:36
пкеред записью точно получишь и набор и старые данные еещ в базе будут, но есть проблема описанная в (14). Остальное надо проверять, не пробовал :)
21 Мимохожий Однако
 
07.11.11
08:42
Проще дать запрет на изменение безответственным пользователям, чем городить регистрацию их действий.
22 DCKiller
 
07.11.11
09:04
(16) Не катит. ПередЗаписью, если какое-то значение в записи уже меняли, он возвращает запись с этим новым значением :(
23 Reset
 
07.11.11
10:11
(22)
"Возникает перед выполнением записи набора регистра сведений. Процедура-обработчик вызывается после начала транзакции записи, но **до начала записи набора** регистра сведений"

Обманывают?
24 DCKiller
 
07.11.11
11:46
(23) Мля, у меня в событии ПередЗаписью параметр "Объект" содержит уже измененные значения полей!
25 Reset
 
07.11.11
11:59
(24) У тебя каша в голове. Разумеется, объект содержит подготовленные к записи значения. Ты как раз и собираешься сравнивать их (новые) с существующими (еще не измененными).
26 Alex375
 
07.11.11
12:08
Вопрос: а как же получить исходные записи, которые были предоставлены пользователю для редактирования? :)
27 DCKiller
 
07.11.11
12:11
(25) То есть чтобы получить старые значения, нужно создать другой набор записи с фильтром по измерениям нового отбора, и ттолько так сравнивать?

(26) наверно так? (см. выше)
28 Alex375
 
07.11.11
12:15
(27) это при условии что у тебя был изначально отбор. А если такого отбора не было? Брать весь регистр, что-ли? Тоже не вариант, так как в это время другие могли уже поменять значения.
29 DCKiller
 
07.11.11
12:32
(28) Ну тогда как? Повторяю, Объект содержит уже измененные поля записи регистра.
30 DCKiller
 
07.11.11
12:54
(28) Странно, отбор по измерениям вроде есть в любом случае.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс