Имя: Пароль:
1C
 
Как отличить запись от удаления?
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) ты не так смотришь... проверь еще раз... в модуле набора записей в событии перед записью!