|
Прочитать старые значения реквизитов перед записью | ☑ | ||
---|---|---|---|---|
0
ramir
12.02.12
✎
13:06
|
Долго гуглил форум, но ответа так и не нашел. Хочу организовать отслеживание изменений в документах. В подписке на событие "ПриЗаписи" необходимо прочитать старые данные объекта, как это возможно?
|
|||
1
Рэйв
12.02.12
✎
13:09
|
Процедура ПередЗаписью.
Сравнивайт ЭтотОбъект и Ссылка. |
|||
2
Рэйв
12.02.12
✎
13:09
|
*Сравнивай.
|
|||
3
Рэйв
12.02.12
✎
13:09
|
+(1)В модуле объекта, не формы.
|
|||
4
zak555
12.02.12
✎
13:11
|
(1) где ещё не записанные данные ?
|
|||
5
Рэйв
12.02.12
✎
13:13
|
(4)Именно.Как раз можно сравнить со ссылкой
|
|||
6
zak555
12.02.12
✎
13:15
|
пля, муль в терминале отвалился =(
|
|||
7
zak555
12.02.12
✎
13:18
|
(5) я запутался : где хранится изменённый объект ?
|
|||
8
ramir
12.02.12
✎
13:26
|
Заголовок функции подписки выглядит так:
Процедура ПодпискаНаЗаписьОбъектовПриЗаписи(Источник, Отказ) Экспорт Я пробовал сравнивать значения реквизитов Источник[Реквизит] и Источник.Ссылка[Реквизит] - одно и то же. Только новые данные. Хотя отказаться от записи можно, значит старые данные еще не затерты. |
|||
9
Дикообразко
12.02.12
✎
13:27
|
в УПП уже готовый механизм есть..
лисапед? |
|||
10
Рэйв
12.02.12
✎
13:28
|
(8)Ты наверное совсем не читаешь , что тебе пишут,да?
Я это дело давным давно реализовал.Заипали меня приходы бухов с утверждениями "Это ваша программа не работает"...Я сделал запись истории на принципе выше указанном. После 2-3 раз приходить перестали |
|||
11
ramir
12.02.12
✎
13:32
|
(10) Я все внимательно прочитал. Документов много и не хочется создавать у каждого обработчик события. В первом сообщении явно указал, что делаю через подписку. Меня интересует, возможно ли это?
|
|||
12
Рэйв
12.02.12
✎
13:38
|
(11)>>не хочется создавать у каждого обработчик события.
Ну тогда ищи дальше ОПТИМАЛЬНОСТЬ. Сочувствую. |
|||
13
ramir
12.02.12
✎
13:43
|
(12)Надеюсь это искренне) Также создается ощущение, что Вы нашли в жизни оптимальный путь и в поисках его не нуждаетесь. А те, кто его ищет поступают неправильно?))
А вообще для меня более важна приспособленность конфигурации к изменениям, т.к. ни на день она не остается без изменений. |
|||
14
Рэйв
12.02.12
✎
13:48
|
(13)>>А те, кто его ищет поступают неправильно?))
Правильно конечно. Только полный идиотизм игнорировать советы тех, кто это все прошел много лет назад. |
|||
15
ramir
12.02.12
✎
13:51
|
(14)Много лет назад и 1Ска была другая. С Вами очень приятно разговаривать)
|
|||
16
H A D G E H O G s
12.02.12
✎
17:10
|
(15) Ты правда не читаешь, что тебе пишут.
В подписке ПриЗаписи() объект уже записался и значения Источник и Источник.Ссылка - одинаковые. В подписке ПЕРЕДЗаписью() объект ЕЩЕ не записался и значения Источник и Источник.Ссылка - разные. |
|||
17
zak555
12.02.12
✎
17:12
|
(16) Источник - это то, что "собирается" записаться ?
|
|||
18
Дикообразко
12.02.12
✎
17:24
|
(17) это указатель на объект в ОЗУ
|
|||
19
ramir
13.02.12
✎
13:47
|
(16) Да, в этом я не прав. В списке подписок не было события ПередЗаписью, т.к. указал не только документы. Поэтому понял, что речь идет не о подписках. Почему же тогда есть возможность отказаться от записи в подписке ПриЗаписи?
А вообще вернулся к исходному вопросу и надобность в старых данных пропала, т.к. они сохраняются при предыдущей записи. Спасибо за помощь. :) |
|||
20
Ненавижу 1С
гуру
13.02.12
✎
13:50
|
(19) >> Почему же тогда есть возможность отказаться от записи в подписке ПриЗаписи?
потому что транзакция! |
|||
21
Shurjk
13.02.12
✎
13:52
|
(3) В модуле формы тоже можно.
|
|||
22
fisher
13.02.12
✎
13:56
|
Эффективнее при открытии формы запоминать старые значения реквизитов, чем в БД при записи лезть.
|
|||
23
Shurjk
13.02.12
✎
14:04
|
(22) Интересное заявление - аргументировать можешь?
|
|||
24
fisher
13.02.12
✎
14:07
|
(23) Тю. Так аргументация уже в заявлении. Не будет лишних запросов к БД.
|
|||
25
Shurjk
13.02.12
✎
14:13
|
(24) Вообще то, документ уже и так в оперативной памяти его ведь уже прочитали один раз - зачем еще раз читать?
|
|||
26
fisher
13.02.12
✎
14:15
|
(25) Вот и я о том же.
|
|||
27
Shurjk
13.02.12
✎
14:18
|
(26) То есть при обращении Ссылка.Реквизит думаешь он будет заново перечитывать документ? Учитывая то что этот же экземпляр сам же его заблокировал?
|
|||
28
fisher
13.02.12
✎
14:25
|
(27) Ага.
|
|||
29
Shurjk
13.02.12
✎
14:26
|
(28) Как то совсем глупо - даже для 1с-ки выходит. По 8.1 помниться было так называемое динамическое чтение, а 8.2 даже не знаю как это делается.
|
|||
30
vde69
13.02.12
✎
14:27
|
примерно так:
Процедура ПередЗаписьюОбъектовСРолевымДоступомПередЗаписью(Источник, Отказ) Экспорт УстановитьПривилегированныйРежим(Истина); Если Источник.ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; ТипЗначенияИсточника = ТипЗнч(Источник); МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗначенияИсточника); Источник.ДополнительныеСвойства.Удалить("ОбновитьДоступ"); Если ТипЗначенияИсточника = Тип("СправочникОбъект.УправленческиеДокументы") Тогда ..... ..... ..... Если Запрос.Выполнить().Пустой() Тогда Источник.ДополнительныеСвойства.Вставить("ОбновитьДоступ", Истина); КонецЕсли; УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры Процедура ПриЗаписиОбъектовСРолевымДоступомПриЗаписи(Источник, Отказ) Экспорт ЗаписатьДоступОбъекта(Источник, Отказ); КонецПроцедуры Процедура ЗаписатьДоступОбъекта(Источник, Отказ) Экспорт УстановитьПривилегированныйРежим(Истина); Если Источник.ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; ОбновитьДоступ = Ложь; Источник.ДополнительныеСвойства.Свойство("ОбновитьДоступ", ОбновитьДоступ); Если не ОбновитьДоступ = Истина Тогда Возврат; КонецЕсли; ТипЗначенияИсточника = ТипЗнч(Источник); МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗначенияИсточника); МассивХешей = Ложь; Источник.ДополнительныеСвойства.Свойство("МассивХешей", МассивХешей); Попытка // обновим все ролевые права доступа к объекту Рег = РегистрыСведений.РолевойДоступОбъектов.СоздатьНаборЗаписей(); Рег.Отбор["Объект"].Использование = Истина; Рег.Отбор["Объект"].Значение = Источник.Ссылка; Рег.Отбор["Объект"].ВидСравнения = ВидСравнения.Равно; Рег.Прочитать(); мТЗ = Рег.ВыгрузитьКолонки(); //--------------------------------------------- // здесь гарантировано перезапишем весь набор для штатной единицы // Для каждого эл Из МассивХешей Цикл НоваяСтрока = мТЗ.Добавить(); НоваяСтрока.Доступ = эл; НоваяСтрока.Объект = Источник.Ссылка; КонецЦикла; Рег.Загрузить(мТЗ); Рег.Записать(Истина); Исключение Отказ = Истина; КонецПопытки; УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры |
|||
31
Shurjk
13.02.12
✎
14:27
|
(30) Ты это к чему?
|
|||
32
Reset
13.02.12
✎
14:29
|
(29) Имхо, она обязана сделать обращение, как минимум чтобы сверить ВерсияДанных (объект в БД могу быть изменен)
|
|||
33
vde69
13.02.12
✎
14:29
|
(31) к Вашему спору, все чтение и сравнение делается в подписке ДО ЗАПИСИ, потом готовый результат кладешь в ДополнительныеСвойства объекта, и уже в подписке ПРИ ЗАПИСИ берешь все из доп свойств и записываешь
|
|||
34
H A D G E H O G s
13.02.12
✎
14:30
|
Управляемое приложение всех расставит на свои места...
|
|||
35
Shurjk
13.02.12
✎
14:31
|
(33) Чем это будет быстрее чем прочитать через ссылку.
|
|||
36
Shurjk
13.02.12
✎
14:32
|
(32) Зачем ей это делать и как он может быть изменен если он заблокирован.
|
|||
37
Адинэснег
13.02.12
✎
14:33
|
*лицоладонь*
|
|||
38
vde69
13.02.12
✎
14:35
|
(35)это и есть прочесть через ссылку, ведь в памяти уже измененный обьект.
Вопрос не в том как сделать, а в том как сделать правильно, а правильно 1. чтение должно быть чистым (в текущей транзакции) 2. должен быть предусмотрен коррекнтый откат 3. сама запись не должна быть избыточной |
|||
39
Shurjk
13.02.12
✎
14:37
|
(38) Ты бредишь? Во первых сравнение делаем перед записью, во вторых этотобъект и Ссылка в принципе разные вещи, откат осуществляется возможностями платформы, про избыточность ты тут сам себя перемудрил.
|
|||
40
vde69
13.02.12
✎
14:37
|
(36) объект в 1с блокируется только в момент записи, при открытии формы он не блокируется а всего-лишь получает новый номер версии. По этому НИКТО не мешает записать открытый у соседа документ.
|
|||
41
Shurjk
13.02.12
✎
14:40
|
(40) Все не так блокируется в момент внесения данных в форму.
|
|||
42
vde69
13.02.12
✎
14:44
|
(41) :)))) не блокируется
проверь, открой элемент (и даже измени в нем реквезит, при этом будет сгенерирована версия), и ОБРАБОТКОЙ перезапиши этот элемент после этого элемент формы тебе не даст сохранить изменения из-за разности версий |
|||
43
Shurjk
13.02.12
✎
14:50
|
(42) Если обработкой то да, а если две формы открыть то нет.
|
|||
44
vde69
13.02.12
✎
14:51
|
(43) это НЕ блокировка, это контроль версий, реализуется не объектом а формой...
|
|||
45
Shurjk
13.02.12
✎
14:53
|
(44) Хорошо а передзаписью блокируется документ?
|
|||
46
fisher
13.02.12
✎
14:54
|
(38) Не вижу смысла читать предыдущую версию из базы в транзакции записи.
|
|||
47
vde69
13.02.12
✎
14:56
|
(45) передЗапиью в модуле формы - нет
перед записью в модуле обьекта (и подписке) - да для понимания сходи в поиск "план выполнения предопределенных процедур в транзакции записи" для БП там очень наворочено :) |
|||
48
Shurjk
13.02.12
✎
14:57
|
(47) Ну значит в процедуре перед записью уже установлена блокировка - так зачем тогда еще раз читать объект?
|
|||
49
Shurjk
13.02.12
✎
14:58
|
+(48) И чего ты все транзакции к месту и не к месту вставляешь?
|
|||
50
vde69
13.02.12
✎
15:05
|
(48) прочитан какой версии? и какой версии он в памяти?
это разные версии, по этому и нужно перечитать.... ------- а транзакции - это все фигня нафиг они не нужны и использовать их нельзя ни при каких условиях, да и в SQL уровень изоляции нужно установить самый низкий, тогда и блокировок не будет и скорость как у самолета будет. правда косяки полезут, но разве это кого пугает :) |
|||
51
_Demos_
13.02.12
✎
15:06
|
(48) проверил объект ОБРАБОТКОЙ перезапиывается.
Значит читать нужно из базы, а не сравнивать объект и ссылка. |
|||
52
_Demos_
13.02.12
✎
15:07
|
(1) ЭтотОбъект.Ссылка = Ссылка
разве не так |
|||
53
Shurjk
13.02.12
✎
15:07
|
(51) Оно и понятно просто в таком случае тебе все равно объект не даст записать, вне зависимости от того пройдет он у тебя проверку или нет.
|
|||
54
Shurjk
13.02.12
✎
15:08
|
(50) Версию контролируются сервером 1с, но не севером БД, зачем чего то читать из базы?
|
|||
55
hhhh
13.02.12
✎
15:09
|
(52) они другое сравнивают: ЭтотОбъект и ЭтотОбъект.Ссылка. Они не равны. Перед записью ЭтотОБъект в памяти и никуда не записывается. ЭтотОбъект.Ссылка тоже в памяти, где-то в кеше.
|
|||
56
Shurjk
13.02.12
✎
15:11
|
(55) Вот и я о том же, но тут утверждается что если написать Ссылка. то он прочитает не и памяти а заново из базы.
|
|||
57
_Demos_
13.02.12
✎
15:12
|
(53) открыл два сеанса в одном изменил одно поле, если попробовать изменить во втором сеансе то пишет объект блокирован. Здесь открываем обработку и "выполнить"(там она перезаписывает) все проходит на ура. Дальше если поробовать записать в первой форме(который блокировал) то ошибка контроля версий!
|
|||
58
_Demos_
13.02.12
✎
15:13
|
+ (57) платформа 8.1
|
|||
59
Shurjk
13.02.12
✎
15:13
|
(57) Угу но не дает записать именно сервер 1с, он у нас и отвечает за блокировки. Так что все логично.
|
|||
60
fisher
13.02.12
✎
15:25
|
(56) Ага. Утверждается. Но на 100% я уже не уверен. Т.к. работает оптимизированная запись объектов, то возможно что в начале транзакции записи движок неявно читает текущую версию объекта из базы в транзакционный кэш. Короче, только эксперимент спасет отца русской демократии.
|
|||
61
Shurjk
13.02.12
✎
15:32
|
(60) А каким образом его провести? Проверить будут ли обращения к базе? Так там может сервре по каким другим своим нуждам обращался.
|
|||
62
fisher
13.02.12
✎
15:33
|
(61) Профайлером на пустом демо-доке сравнить обращения к БД.
|
|||
63
_Demos_
13.02.12
✎
15:35
|
+(57) проверил в файловом и клиент-серверном отрабатывает как в (57) 8.1. 8.2 не знаю
(61) на 8.2 внизу же пишет сколько раз и сколько метров передал |
|||
64
fisher
13.02.12
✎
15:37
|
(63) Это обращения к серверу приложений.
|
|||
65
Shurjk
13.02.12
✎
15:52
|
(63) Ну это понятно, нас обращения к серверу интересуют.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |