Удаляем запись независимого регистра сведений, а она не удаляется...

1. ico 19.03.20 22:59 Сейчас в теме
Никак не пойму в чем загвоздка.
Есть регистр сведений. Непериодический, Режим записи: независимый, т.е. без регистратора.
Данные выглядят так:
Измерения:
- Объект (тип: ДокументСсылка)
Ресурсы:
- Утвержден (Тип: булево)
- ОсобоеВнимание (тип: булево)
Реквизиты:
- Ответственный (СправочникСсылка)
- ДатаИзменения (ДатаВремя)
Движения в регистр пишутся по нажатию некоторой галочки на форме документа.
Процедура ЗаписатьСостояниеФлага(ЗначениеФлага) Экспорт
	
	НаборЗаписей = РегистрыСведений.икЗаказНаПроизводствоУтвержден.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Объект.Установить(Ссылка);
	НаборЗаписей.Записать();

	Если ЗначениеФлага Тогда
	
		НоваяЗапись = НаборЗаписей.Добавить();
		НоваяЗапись.Объект = Ссылка;
		НоваяЗапись.Утвержден = ЗначениеФлага;
		НоваяЗапись.Ответственный = Пользователи.ТекущийПользователь();
		НоваяЗапись.ДатаИзменения = ТекущаяДата();
		НаборЗаписей.Записать(Истина);
	
	КонецЕсли; 
	
	
КонецПроцедуры
Показать

Так вот... Суть вопроса в следующем - почему не удаляются записи регистра первыми тремя строками этой процедуры?
Точнее не так. Если отладчиком пройтись по строкам, то после выполнения третьей строки "НаборЗаписей.Записать();" НаборЗаписей.Количество() возвращает 0. Но вот сама запись в регистре продолжает свое существование.
И самая неприятная ситуация возникает, когда документ, который является объектом для записи регистра помечается на удаление, а удалиться не может. Потому как эта самая запись в регистре содержит ссылку на него.
Что не так с регистром?
Найденные решения
4. RustamZz 20.03.20 08:54 Сейчас в теме
(1) Что бы регистр очищался при удалении измерения, у измерения должен стоять признак, что оно ведущее.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. TimoninD 20.03.20 02:29 Сейчас в теме
(1) "Ссылка" точно является ссылкой на документ? Если да, то попробуйте после установки отбора "Прочитать" и "Очистить" НаборЗаписей, а далее уже записать. А то что не удаляется документ, который участвует в этом регистре,...так это нормальное поведение.
7. ico 20.03.20 09:11 Сейчас в теме
(2) Ссылка точно является ссылкой на документ. Иначе бы не было проблем с удалением документа.
4. RustamZz 20.03.20 08:54 Сейчас в теме
(1) Что бы регистр очищался при удалении измерения, у измерения должен стоять признак, что оно ведущее.
8. ico 20.03.20 09:21 Сейчас в теме
(4) Установил признак измерения "Ведущее" у Объекта - ничего не изменилось. Я и раньше пробовал менять этот признак - не помогало.
10. RustamZz 20.03.20 09:37 Сейчас в теме
(8) Это при удалении документа должно помочь. Я правильно понял, что код нужен, что бы при удалении документа этот регистр не мешал.
12. ico 20.03.20 09:43 Сейчас в теме
(10) Нужно, чтобы при удалении документа запись регистра тоже удалялась.
Удалять документ при установленной галочке и записи регистра нельзя. При снятии галочки удалить запись в регистре.
13. RustamZz 20.03.20 09:47 Сейчас в теме
(12) Удаление это физическое удаление или пометка на удаление?
14. ico 20.03.20 10:07 Сейчас в теме
(13) Слушайте! Хотел снять скриншоты, чтобы показать как и что, провел сейчас весь цикл попытки пометки / удаления документа и увидел, что признак Ведущее у измерения Объект дало нужный эффект!
Запись регистра теперь удаляется, когда удаляется помеченный документ, который прописан в измерении Объект.
Спасибо! Разобрался.
15. SlavaKron 20.03.20 10:12 Сейчас в теме
(14) Однако, как вы в таком случае реализуете
Удалять документ при установленной галочке и записи регистра нельзя
?
16. ico 20.03.20 10:18 Сейчас в теме
(15) Ловим событие ПередЗаписью, и смотрим так:
	Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения И ПолучитьЗначениеФлагаЗаказУтвержден() Тогда
		
		ДействияПриОтменеПроведения(Отказ);
		
	ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
		
		ДействияПриПроведении(Отказ);
		
	ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.Запись И ПометкаУдаления Тогда 
		
		//Надо удалить записи в регистре сведений икЗаказНаПроизводствоУтвержден
		НаборЗаписей = РегистрыСведений.икЗаказНаПроизводствоУтвержден.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.Объект.Установить(Ссылка);
		НаборЗаписей.Записать();
		
	КонецЕсли;
Показать
18. SlavaKron 20.03.20 10:20 Сейчас в теме
(16) А зачем вы программно удаляете запись из РС, если платформа это сделает сама после фактического удаления документа?
19. ico 20.03.20 10:33 Сейчас в теме
(18) Так как регистр независимый, то и удалять надо ручками.
20. SlavaKron 20.03.20 10:34 Сейчас в теме
(19) Если удаляемый объект является ведущим измерением РС, запись удалится сама при фактическом удалении объекта.
17. ico 20.03.20 10:19 Сейчас в теме
(15) А дальше
Процедура ДействияПриОтменеПроведения(Отказ) Экспорт
	
	МассивБухтНаУдаление = ЭтотОбъект.Продукция.ВыгрузитьКолонку("СерияНоменклатуры");
	// 1. Смотрим, есть ли движения регистра по списку бухт из этого документа другими документами.
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	икСостояниеБухты.ДокументДвижения
	|ИЗ
	|	РегистрСведений.икСостояниеБухты КАК икСостояниеБухты
	|ГДЕ
	|	икСостояниеБухты.ДокументДвижения ЕСТЬ НЕ NULL 
	|	И икСостояниеБухты.ДокументДвижения <> &ТекущийДокумент
	|	И икСостояниеБухты.Объект В(&МассивБухтНаУдаление)";
	Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
	Запрос.УстановитьПараметр("МассивБухтНаУдаление", МассивБухтНаУдаление);
	Если Запрос.Выполнить().Выгрузить().Количество() = 0 Тогда
		// 2. Документов нет, можно все серии номенклатуры пометить на удаление.
		Для каждого бухта Из МассивБухтНаУдаление Цикл
			Если НЕ Бухта = Справочники.СерииНоменклатуры.ПустаяСсылка() Тогда
				Бухта.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
				НаборЗаписей = РегистрыСведений.икСостояниеБухты.СоздатьНаборЗаписей();
				НаборЗаписей.Отбор.Объект.Установить(Бухта.Ссылка);
				НаборЗаписей.Записать(Истина);
			КонецЕсли;
		КонецЦикла;
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	икРезервированиеБухты.Ссылка
		|ИЗ
		|	Документ.икРезервированиеБухты КАК икРезервированиеБухты
		|ГДЕ
		|	икРезервированиеБухты.ДокументОснование = &ДокументОснование";
		Запрос.УстановитьПараметр("ДокументОснование", Ссылка);
		ТабличкаДокументовРезервирования = Запрос.Выполнить().Выгрузить();
		Для Каждого ДокСсылка Из ТабличкаДокументовРезервирования Цикл
			
			Док = ДокСсылка.Ссылка.ПолучитьОбъект();
			Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
			Док.УстановитьПометкуУдаления(Истина);
			
		КонецЦикла;

	Иначе
		// Запрещаем отменять проведение, если есть движения других документов по бухтам из этого документа.
		ОбщегоНазначения.СообщитьОбОшибке("В документе есть бухты, состояние которых уже изменено другими документами. Изменения запрещаются.", Отказ, "Внимание!");
	КонецЕсли;

КонецПроцедуры
Показать
22. 3soft 8 13.08.21 07:32 Сейчас в теме
(4) Наткнулись на следующее. Документ и регистр добавлены в расширении. В регистре одно измерение ДБизнесПроцессСсылка.ИзКонфигурации ведущее и ресурс ДокументСсылка.НовыйДокументРасширения. Регистр сведений нужен для хранения связи нового документа и бизнес-процесса, т.к. не получилось в расширении добавить реквизит в бизнес-процесс, и доп.реквизитов/сведений для бизнес-процессов не предусмотрено. Помечаем на удаление документ и связанный бизнес-процесс. Встроенная в УТ обработка поиска и удаления объектов не дает удалить этот документ и связанный бизнес-процесс, потому что есть запись в регистре. Решили костылем: при пометке на удаление документа удаляется запись из регистра сведений.
5. RustamZz 20.03.20 08:57 Сейчас в теме
(1) Возможно у регистра в настройках Записывать измененные. Набор в первых 3 строках не меняется.
6. ico 20.03.20 09:10 Сейчас в теме
(5) А что за настройки регистра? Не знаю, где это искать.
В свойствах регистра такой опции нет.
9. RustamZz 20.03.20 09:35 Сейчас в теме
(6) Извините, ввел в заблуждение. Это свойство документа, и влияет на регистры записываемые при проведении.
3. Alexei_Siva 182 20.03.20 08:14 Сейчас в теме
Я бы ради на вашем месте ради интереса проверил будет ли регистр очищаться если перед 3-ей строкой прописать
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();

не утверждаю что заработает, но попробовать стоит.
11. ico 20.03.20 09:38 Сейчас в теме
(3) Добавил строчку
	НаборЗаписей.Прочитать();

На строчке "Прочитать()" отладчик показывает 1 запись
На строчке "Записать()" показывает 1 запись.
Т.е. не очищается набор.

Попробовал вот так:
	НаборЗаписей.Прочитать();
	НаборЗаписей.Удалить(0);
	НаборЗаписей.Записать();

Остается запись регистра. Хотя показывает, что количество записей в наборе записей = 0.
21. lishniy 132 23.03.20 16:11 Сейчас в теме
(11)
Рабочий код
МенеджерЗаписи = РегистрыСведений.РегистрацияПереоценок.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ДокументОснование	= Выборка.ДокументОснование;
МенеджерЗаписи.Прочитать();
МенеджерЗаписи.Удалить();
Оставьте свое сообщение

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