|
|
|
Как отличить запись от удаления? | ☑ | ||
|---|---|---|---|---|
|
0
Гений 1С
гуру
02.07.07
✎
16:18
|
Как в модуле набора записей отличить изменение записи от ее удаления?
При изменении записи сначала формируется событие на удаление этой записи (Замещение=истина), потом событие на добавление этой записи (Замещение=ложь). При удалении записи просто формируется событие на удаление записи (Замещение=истина). Никак отличить не могу, поможите дальтонику. |
|||
|
1
asady
02.07.07
✎
16:20
|
НаборЗаписей.Количество()=0 ?
|
|||
|
2
Гений 1С
гуру
02.07.07
✎
16:21
|
(1) в обоих случаях равны нулю
|
|||
|
3
Гений 1С
гуру
02.07.07
✎
16:21
|
я даже могу прочитать регистр, чтобы посмотреть, есть чего в нем или нет, но в любом случае я не могу понять, это удаление или модификация... ;-(
А мне нужно запретить удалять. |
|||
|
4
Гений 1С
гуру
02.07.07
✎
16:22
|
(1) Т.к. при модификации сначала вызывается удаление, если его запретить - модификация не пройдет.
|
|||
|
5
BabySG
02.07.07
✎
18:20
|
Попробуй закончить транзакцию принудительно раньше конца процедуры и посмотреть, что твориться в регистре.
ЗЫ. Вроде 1С не поддерживает вложенных транзакций? |
|||
|
6
Моха
02.07.07
✎
18:31
|
(0) Выгрузка в таблицы значений с последующим сравнением не поможет?
|
|||
|
7
Asmody
02.07.07
✎
18:45
|
(6) а саму таблицу где хранить? :)
|
|||
|
8
France
02.07.07
✎
20:20
|
(5) и что там должно творится?
|
|||
|
9
Гений 1С
гуру
02.07.07
✎
20:20
|
(5) Это извращение!
(6) Первым идет удаление, а не запись, поэтому что выгружать? Таблица то пустая! |
|||
|
10
Гений 1С
гуру
02.07.07
✎
20:21
|
Походу очередная дыра функционала.
Можно еще както играться с флажком замещение, но мне кажется ДЫРА. |
|||
|
11
France
02.07.07
✎
20:26
|
расскажи, чо хочеш в результате получить - может, кто другой метод предложенить, помимо "игры на замещении"...
|
|||
|
12
Гений 1С
гуру
02.07.07
✎
22:30
|
(11) так я уже рассказал - хочу разрешить редактирование (но только ресурсов, без измерений), но запретить удаление.
|
|||
|
13
simol
02.07.07
✎
22:44
|
Судя из того что есть только право "Изменение" у регистра, ты такое не словишь
|
|||
|
14
Гений 1С
гуру
02.07.07
✎
23:44
|
(13) гыгыгы.... при чем тут права. Речь идет о контроле из модуля.
|
|||
|
15
BabySG
03.07.07
✎
01:15
|
(10) Не думаю, что дыра - скорее задача не с той стороны решается.
С точки зрения системы происходит не модификация, а удаление и создание - а это две большие разницы и отловить можно только внешней оберткой, т.к. система не будет себя нагружать такими подробностями интимной жизни пользователя :) |
|||
|
16
RomaH
naïve
03.07.07
✎
07:03
|
(0) вроде в набор можно передать доп параметр ...
|
|||
|
17
RomaH
naïve
03.07.07
✎
07:05
|
(0) чем запись отличается от удаления?
в том и в другом случае записывается набор |
|||
|
18
Гений 1С
гуру
03.07.07
✎
09:35
|
Это мне напоминает ситуацию - захватили немцы деревню, староста бежит и грит - а че, немцы они хорошие, ничего, жить можно...
В том то и дело, что невозможность отличить модификацию от удаления ведет к тому, что контроль над изменениями в регистрах сведений нужно как в 77 выносить в форму. А насчет того, что это одно и то же - бросьте. В одном случае это удаление, в другом транзакция из удаления и добавления. |
|||
|
19
BabySG
03.07.07
✎
10:45
|
(18) Не прав. Это просто запись в обоих случаях. Просто удаление и модификация - это частный случай записи. База переходит из одного состояния в другое - это основной принцип транзакций, поэтому никак не отследит не перехватывая такие события заранее.
|
|||
|
20
Моха
03.07.07
✎
10:47
|
(7) В оперативной памяти компьютера (Какой вопрос, такой ответ).
ОФФ: Витя, ты ее сколько лет хранить собираешься? :) (9) /2 И тебе не под силу добавить перед удалением выгрузку в ТЗ? |
|||
|
21
Гений 1С
гуру
03.07.07
✎
10:53
|
(19) Да ну? Видишь ли, в теории реляционных СУБД есть оператор SQL UPDATE.
1С почему то использует не UPDATE, а DELETE & INSERT |
|||
|
22
BabySG
03.07.07
✎
11:32
|
(21) Читаем про UPDATE и для чего оно применяется:
"Важно. Инструкция UPDATE не создает набора результатов. Обновление записей, выполненное с использованием запроса на обновление, нельзя отменить. Чтобы узнать какие записи будут обновлены, выполните запрос на выборку с теми же условиями, и только потом, выполните запрос на обновление. Рекомендуется всегда делать резервные копии данных. Если записи были удалены по ошибке, их можно восстановить из резервных копий. " Т.е. это опять частный случай записи (грубо говоря - с применение отбора, что будем менять) |
|||
|
23
snc
03.07.07
✎
12:57
|
(18) Если задача отследить действия пользователя - то вполне нормально использовать для этого форму. А потом передавать данные в модуль, например с помощью какой-нибудь экспортной переменной.
|
|||
|
24
Гений 1С
гуру
03.07.07
✎
13:27
|
(23) мне нужно запретить на программном уровне изменение скажем, реквизита регистра сведений определенным пользователям.
Через форму - это вчерашний день, 77, да, там это было нормально. |
|||
|
25
Гений 1С
гуру
03.07.07
✎
13:28
|
(22) мдя, как все запущено. видишь ли, если бы 1С передавало в модуль передзаписью, что именно оно пытается сделать.
Кстати, а может для РС пощупать при записи???? Я вот тут подумал.... |
|||
|
26
BabySG
03.07.07
✎
17:58
|
(25) Я так полагаю, что система не задумывается о таких мелочах просто делает удаление+запись нового - так быстрее будет.
|
|||
|
27
Гений 1С
гуру
04.07.07
✎
14:44
|
(26) Об этом должна была не система думать, а проектировщики платформы. Нужен был еще один параметр в процедуре ПередЗаписью (Удаление из модификации / Чистое удаление), на скорости это никак бы не отразилось. Очередная черная функциональная дыра 1С.
|
|||
|
28
BabySG
04.07.07
✎
18:54
|
(27) Ты не понял - это работает также, как и UPDATE в SQL.
Т.е ВСЕ изменения ты должен перехватывать на стадии ДО, а не ВО ВРЕМЯ. Т.е надо убирать не следствие, а причину. Данная функция не предназначена для такой ситуации по причине того, что система не задается вопросом (имхо) изменение каких полей произошло, а просто обновляет запись полностью, что должно быстрее быть, т.к. UPDATE будет работать с отбором. Соответственно - такого флага (модификация или что-нибудь другое) быть не может. |
|||
|
29
Гений 1С
гуру
05.07.07
✎
09:23
|
(28) Это было бы справедливо, если бы 1С изменяло через UPDATE, но оно изменяет через DELETE +INSERT, причем не средствами SQL, а из языка.
|
|||
|
30
коняшко
05.07.07
✎
09:34
|
Процедура ПриЗаписи(Отказ, РежимЗаписи)
Если ЭтотОбъект.Количество() > 0 Тогда //Это уже запись нового набора записей Работает четко Тонкость: при записи процедура отрабатывается дважды - первый раз удаление (количество = 0), второй раз запись проводок (количество = количество проводок); при отмене проведения - один раз (количество = 0) |
|||
|
31
Гений 1С
гуру
05.07.07
✎
09:38
|
(30) говорил уже, в первом вызове я не знаю, удаление это или изменение - число записей по любому-ноль.
Если я предположу, что это изменение и буду ждать второго вызова, он может и не произойти - например, если это удаление. |
|||
|
32
BabySG
05.07.07
✎
10:25
|
(31) Коряво - но подключай обработчик ожидания на 1-10 сек и смотри, что там произошло за это время.
Итого у тебя не так много вариантов решить эту задачу, либо ставить ее по другому :) |
|||
|
33
Jolly Roger
05.07.07
✎
10:53
|
(31)
В (30) уже почти все написано. Остается в модуль набора добавить переменную-счетчик: первй вызов - удаление, второй - запись новых данных. |
|||
|
34
Гений 1С
гуру
05.07.07
✎
12:12
|
(33) в таком случае я не отлавливаю удаление.
|
|||
|
35
Гений 1С
гуру
05.07.07
✎
12:13
|
(33) Хотя стоп, это идея...
ПередЗаписью вызывается дважды. А контроль нужно вносить в ПриЗаписи. Точно, счетчег поможет. |
|||
|
36
Гений 1С
гуру
05.07.07
✎
12:14
|
Правда, непонятно, если я в ПриЗаписи напишу Отказ, разорвет ли оно всю транзакцию или только первую запись? Наверное всю!
|
|||
|
37
Гений 1С
гуру
05.07.07
✎
12:15
|
И еще непонятно, когда этот счетчик обнулять...
|
|||
|
38
vde69
05.07.07
✎
12:29
|
(35) у тебя будут проблеммы с транкзациями.... ведь она может иметь неопределенное кол-во записей,
то есть если я в модуле проведения документа в цикле обнавляю 100 элементов регистра, то ты получишь транкзацию (не явную) на 200 шагов!!!! и как ты сможе из большой транкзации вычленить 1 запись????? ИХМО - либо будет МЕДЛЕННО либо не получиться!!! |
|||
|
39
Гений 1С
гуру
05.07.07
✎
12:35
|
Нет, ни хрена, все счетчики, которые создаются в модуле набора записей для каждой записи уникальны, т.е. дважды устанавливаются в неопределено.... Мдя...
|
|||
|
40
Гений 1С
гуру
05.07.07
✎
12:35
|
(38) Читай (39) - уже не получилось.
|
|||
|
41
Гений 1С
гуру
05.07.07
✎
12:35
|
(38) Событие вызывается один раз, для набора записей
|
|||
|
42
UFO
05.07.07
✎
12:43
|
Вообщето при удалении документа вызывается ПриЗаписи() где уже свойство ПометкаУдаления = Истина
|
|||
|
43
UFO
05.07.07
✎
12:46
|
Когда вызывается призаписи транзакция уже началась
Соответсвенно отказ отменяет все |
|||
|
44
Гений 1С
гуру
05.07.07
✎
12:54
|
(42) Ты тему читал? Речь идет о наборе записей
|
|||
|
45
UFO
05.07.07
✎
12:59
|
v8: Как отличить запись от удаления?
Вот тема... нигде про набор записей |
|||
|
46
vde69
05.07.07
✎
13:02
|
(44) нет это ты не понял!!! именно это я и хотел до тебя донести, ведь почти всегда модуль регистра выболняеться в БОЛЬШОЙ и ВЫШЕСТОЯЩЕЙ транкзации, и ты не сможешь влиять на конкретную запись... ты сможешь только отменить БОЛЬШУЮ транкзацию!!!!
|
|||
|
47
UFO
05.07.07
✎
13:03
|
(46) пральна гришь
(44) вот так вот |
|||
|
48
vde69
05.07.07
✎
13:03
|
(46) а отменять ее лучше из того места где она началась например из модуля документа!!!
|
|||
|
49
Гений 1С
гуру
05.07.07
✎
16:44
|
(46) Зачем в документы ввели событие ПередЗаписью? ЧТобы не искать по коду, где вызывается запись документа. А ты предлагаешь регресс - назад к 77. Ищем все места, где вызывается запись набора записей и ура... Только это все уже в прошлом, вместе с 77.
|
|||
|
50
Гений 1С
гуру
05.07.07
✎
16:44
|
(47) лажу он говорит
|
|||
|
51
Гений 1С
гуру
05.07.07
✎
16:44
|
(50) Хотя в том что касается транзакции он прав
|
|||
|
52
Гений 1С
гуру
05.07.07
✎
18:32
|
По идее можно при удалении не удалять набор записей, а записывать его еще раз, в при записи... ну что то типо этого
|
|||
|
53
BabySG
05.07.07
✎
19:42
|
Что-то у меня все сильнее крепнет мысль, что Гений не с той стороны задачу решает.
Если тебе тупо надо решать вопрос запрета редактирования чего-либо в РС - дык создай свою форму обработки списка/записи и балуйся этим. А Документы.ПередЗаписью() никаким образом не относятся к РС.НаборЗаписей.ПередЗаписью() - вообще разная тактика работы и назначение |
|||
|
54
vde69
05.07.07
✎
20:58
|
я придумал как тебе сделать!!!!! все ГениТальное - ПРОСТО!!!!
1. ЗАПРЕЩАЕШЬ ВСЕМ РОЛЯМ изменять регистр 2. Создаешь модуль с неограничеными правами и в нем описываешь процедуры записи и удаления регистра!!!! далее ЛЮБАЯ обработка обязана пойти через твои обработчики есть 2 минуса 1. придеться переписывать ВСЕ места где происходит запись 2. возможно обойти из другого привелигерованного модуля |
|||
|
55
Злобный Фей
06.07.07
✎
00:40
|
Гений опять изобретает сферического коня. Ты когда последний раз заходил в конференцию для партнеров? Почитай посмотри скока там пожеланий/недоработок/багов в платформе. Хоша кто тебя такого красавца туда пустит.. Попроси кого там тему замутить, есть шанс что одинэсники тебе ответят (меня не проси, сижу под паролем двухлетней давности, не хочу светиться)
|
|||
|
56
Злобный Фей
06.07.07
✎
00:40
|
+(55) Имелась в виду конференция для разработчиков, ессно
|
|||
|
57
Гений 1С
гуру
06.07.07
✎
09:35
|
(54) Этот подход я называю "Back to USSR", ой пардон "Назад в 7.7"
(55) Меня туда не пустят, я их всех опущу. Я злой на 1С. |
|||
|
58
dimzon
12.07.07
✎
03:51
|
(57)
ой, моська ;) исчо кто кого опустит, хотелось бы мне посмотреть ;) |
|||
|
59
Tamiko
06.09.07
✎
09:47
|
1. Создать глобальную переменную глПризнакЗаписи.
2. Подписать документы на событие ПередЗаписью, и ПриЗаписи 3. В обработчике событий в процедуре ПередЗаписью: глПризнакЗаписи = 0. 4. В обработчике событий в процедуре ПриЗаписи: глПризнакЗаписи = 1. 5. В обработчике событий в процедуре ПриЗаписиРегистровНакопления: условие (глКДО_ПризнакЗаписи = Истина) И (Источник.мТаблицаДвижений = Неопределено) выполнится только для удаления при изменении. |
|||
|
60
DK_L
06.09.07
✎
10:01
|
(57) а теперь прочти свой пост (57) ВНИМАТЕЛЬНО !!! и зацени - почему над тобой стебаются - просто жесть , такой самовлюбленности давно не встречал - типа новый божок.
|
|||
|
61
Гений 1С
гуру
06.09.07
✎
12:48
|
(59) Ненадежно. К тому же метод работает только для регистров, подчиненных регистратору.
(60) Вот то-то и оно, что большинство тупых 1сников просто плескается в своем болотце и не ждет милостей от Селезневки. |
|||
|
62
Tamiko
06.09.07
✎
13:36
|
У меня все отлично отрабатывает. Думаю достаточно надежно.
|
|||
|
63
Гений 1С
гуру
06.09.07
✎
14:04
|
(62) я объяснил тебе, что это только для регистраторов... для независимых регистров не катит, а у меня именно такой случай.
Кстати, в твоем варианте думаю достаточно анализировать реквизит Проведен документа, а не глобальные флаги. |
|||
|
64
Tamiko
06.09.07
✎
14:07
|
Конечно, тебе тогда не подходит.
Внутри ПриЗаписиРегистровНакопления() Проведен всегда истина, как ни странно. |
|||
|
65
Гений 1С
гуру
06.09.07
✎
14:32
|
(64) А ты используй версию из базы данных. Регистратор.Ссылка.ПолучитьОБъект()
|
|||
|
66
Tamiko
06.09.07
✎
14:39
|
Проверила: Регистратор.Ссылка.ПолучитьОбъект().Проведен тоже всегда ИСТИНА в ПриЗаписиРегистровНакопления().
|
|||
|
67
hhhh
06.09.07
✎
15:00
|
(0) попробуй Модифицированность(). Вроде отличается.
|
|||
|
68
Гений 1С
гуру
06.09.07
✎
15:32
|
(67) ты это к чему?
А ваще я пока еще на 8.1 не перешел, поэтому подписку на события юзать не могу. |
|||
|
69
Tamiko
06.09.07
✎
15:34
|
Проверила: Регистратор.Ссылка.ПолучитьОбъект().Модифицированность() всегда ЛОЖЬ в ПриЗаписиРегистровНакопления().
|
|||
|
70
hhhh
06.09.07
✎
15:44
|
(68) Причем тут подписка. В НабореЗаписей есть метод Модифицированность(). Для удаляемых дает Истина, а для остальных на этапе удаления - Ложь.
|
|||
|
71
Гений 1С
гуру
06.09.07
✎
18:54
|
(70) Серьезно? Гы... Надо посмотреть... В принципе, логично...
|
|||
|
72
Tamiko
07.09.07
✎
06:11
|
см (69)
|
|||
|
73
Гений 1С
гуру
07.09.07
✎
11:48
|
(72) это ты кому? Я проверил.
Если в модуле набора записей количество записей равно нулю и модифицированность - истина, тогда это удаление, если же модифицированность - ложь, то это изменение. Действительно, отличить удаление от модификации можно. ;-) Спасибо HHHH |
|||
|
74
Tamiko
07.09.07
✎
12:10
|
А у меня Модифицированность() возвращает всегда ЛОЖЬ :(
|
|||
|
75
Гений 1С
гуру
07.09.07
✎
17:06
|
(74) ты не так смотришь... проверь еще раз... в модуле набора записей в событии перед записью!
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |