Как отличить запись от удаления? #281636


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