Как запретить удаление записей регистра сведений.

1. poyson 11.12.17 14:31 Сейчас в теме
Всем привет.
Вопрос такой:
Как запретить удаление записей регистра сведений?
Добавление, редактирование и т.д. и т.п. есть, а вот удаления не наблюдаю.
Подскажите плиз, как это правильно делается?
По теме из базы знаний
Найденные решения
11. schweigen 11.12.17 23:58 Сейчас в теме
(1) Нет такого понятия "Удаление записей регистра". Есть Запись пустого набора.
Можно в модуле записей регистра вызвать исключение, если идет запись пустого набора.

Процедура ПередЗаписью(Отказ, Замещение)
	
	Если ЭтотОбъект.Количество() = 0 Тогда
		//это пустой набор записей
		ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
		Если ПользовательИБ.Роли.Содержит("ИмяРоли") Тогда
			Отказ = Истина;
			ВызватьИсключение("Удаление запрещено");
		КонецЕсли;		
	КонецЕсли;		
	
КонецПроцедуры
Показать
romanstor; dmb2006; DowJones; poyson; user811769; Огонек; +6 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
11. schweigen 11.12.17 23:58 Сейчас в теме
(1) Нет такого понятия "Удаление записей регистра". Есть Запись пустого набора.
Можно в модуле записей регистра вызвать исключение, если идет запись пустого набора.

Процедура ПередЗаписью(Отказ, Замещение)
	
	Если ЭтотОбъект.Количество() = 0 Тогда
		//это пустой набор записей
		ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
		Если ПользовательИБ.Роли.Содержит("ИмяРоли") Тогда
			Отказ = Истина;
			ВызватьИсключение("Удаление запрещено");
		КонецЕсли;		
	КонецЕсли;		
	
КонецПроцедуры
Показать
romanstor; dmb2006; DowJones; poyson; user811769; Огонек; +6 Ответить
16. NataLisa 07.02.19 10:04 Сейчас в теме
(11) Спасибо за информацию - очень пригодилась. Но со временем обнаружила побочный эффект. Старые записи регистра тоже редактировать не возможно. В связи с этим вопрос, который уже возникал ранее - как отличить удаление от редактирования?
17. schweigen 09.02.19 14:46 Сейчас в теме
(16)
Еще раз. нет такого понятия "Удаление", есть пустой набор.
Если НаборЗаписей.Количество() = 0 - это "удаление", иначе - это редактирование
Если вы не в модуле набора записей, то помните, что количество записей в наборе зависит от установленного отбора по измерениям
18. NataLisa 11.02.19 11:18 Сейчас в теме
(17) НаборЗаписей.Количество() = 0 даже если я поменяла значение одного из полей записи. Поэтому и перестало работать. Редактировать записи тоже нельзя. Возможно Количество() подразумевает количество записей с ТАКИМ сочетанием значений полей как я пытаюсь записать. Но такого сочетания правда еще нет. Так что увы - не работает.
Вопрос решили другим способом - решили подчинить регистр документу. Так и редактировать удобнее в дальнейшем и проблема случайного удаления записей решается.
19. schweigen 11.02.19 15:48 Сейчас в теме
(18)
Возможно Количество() подразумевает количество записей с ТАКИМ сочетанием значений полей как я пытаюсь записать. Но такого сочетания правда еще нет.

