#0
by Гений 1С
Как в модуле набора записей отличить изменение записи от ее удаления? При изменении записи сначала формируется событие на удаление этой записи (Замещение=истина), потом событие на добавление этой записи (Замещение=ложь). При удалении записи просто формируется событие на удаление записи (Замещение=истина). Никак отличить не могу, поможите дальтонику.
#3
by Гений 1С
я даже могу прочитать регистр, чтобы посмотреть, есть чего в нем или нет, но в любом случае я не могу понять, это удаление или модификация... ;-( А мне нужно запретить удалять.
#4
by Гений 1С
Т.к. при модификации сначала вызывается удаление, если его запретить - модификация не пройдет.
#5
by BabySG
Попробуй закончить транзакцию принудительно раньше конца процедуры и посмотреть, что твориться в регистре. ЗЫ. Вроде 1С не поддерживает вложенных транзакций?
#9
by Гений 1С
Это извращение! Первым идет удаление, а не запись, поэтому что выгружать? Таблица то пустая!
#10
by Гений 1С
Походу очередная дыра функционала. Можно еще както играться с флажком замещение, но мне кажется ДЫРА.
#11
by France
расскажи, чо хочеш в результате получить - может, кто другой метод предложенить, помимо "игры на замещении"...
#12
by Гений 1С
так я уже рассказал - хочу разрешить редактирование (но только ресурсов, без измерений), но запретить удаление.
#15
by BabySG
Не думаю, что дыра - скорее задача не с той стороны решается. С точки зрения системы происходит не модификация, а удаление и создание - а это две большие разницы и отловить можно только внешней оберткой, т.к. система не будет себя нагружать такими подробностями интимной жизни пользователя :)
#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
В уже почти все написано. Остается в модуль набора добавить переменную-счетчик: первй вызов - удаление, второй - запись новых данных.
#35
by Гений 1С
Хотя стоп, это идея... ПередЗаписью вызывается дважды. А контроль нужно вносить в ПриЗаписи. Точно, счетчег поможет.
#36
by Гений 1С
Правда, непонятно, если я в ПриЗаписи напишу Отказ, разорвет ли оно всю транзакцию или только первую запись? Наверное всю!
#38
by vde69
у тебя будут проблеммы с транкзациями.... ведь она может иметь неопределенное кол-во записей, то есть если я в модуле проведения документа в цикле обнавляю 100 элементов регистра, то ты получишь транкзацию (не явную) на 200 шагов!!!! и как ты сможе из большой транкзации вычленить 1 запись????? ИХМО - либо будет МЕДЛЕННО либо не получиться!!!
#39
by Гений 1С
Нет, ни хрена, все счетчики, которые создаются в модуле набора записей для каждой записи уникальны, т.е. дважды устанавливаются в неопределено.... Мдя...
#42
by UFO
Вообщето при удалении документа вызывается ПриЗаписи где уже свойство ПометкаУдаления = Истина
#46
by vde69
нет это ты не понял!!! именно это я и хотел до тебя донести, ведь почти всегда модуль регистра выболняеться в БОЛЬШОЙ и ВЫШЕСТОЯЩЕЙ транкзации, и ты не сможешь влиять на конкретную запись... ты сможешь только отменить БОЛЬШУЮ транкзацию!!!!
#49
by Гений 1С
Зачем в документы ввели событие ПередЗаписью? ЧТобы не искать по коду, где вызывается запись документа. А ты предлагаешь регресс - назад к 77. Ищем все места, где вызывается запись набора записей и ура... Только это все уже в прошлом, вместе с 77.
#52
by Гений 1С
По идее можно при удалении не удалять набор записей, а записывать его еще раз, в при записи... ну что то типо этого
#53
by BabySG
Что-то у меня все сильнее крепнет мысль, что Гений не с той стороны задачу решает. Если тебе тупо надо решать вопрос запрета редактирования чего-либо в РС - дык создай свою форму обработки списка/записи и балуйся этим. А Документы.ПередЗаписью никаким образом не относятся к РС.НаборЗаписей.ПередЗаписью - вообще разная тактика работы и назначение
#54
by vde69
я придумал как тебе сделать!!!!! все ГениТальное - ПРОСТО!!!! 1. ЗАПРЕЩАЕШЬ ВСЕМ РОЛЯМ изменять регистр 2. Создаешь модуль с неограничеными правами и в нем описываешь процедуры записи и удаления регистра!!!! далее ЛЮБАЯ обработка обязана пойти через твои обработчики есть 2 минуса 1. придеться переписывать ВСЕ места где происходит запись 2. возможно обойти из другого привелигерованного модуля
#55
by Злобный Фей
Гений опять изобретает сферического коня. Ты когда последний раз заходил в конференцию для партнеров? Почитай посмотри скока там пожеланий/недоработок/багов в платформе. Хоша кто тебя такого красавца туда пустит.. Попроси кого там тему замутить, есть шанс что одинэсники тебе ответят (меня не проси, сижу под паролем двухлетней давности, не хочу светиться)
#57
by Гений 1С
Этот подход я называю "Back to USSR", ой пардон "Назад в 7.7" Меня туда не пустят, я их всех опущу. Я злой на 1С.
#59
by Tamiko
1. Создать глобальную переменную глПризнакЗаписи. 2. Подписать документы на событие ПередЗаписью, и ПриЗаписи 3. В обработчике событий в процедуре ПередЗаписью: глПризнакЗаписи = 0. 4. В обработчике событий в процедуре ПриЗаписи: глПризнакЗаписи = 1. 5. В обработчике событий в процедуре ПриЗаписиРегистровНакопления: условие (глКДО_ПризнакЗаписи = Истина) И (Источник.мТаблицаДвижений = Неопределено) выполнится только для удаления при изменении.
#60
by DK_L
а теперь прочти свой пост ВНИМАТЕЛЬНО !!! и зацени - почему над тобой стебаются - просто жесть , такой самовлюбленности давно не встречал - типа новый божок.
#61
by Гений 1С
Ненадежно. К тому же метод работает только для регистров, подчиненных регистратору. Вот то-то и оно, что большинство тупых 1сников просто плескается в своем болотце и не ждет милостей от Селезневки.
#63
by Гений 1С
я объяснил тебе, что это только для регистраторов... для независимых регистров не катит, а у меня именно такой случай. Кстати, в твоем варианте думаю достаточно анализировать реквизит Проведен документа, а не глобальные флаги.
#64
by Tamiko
Конечно, тебе тогда не подходит. Внутри ПриЗаписиРегистровНакопления Проведен всегда истина, как ни странно.
#66
by Tamiko
Проверила: Регистратор.Ссылка.ПолучитьОбъект.Проведен тоже всегда ИСТИНА в ПриЗаписиРегистровНакопления.
#68
by Гений 1С
ты это к чему? А ваще я пока еще на 8.1 не перешел, поэтому подписку на события юзать не могу.
#69
by Tamiko
Проверила: Регистратор.Ссылка.ПолучитьОбъект.Модифицированность всегда ЛОЖЬ в ПриЗаписиРегистровНакопления.
#70
by hhhh
Причем тут подписка. В НабореЗаписей есть метод Модифицированность. Для удаляемых дает Истина, а для остальных на этапе удаления - Ложь.
#73
by Гений 1С
это ты кому? Я проверил. Если в модуле набора записей количество записей равно нулю и модифицированность - истина, тогда это удаление, если же модифицированность - ложь, то это изменение. Действительно, отличить удаление от модификации можно. ;-) Спасибо HHHH
#75
by Гений 1С
ты не так смотришь... проверь еще раз... в модуле набора записей в событии перед записью!
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Конвертация данных и ОперацияБух
- Получение и установка настроек отбора в построителе запроса
- Перезагрузка компа при вводе пароля
- перенос базы из Bat(Outlook) в 1С
- Структура ИТС диска
- УРИБ: Разные остатки в центре и на удаленной базе
- Где на диске ИТС находятся тесты?
- v7: Выплата зарплаты в натуральной форме в бюджетном учете
- Как программно вставить рисунок в Excel
- Word как заполнить таблицу в цикле?
- Запрос по временным таблицам и конструктор запроса
- В чем разница между счетами 68.4.1 и 68.4.2
- Перестал работать двойной клик в таблице
- Автоматическая блокировка окна 1C
- Файл не содержит маркера кодировки UTF8
- ошибка в базе
- Одинаковая нумерация 2х документов.
- Обновление конфигурации - а нужен ли ИТС?
- v7: Свод отчетов 7.7 "Консолидированная отчетность бюджетных учреждений"
- Макеты печатных форм