Часто при разработке на платформе 1С:Предприятие мы сталкиваемся с ситуацией, когда данные в независимых регистрах сведений препятствуют удалению ссылочных объектов (документов или справочников). Рассмотрим, почему это происходит и как правильно управлять жизненным циклом таких записей.
Самым элегантным решением проблемы обеспечения целостности данных является использование механизма «Ведущих» измерений. Если измерение регистра помечено как Ведущее, платформа автоматически берет на себя заботу об удалении записей регистра при физическом удалении связанного объекта.
Для настройки выполните следующие действия:
Важно: этот механизм работает именно при физическом удалении объекта из информационной базы. Если объект просто помечен на удаление, запись в регистре останется до тех пор, пока не будет запущена стандартная обработка «Удаление помеченных объектов» и не будет произведено окончательное удаление данных.
Если вам нужно управлять записями регистра вручную, например, при снятии определенных признаков или выполнении специфической логики, самым надежным инструментом является РегистрыСведенийМенеджерЗаписи. Этот объект работает с конкретной записью и требует заполнения всех ключей.
Рассмотрим пример кода для удаления записи:
МенеджерЗаписи = РегистрыСведений.ИмяВашегоРегистра.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = СсылкаНаОбъект;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Удалить();
КонецЕсли;
Когда требуется очистить регистр по некоторому критерию или отбору (например, при отмене проведения документа), удобнее использовать РегистрыСведенийНаборЗаписей. При работе с набором крайне важно соблюдать строгую последовательность методов, иначе записи не будут удалены.
Разберем этапы работы с набором:
СоздатьНаборЗаписей().Набор.Отбор.Объект.Установить(Ссылка);Прочитать(), чтобы платформа загрузила данные из базы в объект.Очистить() для удаления всех элементов из набора в оперативной памяти.Записать() для фиксации изменений в базе данных.Пример реализации в событии ПередЗаписью документа:
Если РежимЗаписи = РежимЗаписиДокумента.Запись И ПометкаУдаления Тогда
НаборЗаписей = РегистрыСведений.ВашРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Ссылка);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
КонецЕсли;
Чаще всего проблемы возникают из-за того, что платформа 1С защищает ссылочную целостность. Если на какой-либо объект (документ или элемент справочника) существует активная ссылка в регистре сведений, система не позволит физически удалить этот объект, так как это приведет к появлению «битых» ссылок.
Анализируя ситуацию, помните:
НаборЗаписей.Записать() без предварительного чтения, вы фактически записываете в регистр «пустой» набор, который может ничего не сделать, если не было предварительного обращения к данным базы.Используйте эти методы, чтобы сделать вашу систему более стабильной и предсказуемой в вопросах управления данными!