не вижу смысла продолжать диалог.
28. rudnitskij 07.05.20 14:08 Сейчас в теме
(19) Тут речь о том, что при редактировании существующей записи регистра сведений набор записей сначала полностью очищается, а потом записываются новые значения в этот набор.
И получается, что при удалении записей из регистра записывается пустой набор записей с количество() = 0, а при редактировании записи тоже записывается пустой набор записей, а после этого записывается набор с новыми данными.
Если вы добавите команду "Сообщить(ЭтотОбъект.Количество())" в событие "ПриЗаписи" для любого регистра сведений и попробуете удалить запись, а потом поредактировать существующую - сами увидите это всё
vampo; bilex; DFinteX; BrainWashed; +4 Ответить
2. poyson 11.12.17 14:56 Сейчас в теме
3. user623969_dusa 11.12.17 14:58 Сейчас в теме
удаление это частный случай редактирования или через код
4. poyson 11.12.17 15:39 Сейчас в теме
(3) А как отделить редактирование от удаления?
5. poyson 11.12.17 16:50 Сейчас в теме
Ну подскажите плиз....как это делается?
6. poyson 11.12.17 17:28 Сейчас в теме
:( нету что ли спецов по регистрам?
7. Onwardv 64 11.12.17 17:36 Сейчас в теме
Вам нужно почитать про регистры. Иначе не сделаете.

Когда Вы записываете набор записей в регистр, то, по умолчанию, все записи из регистра сведений, соответствующие отбору НабораЗаписей удаляются, и все записи из набора записываются в РегистрСведений. Если отбор не заполнен и в НабореЗаписей нет ни одной записи, то методом Записать(), вы очистите весь регистр.
8. poyson 11.12.17 21:31 Сейчас в теме
(7) И как мне поможет это запретить удаление записей в регистре?
9. artkor 276 11.12.17 22:27 Сейчас в теме
Не знаю, можно ли с других форумов ссылки постить, но вот тут примеры неплохие есть: http://www.forum.mista.ru/topic.php?id=458920
10. Moloko57 11.12.17 23:44 Сейчас в теме
Я бы попытался решить этот вопрос через настройку формы списка конкретного регистра, так чтобы убрать видимость действия "Удалить" с учетом прав пользователей.
12. пользователь 28.01.19 19:52
Сообщение было скрыто модератором.
...
13. istrahlebit 28.01.19 19:54 Сейчас в теме
Если есть права то пометка на удаление потом стандартная процедура под админом или если вам доступно то Удаление помеченных объектов выбираем только ту запись регистра что пометили жмём удалить если ругается и не удаляет то пишет с чем запись связана и с какими данными в левой части окна обработки удаление помеченных на удаление будет нашь объект или запись регистра в правой связи в левой нужно ссылки на нашу запись регистра которую хотим удалить заминитт другой записью из этого же регистра правильной. После повторить процедуру поиска и удаления уже когда связь измените удалится как миленькая. Перед всем этим я бы до кучи сделал бы стандартную обработку поиск и удаление дублей для данного регистра. Чтоб объединить, похожие записи если в регистре бардак а потом уже удаление помеченные. После поиска дублей верного дубли и кривые записи должны стать легкоудаляемые если это не так то при удалении помеченных объектов меняйте ссылки в документах и данных я описал чуть выше по кнопке изменить когда в левом окне получите если получите объект наша запись регистра с справа ссылки на места её использования.
14. istrahlebit 28.01.19 20:03 Сейчас в теме
Мне это помогло когда регистры чистил очень помогло правильно Поиск и удаление дублей потом Удаление помеченные объектов. Для справочников аналогично и для всего что есть в базе. Будьте потренируйтесь на тестовой базе с 1-2 записями созданы и намеренно разберётесь со связями на примере удаления контрагента если их 2 или 3 в базе одиноковых и на обоих есть платёжка хоть 1 если есть платёжка, платёжное поручение оба скидываем на одного контрагента обьединяем поиском дублей одного из 2 контрагентов на котором не будет ПП ни одной обработка поиска дублей метит на удаление а потом уже удаление помечены удалит из справочника косяк так правильно.
15. istrahlebit 28.01.19 20:05 Сейчас в теме
Для БП 3.0 делаем так в ЗУП 3.1 аналогично. По моему во всех современных конфигурациях это есть даже вроде в ЗУП 2.5
20. besometr 13.02.19 19:06 Сейчас в теме
У наборов записей и менеджеров записи есть метод Модифицированность().

Если НаборЗаписей.Количество()=0 И НаборЗаписей.Модифицированность() Тогда


Как уже было сказано выше, при изменении записи, набор записывается 2-жды, первый раз пустой, для удаления данных, второй для записи новых значений.

Таким образом, при добавлении новой записи:
1.
НаборЗаписей.Количество() > 0 НаборЗаписей.Модифицированность() = Истина


При изменении записи
1.
НаборЗаписей.Количество() = 0 НаборЗаписей.Модифицированность() = Ложь

2.
НаборЗаписей.Количество() > 0 НаборЗаписей.Модифицированность() = Истина


При удалении записи
1.
НаборЗаписей.Количество() = 0 НаборЗаписей.Модифицированность() = Истина
pocket_deer; fixin; DFinteX; VooDOOPRo; antonio_i; Swamt; leoxz; yalex9; CXY; EvgeTrofi; itmind; MrFlanker; +12 Ответить
21. dhurricane 13.02.19 19:21 Сейчас в теме
(20) Уточните, пожалуйста. Правильно ли я понимаю, что такая проверка подразумевается как универсальная и должна осуществляться в модуле набора записей регистра?
22. dhurricane 13.02.19 19:56 Сейчас в теме
(20) Только что поставил эксперимент на платформе 8.3.12.1685.

Действительно, все работает так, как Вы описали. Именно такие значения и видно в модуле набора записей в обработчике "ПередЗаписью". Но к сожалению, не является универсальным "рецептом", т.к. подобное поведение наблюдается только при работе с менеджером записи, а соответственно и при интерактивной работе с записями регистра. При работе с набором записей поведение иное.
23. MrFlanker 223 11.03.19 13:58 Сейчас в теме
(20) Спасибо

- пробовал скрывать элементы меню (все равно удаляет по нажатию DEL)
- пробовал обработку событий формы (в форме списка работает, в форме элемента не нашел)

Лучший способ в модуле, работает спасибо besometr

В модуле набора записей для регистра сведений
Процедура ПередЗаписью(Отказ, Замещение)
	
	// Удаление записей
	Если ЭтотОбъект.Количество() = 0 и ЭтотОбъект.Модифицированность() = Истина Тогда
		Если  НЕ РольДоступна("ПолныеПрава") Тогда
			Сообщить("Удаление запрещено. Нет прав.");
			Отказ = Истина;
		КонецЕсли;

	КонецЕсли;		
КонецПроцедуры
Показать
24. dhurricane 11.03.19 14:04 Сейчас в теме
(23) Извините, пожалуйста, за навязчивость. Просто еще раз хочу отметить, что такой подход актуален только для интерактивной работы пользователя. Т.е. если пользователь запустит какую-нибудь обработку вот с таким алгоритмом, проверка не сработает:
НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ИмяИзмерения.Установить(ЗначениеОтбора);
НаборЗаписей.Записать();
25. MrFlanker 223 11.03.19 16:53 Сейчас в теме
(24)
. Т.е. если пользователь запустит какую-нибудь обработку вот с таким алгоритмом, пров

У меня все обработки мои, так что плохого не сделают.
А враждебная обработка может чего угодно наделать.

Спасибо за комментарий, уверен кому то он будет полезен.

Мне нужно было ограничить интерактивное удаление.
26. Matveev_VS 160 02.07.19 13:44 Сейчас в теме
27. Artem_P 20.02.20 20:09 Сейчас в теме
привелегированный режим ?
29. rebuzx 162 26.04.22 09:31 Сейчас в теме
Добавление записи:

ПередЗаписью:
НаборЗаписей.Модифицированность() = ИСТИНА
НаборЗаписей.Количество() = 1 


ПриЗаписи:
НаборЗаписей.Модифицированность() = ЛОЖЬ
НаборЗаписей.Количество() = 1 


Редактирование записи: (Делается два прохода. Запись с начальными данными удаляется, запись с новыми данными добавляется)

Первый проход удаление:
ПередЗаписью:
НаборЗаписей.Модифицированность() = ЛОЖЬ
НаборЗаписей.Количество() = 0 


ПриЗаписи:
НаборЗаписей.Модифицированность() = ЛОЖЬ
НаборЗаписей.Количество() = 0 


Второй проход добавление:
ПередЗаписью:
НаборЗаписей.Модифицированность() = ИСТИНА
НаборЗаписей.Количество() = 1 


ПриЗаписи:
НаборЗаписей.Модифицированность() = ЛОЖЬ
НаборЗаписей.Количество() = 1 


Удаление записи:

ПередЗаписью:
НаборЗаписей.Модифицированность() = ИСТИНА
НаборЗаписей.Количество() = 0 


ПриЗаписи:
НаборЗаписей.Модифицированность() = ЛОЖЬ
НаборЗаписей.Количество() = 0 
lllayka; DFinteX; antonio_i; alk; +4 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот