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