Удаляем запись независимого регистра сведений, а она не удаляется...
Никак не пойму в чем загвоздка.
Есть регистр сведений. Непериодический, Режим записи: независимый, т.е. без регистратора.
Данные выглядят так:
Измерения:
- Объект (тип: ДокументСсылка)
Ресурсы:
- Утвержден (Тип: булево)
- ОсобоеВнимание (тип: булево)
Реквизиты:
- Ответственный (СправочникСсылка)
- ДатаИзменения (ДатаВремя)
Движения в регистр пишутся по нажатию некоторой галочки на форме документа.
Так вот... Суть вопроса в следующем - почему не удаляются записи регистра первыми тремя строками этой процедуры?
Точнее не так. Если отладчиком пройтись по строкам, то после выполнения третьей строки "НаборЗаписей.Записать();" НаборЗаписей.Количество() возвращает 0. Но вот сама запись в регистре продолжает свое существование.
И самая неприятная ситуация возникает, когда документ, который является объектом для записи регистра помечается на удаление, а удалиться не может. Потому как эта самая запись в регистре содержит ссылку на него.
Что не так с регистром?
Есть регистр сведений. Непериодический, Режим записи: независимый, т.е. без регистратора.
Данные выглядят так:
Измерения:
- Объект (тип: ДокументСсылка)
Ресурсы:
- Утвержден (Тип: булево)
- ОсобоеВнимание (тип: булево)
Реквизиты:
- Ответственный (СправочникСсылка)
- ДатаИзменения (ДатаВремя)
Движения в регистр пишутся по нажатию некоторой галочки на форме документа.
Процедура ЗаписатьСостояниеФлага(ЗначениеФлага) Экспорт
НаборЗаписей = РегистрыСведений.икЗаказНаПроизводствоУтвержден.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Ссылка);
НаборЗаписей.Записать();
Если ЗначениеФлага Тогда
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = Ссылка;
НоваяЗапись.Утвержден = ЗначениеФлага;
НоваяЗапись.Ответственный = Пользователи.ТекущийПользователь();
НоваяЗапись.ДатаИзменения = ТекущаяДата();
НаборЗаписей.Записать(Истина);
КонецЕсли;
КонецПроцедуры
ПоказатьТак вот... Суть вопроса в следующем - почему не удаляются записи регистра первыми тремя строками этой процедуры?
Точнее не так. Если отладчиком пройтись по строкам, то после выполнения третьей строки "НаборЗаписей.Записать();" НаборЗаписей.Количество() возвращает 0. Но вот сама запись в регистре продолжает свое существование.
И самая неприятная ситуация возникает, когда документ, который является объектом для записи регистра помечается на удаление, а удалиться не может. Потому как эта самая запись в регистре содержит ссылку на него.
Что не так с регистром?
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(13) Слушайте! Хотел снять скриншоты, чтобы показать как и что, провел сейчас весь цикл попытки пометки / удаления документа и увидел, что признак Ведущее у измерения Объект дало нужный эффект!
Запись регистра теперь удаляется, когда удаляется помеченный документ, который прописан в измерении Объект.
Спасибо! Разобрался.
Запись регистра теперь удаляется, когда удаляется помеченный документ, который прописан в измерении Объект.
Спасибо! Разобрался.
(15) Ловим событие ПередЗаписью, и смотрим так:
Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения И ПолучитьЗначениеФлагаЗаказУтвержден() Тогда
ДействияПриОтменеПроведения(Отказ);
ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ДействияПриПроведении(Отказ);
ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.Запись И ПометкаУдаления Тогда
//Надо удалить записи в регистре сведений икЗаказНаПроизводствоУтвержден
НаборЗаписей = РегистрыСведений.икЗаказНаПроизводствоУтвержден.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Ссылка);
НаборЗаписей.Записать();
КонецЕсли;
Показать
(15) А дальше
Процедура ДействияПриОтменеПроведения(Отказ) Экспорт
МассивБухтНаУдаление = ЭтотОбъект.Продукция.ВыгрузитьКолонку("СерияНоменклатуры");
// 1. Смотрим, есть ли движения регистра по списку бухт из этого документа другими документами.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| икСостояниеБухты.ДокументДвижения
|ИЗ
| РегистрСведений.икСостояниеБухты КАК икСостояниеБухты
|ГДЕ
| икСостояниеБухты.ДокументДвижения ЕСТЬ НЕ NULL
| И икСостояниеБухты.ДокументДвижения <> &ТекущийДокумент
| И икСостояниеБухты.Объект В(&МассивБухтНаУдаление)";
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
Запрос.УстановитьПараметр("МассивБухтНаУдаление", МассивБухтНаУдаление);
Если Запрос.Выполнить().Выгрузить().Количество() = 0 Тогда
// 2. Документов нет, можно все серии номенклатуры пометить на удаление.
Для каждого бухта Из МассивБухтНаУдаление Цикл
Если НЕ Бухта = Справочники.СерииНоменклатуры.ПустаяСсылка() Тогда
Бухта.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
НаборЗаписей = РегистрыСведений.икСостояниеБухты.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Бухта.Ссылка);
НаборЗаписей.Записать(Истина);
КонецЕсли;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| икРезервированиеБухты.Ссылка
|ИЗ
| Документ.икРезервированиеБухты КАК икРезервированиеБухты
|ГДЕ
| икРезервированиеБухты.ДокументОснование = &ДокументОснование";
Запрос.УстановитьПараметр("ДокументОснование", Ссылка);
ТабличкаДокументовРезервирования = Запрос.Выполнить().Выгрузить();
Для Каждого ДокСсылка Из ТабличкаДокументовРезервирования Цикл
Док = ДокСсылка.Ссылка.ПолучитьОбъект();
Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Док.УстановитьПометкуУдаления(Истина);
КонецЦикла;
Иначе
// Запрещаем отменять проведение, если есть движения других документов по бухтам из этого документа.
ОбщегоНазначения.СообщитьОбОшибке("В документе есть бухты, состояние которых уже изменено другими документами. Изменения запрещаются.", Отказ, "Внимание!");
КонецЕсли;
КонецПроцедуры
Показать
(4) Наткнулись на следующее. Документ и регистр добавлены в расширении. В регистре одно измерение ДБизнесПроцессСсылка.ИзКонфигурации ведущее и ресурс ДокументСсылка.НовыйДокументРасширения. Регистр сведений нужен для хранения связи нового документа и бизнес-процесса, т.к. не получилось в расширении добавить реквизит в бизнес-процесс, и доп.реквизитов/сведений для бизнес-процессов не предусмотрено. Помечаем на удаление документ и связанный бизнес-процесс. Встроенная в УТ обработка поиска и удаления объектов не дает удалить этот документ и связанный бизнес-процесс, потому что есть запись в регистре. Решили костылем: при пометке на удаление документа удаляется запись из регистра сведений.
(3) Добавил строчку
На строчке "Прочитать()" отладчик показывает 1 запись
На строчке "Записать()" показывает 1 запись.
Т.е. не очищается набор.
Попробовал вот так:
Остается запись регистра. Хотя показывает, что количество записей в наборе записей = 0.
НаборЗаписей.Прочитать();
На строчке "Прочитать()" отладчик показывает 1 запись
На строчке "Записать()" показывает 1 запись.
Т.е. не очищается набор.
Попробовал вот так:
НаборЗаписей.Прочитать();
НаборЗаписей.Удалить(0);
НаборЗаписей.Записать();
Остается запись регистра. Хотя показывает, что количество записей в наборе записей = 0.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот