Всем привет.
Вопрос такой:
Как запретить удаление записей регистра сведений?
Добавление, редактирование и т.д. и т.п. есть, а вот удаления не наблюдаю.
Подскажите плиз, как это правильно делается?
(1) Нет такого понятия "Удаление записей регистра". Есть Запись пустого набора.
Можно в модуле записей регистра вызвать исключение, если идет запись пустого набора.
Процедура ПередЗаписью(Отказ, Замещение)
Если ЭтотОбъект.Количество() = 0 Тогда
//это пустой набор записей
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ПользовательИБ.Роли.Содержит("ИмяРоли") Тогда
Отказ = Истина;
ВызватьИсключение("Удаление запрещено");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(1) Нет такого понятия "Удаление записей регистра". Есть Запись пустого набора.
Можно в модуле записей регистра вызвать исключение, если идет запись пустого набора.
Процедура ПередЗаписью(Отказ, Замещение)
Если ЭтотОбъект.Количество() = 0 Тогда
//это пустой набор записей
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ПользовательИБ.Роли.Содержит("ИмяРоли") Тогда
Отказ = Истина;
ВызватьИсключение("Удаление запрещено");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(11) Спасибо за информацию - очень пригодилась. Но со временем обнаружила побочный эффект. Старые записи регистра тоже редактировать не возможно. В связи с этим вопрос, который уже возникал ранее - как отличить удаление от редактирования?
(16)
Еще раз. нет такого понятия "Удаление", есть пустой набор.
Если НаборЗаписей.Количество() = 0 - это "удаление", иначе - это редактирование
Если вы не в модуле набора записей, то помните, что количество записей в наборе зависит от установленного отбора по измерениям
(17) НаборЗаписей.Количество() = 0 даже если я поменяла значение одного из полей записи. Поэтому и перестало работать. Редактировать записи тоже нельзя. Возможно Количество() подразумевает количество записей с ТАКИМ сочетанием значений полей как я пытаюсь записать. Но такого сочетания правда еще нет. Так что увы - не работает.
Вопрос решили другим способом - решили подчинить регистр документу. Так и редактировать удобнее в дальнейшем и проблема случайного удаления записей решается.
(19) Тут речь о том, что при редактировании существующей записи регистра сведений набор записей сначала полностью очищается, а потом записываются новые значения в этот набор.
И получается, что при удалении записей из регистра записывается пустой набор записей с количество() = 0, а при редактировании записи тоже записывается пустой набор записей, а после этого записывается набор с новыми данными.
Если вы добавите команду "Сообщить(ЭтотОбъект.Количество())" в событие "ПриЗаписи" для любого регистра сведений и попробуете удалить запись, а потом поредактировать существующую - сами увидите это всё
Вам нужно почитать про регистры. Иначе не сделаете.
Когда Вы записываете набор записей в регистр, то, по умолчанию, все записи из регистра сведений, соответствующие отбору НабораЗаписей удаляются, и все записи из набора записываются в РегистрСведений. Если отбор не заполнен и в НабореЗаписей нет ни одной записи, то методом Записать(), вы очистите весь регистр.
Я бы попытался решить этот вопрос через настройку формы списка конкретного регистра, так чтобы убрать видимость действия "Удалить" с учетом прав пользователей.
Если есть права то пометка на удаление потом стандартная процедура под админом или если вам доступно то Удаление помеченных объектов выбираем только ту запись регистра что пометили жмём удалить если ругается и не удаляет то пишет с чем запись связана и с какими данными в левой части окна обработки удаление помеченных на удаление будет нашь объект или запись регистра в правой связи в левой нужно ссылки на нашу запись регистра которую хотим удалить заминитт другой записью из этого же регистра правильной. После повторить процедуру поиска и удаления уже когда связь измените удалится как миленькая. Перед всем этим я бы до кучи сделал бы стандартную обработку поиск и удаление дублей для данного регистра. Чтоб объединить, похожие записи если в регистре бардак а потом уже удаление помеченные. После поиска дублей верного дубли и кривые записи должны стать легкоудаляемые если это не так то при удалении помеченных объектов меняйте ссылки в документах и данных я описал чуть выше по кнопке изменить когда в левом окне получите если получите объект наша запись регистра с справа ссылки на места её использования.
Мне это помогло когда регистры чистил очень помогло правильно Поиск и удаление дублей потом Удаление помеченные объектов. Для справочников аналогично и для всего что есть в базе. Будьте потренируйтесь на тестовой базе с 1-2 записями созданы и намеренно разберётесь со связями на примере удаления контрагента если их 2 или 3 в базе одиноковых и на обоих есть платёжка хоть 1 если есть платёжка, платёжное поручение оба скидываем на одного контрагента обьединяем поиском дублей одного из 2 контрагентов на котором не будет ПП ни одной обработка поиска дублей метит на удаление а потом уже удаление помечены удалит из справочника косяк так правильно.
(20) Уточните, пожалуйста. Правильно ли я понимаю, что такая проверка подразумевается как универсальная и должна осуществляться в модуле набора записей регистра?
(20) Только что поставил эксперимент на платформе 8.3.12.1685.
Действительно, все работает так, как Вы описали. Именно такие значения и видно в модуле набора записей в обработчике "ПередЗаписью". Но к сожалению, не является универсальным "рецептом", т.к. подобное поведение наблюдается только при работе с менеджером записи, а соответственно и при интерактивной работе с записями регистра. При работе с набором записей поведение иное.
- пробовал скрывать элементы меню (все равно удаляет по нажатию DEL)
- пробовал обработку событий формы (в форме списка работает, в форме элемента не нашел)
Лучший способ в модуле, работает спасибо besometr
В модуле набора записей для регистра сведений
Процедура ПередЗаписью(Отказ, Замещение)
// Удаление записей
Если ЭтотОбъект.Количество() = 0 и ЭтотОбъект.Модифицированность() = Истина Тогда
Если НЕ РольДоступна("ПолныеПрава") Тогда
Сообщить("Удаление запрещено. Нет прав.");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(23) Извините, пожалуйста, за навязчивость. Просто еще раз хочу отметить, что такой подход актуален только для интерактивной работы пользователя. Т.е. если пользователь запустит какую-нибудь обработку вот с таким алгоритмом, проверка не сработает: