Удаление помеченных на удаление объектов с архивом, наглядными ссылками и без монопольного режима
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Зачем это нужно
Внедренец рано или поздно чистит чужую базу. Типовые ситуации:
- Хвосты после переноса данных. Загрузили справочники и остатки из старой системы, обнаружили ошибку, загрузили еще раз. В базе дубли, тестовые документы и элементы, на которые уже успели сослаться.
- Подготовка базы к запуску. Перед стартом нужно убрать тестовые документы за период обучения, но оставить настроенные справочники.
- Плановая чистка. Пользователи годами помечают объекты на удаление, а удалять их некому: штатное удаление требует выгнать всех из базы.
- Мусор от интеграций и обработок. Обмен или загрузка создали тысячи лишних элементов, их нужно найти по условию и удалить вместе с зависимыми документами.
- Записи регистров сведений. Нужно удалить настройки, цены или служебные записи по отбору, а не по одной в форме списка.
- Перед удалением важно понять, кто держит объект. Какие документы, константы и регистры на него ссылаются и что будет, если удалить его вместе с ними.
Во всех этих случаях база рабочая, пользователи в ней работают, а остановить ее на час ради удаления никто не даст.
И есть две боли, из-за которых удаления боятся больше всего.
Удалили лишнее. Данные удалили, а через пару дней пользователь вспоминает: «Мне это было нужно». В базе этого уже нет. Восстанавливать всю базу из архива долго, а все, что ввели за эти дни, придется переносить вручную. Для внедренца это одна из самых неприятных ситуаций в проекте.
Повторные прогоны переноса. Скрипты и обработки переноса редко срабатывают с первого раза. После каждого прогона часть данных дублируется, и обычно базу каждый раз восстанавливают из архива. На большой базе это часы ожидания на каждую итерацию.
Почему не подходят готовые решения
Стандартное удаление помеченных требует монопольного режима. Платформенный метод УдалитьОбъекты с контролем ссылок работает только в монопольном доступе к базе. Значит, всех пользователей нужно выгнать, фоновые задания остановить, а удаление перенести на ночь или выходные. Кроме того, оно работает только с помеченными объектами: отобрать «документы за март от этого контрагента» и удалить их нельзя.
Известные сторонние решения сделаны как комбайны.
- Многие требуют встраивания в конфигурацию или расширения. У клиента на поддержке это отдельное согласование и обновление базы.
- В них десятки функций рядом с удалением, и чтобы удалить пару сотен объектов, приходится разбираться в интерфейсе и настройках.
- Высокий порог входа: чтобы доверить инструменту удаление данных клиента, нужно понять, что именно он делает. В большом комбайне это часы.
- Часть решений писались под обычные формы или под конкретную типовую конфигурацию и в доработанной базе не запускаются.
Внедренцу нужен другой инструмент: один файл, одна форма, понятный результат.
Что умеет обработка
Главное 1. Архив удаленного: ошибку можно отменить
Перед удалением обработка сохраняет все удаляемые объекты и записи регистров сведений в XML-файл на компьютер пользователя. Каждое удаление пишется в отдельный файл с датой и временем. Если архив записать не удалось, данные не удаляются.
- Удалили лишнее? Команда «Восстановить данные из архива» возвращает удаленное в рабочую базу, без восстановления всей базы и без потери того, что пользователи ввели за это время. Объекты, которые уже есть в базе, не перезаписываются.
- Повторные прогоны переноса. Вместо того чтобы каждый раз разворачивать базу из архива, пометьте дубли и удалите их обработкой. Прогнали перенос, почистили, поправили скрипт, прогнали снова. И у вас всегда есть файл с тем, что удалили.
Главное 2. Видно, почему объект не удаляется
Хотите удалить элемент справочника, а на него есть ссылки в других объектах. Искать их вручную долго, а штатный поиск ссылок живет отдельно от удаления: по нему не видно, какие из ссылок помешают, а какие уйдут вместе с объектом.
Здесь слева все объекты к удалению со счетчиками ссылок, справа сами ссылки. Становитесь на объект, и справа остаются только его ссылки: какой документ, константа или запись регистра его держит и помечена ли она сама на удаление. После удаления в таблице остаются именно те ссылки, из-за которых что-то не удалилось.
И еще
- Без монопольного режима. Удаляет прямо в рабочее время, пользователи продолжают работать.
- Любая конфигурация. Все списки и запросы строятся по метаданным на лету. Ни одного вызова общих модулей конфигурации, БСП не нужна. Проверено на пустой конфигурации.
- Управляемые формы, без модальных окон. Работает в базах с запретом модальности.
- Ничего не нужно встраивать. Один файл .epf, открывается через «Файл - Открыть».
- Отбор как в отчетах. Выбираете справочник, документ или регистр сведений из списка и настраиваете отбор по любым полям, включая поля через точку. Либо берете все помеченные на удаление одной кнопкой. Либо пишете произвольный запрос в конструкторе.
- Пометить на удаление и сами объекты, и тех, кто на них ссылается. Записи независимых регистров сведений при этом удаляются.
- Быстро. Удаление и пометка порциями по 100 объектов в транзакции, проверки делаются пакетными запросами, а не чтением каждого объекта.
Ноу-хау внутри
- Отбор по любой таблице без макета СКД. Схема компоновки строится в коде запросом вида
ВЫБРАТЬ * ИЗ Справочник.X {ГДЕ Т.Ссылка.*}, а ее отбор выведен на форму. Получается стандартный редактор отбора для любого справочника, документа или регистра сведений, без единого макета. - Поиск ссылок одним запросом. По метаданным собираются только те реквизиты, табличные части, константы и измерения регистров, тип которых может содержать нужную ссылку, и склеиваются в один «ОБЪЕДИНИТЬ ВСЕ» с соединением с временной таблицей искомых ссылок. На больших объемах это альтернатива
НайтиПоСсылкам, который просматривает всю базу. - Свой контроль ссылочной целостности вместо монопольного
УдалитьОбъекты. Объект удаляется, только если каждая ссылка на него либо из объекта, который тоже удаляется, либо из записи регистра сведений, где он стоит в ведущем измерении. Такую запись платформа удаляет вместе с объектом. Движения регистров учитываются через их документ-регистратор. Ссылка из константы или из неведущего измерения удаление запрещает. - Итеративный расчет вместо рекурсии. Из выбранных объектов по кругу исключаются те, на которые ссылается кто-то неудаляемый, пока исключать нечего. Цепочки любой длины и циклические ссылки обрабатываются без ограничения глубины.
- Правильный порядок и откат. Сначала удаляются ссылающиеся объекты, потом те, на кого они ссылаются. Если объект не удалился с ошибкой, порция откатывается, список пересчитывается, и то, на что он ссылается, уже не удаляется. Сбой посередине не оставляет битых ссылок.
- Архив в формате типовой выгрузки XML. Файл совместим с «Выгрузкой и загрузкой данных XML». Сервер собирает его в памяти, клиент сохраняет в свой каталог, так что в клиент-серверном варианте архив не теряется на сервере. При восстановлении объекты, которые уже есть в базе, пропускаются.
Как это выглядит: пример на демо-базе
Демо-база склада: после переноса данных в номенклатуре осталась группа из 8 дублей, в базе есть тестовые документы, лишние склады и контрагенты. Все они помечены на удаление, но часть еще используется.
1. Выбор справочника. Список строится по метаданным текущей конфигурации, настраивать ничего не нужно.

2. Отбор и заполнение. Отбор по любым полям, как в отчетах. Здесь «Родитель = Перенос 2019», группы исключены по умолчанию. «Заполнить объектами» переносит все 8 дублей в список к удалению.

3. Кто держит объект. После «Найти ссылки на объекты» у каждого дубля видно число ссылок. При переходе на строку справа остаются только ее ссылки: «Масло подс. 1л» попало в рабочий документ, и этот документ не помечен на удаление.

4. Все помеченные одной кнопкой. «Заполнить всеми помеченными на удаление» собирает 16 объектов разных видов: номенклатуру, документы, склады, контрагентов.

5. Удаление. Удалено 13 из 16 объектов, вместе с тестовыми документами удалились и дубли, которые держали только они. Цены дублей лежали в регистре по ведущему измерению и удалились сами. Остались три объекта: дубль из рабочего документа, склад из константы «Основной склад» и склад из регистра ответственных. Справа видно, что именно их держит.

6. Произвольный запрос. Когда отбора не хватает, пишете запрос с полем «Ссылка». Здесь отобраны товары без основного поставщика. Пометку удаления обработка дочитывает сама, даже если ее нет в запросе.

Как начать
- Откройте файл через «Файл - Открыть».
- На вкладке «Настройки» включите архив и укажите каталог.
- Отберите объекты: справочник, документ или регистр с отбором, произвольный запрос или все помеченные на удаление.
- Нажмите «Найти ссылки» и посмотрите, кто держит объекты.
- При необходимости пометьте на удаление ссылающиеся объекты и добавьте их в список.
- Нажмите «Удалить объекты». В сообщениях будет сколько удалено, а в таблице справа останутся ссылки, из-за которых что-то не удалилось.
Ограничения
- Удаление доступно только пользователю с правом «Администрирование». Поиск ссылок и удаление идут в привилегированном режиме, чтобы не пропустить ссылки в данных, закрытых правами.
- Без монопольного режима есть узкое окно: если пользователь сослался на объект между поиском ссылок и удалением, эта ссылка станет битой. Старые данные обычно никто не трогает, но помните об этом.
- Нужны управляемое приложение и платформа 8.3.9 или новее. Проверено в режиме совместимости 8.3.16 на платформе 8.3.27.
- Базы с разделением данных не поддерживаются.
- Перед массовым удалением сделайте резервную копию базы. Архив обработки ее не заменяет.
- Архив хранит сами объекты и записи регистров сведений, но не движения удаленных документов. Восстановленный документ нужно перепровести. Для помеченных на удаление документов это обычно не важно: движений у них, как правило, нет.
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.12.348
Вступайте в нашу телеграмм-группу Инфостарт