Удаление помеченных при ограниченных правах (часть 2)

Это продолжение темы, начатой в записи http://progsfor1c.ru/?p=73. Здесь выложена новая обработка (обычное и управляемое приложения) удаления помеченных на удаление объектов, рассуждаю о её проблемах и одной скрытой проблеме в реализации этого функционала в платформе 1С:Предприятие 8.х.
Обработка удаления вер 02

При более близком рассмотрении процесса удаления объектов выяснилось, что:

1. Удаление в монопольном режиме платформой 1С:Предприятие делается не случайно, но всё равно является излишним. Монопольный режим платформе требуется, так как она не может гарантировать, что какая-то часть программы не сохранит ссылку в памяти и потом не вставит её в объект. Как следствие объект может быть сохранен с «битой» ссылкой.

2. Так же в платформенном механизме удаления помеченных объектов обнаружен следующий дефект: при неправильном порядке удаления взаимозависимых объектов появляются «битые» ссылки.

Второе поясню на примере: есть два справочника, которые перекрёстно ссылаются друг на друга, причём один из них при удалении, проверяет другой. Так вот, если сначала удалить тот, который проверяет, то будет всё нормально. Если удалить сначала проверяемый, то при удалении проверяющего произойдёт ошибка и удаление выполнено не будет. Этот объект останется с «битой» ссылкой.

Проблему номер 1 можно победить только регламентными мерами: запретить использовать ссылки на уже помеченные объекты. Автоматизировать этот регламент можно выполнив подписку на событие записи всех объектов и наборов и там запрещать сохранять данные с ссылками на помеченные объекты на всё время процесса удаления.

Для проблемы номер 2 пока видится следующее решение: выделять случаи имеющие перекрёстные ссылки (это в обработке уже реализовано) и полным перебором всех возможных порядков пытаться удалить в транзакции. Но над этим надо ещё подумать.

Ещё пара замечаний по реализации в обработке. Сейчас в ней реализовано два способа поиска объектов которые могут быть удалены. Первый: циклический — перебор массива ссылок и исключение из него ссылок на не удаляемые объекты. Второй: рекурсивный — поиск всех влияющих объектов и если влияющих нет, то удаление. Пока оставлены оба, что бы выбрать наиболее оптимальный, хотя только второй реализует выделение группы объектов с циклическими ссылками.

Собственно обработка: УдалениеПомеченных (вер.02).

Добавить комментарий

Ваш e-mail не будет опубликован.