Свертка информационной базы в «1С:Управление торговлей 10.3» — это ответственный процесс, после которого часто возникает необходимость очистки системы от старых, помеченных на удаление документов. Однако стандартная процедура «Удаление помеченных объектов» нередко сталкивается с препятствиями: система сообщает, что документ невозможно удалить, так как на него ссылается другой объект (например, Приходный кассовый ордер). Даже если визуально в документе-источнике все ссылки удалены, связь может сохраняться на уровне метаданных или скрытых реквизитов.
В этой статье мы подробно разберем, почему возникают такие «фантомные» связи, где искать скрытые ссылки и как правильно их разорвать, чтобы сохранить целостность базы данных.
Рассмотрим типичную ситуацию. Проведена свертка базы, все документы до определенной даты помечены на удаление. При попытке окончательного удаления система выдает список ссылок. Например, документ РеализацияТоваровУслуг не удаляется, так как на него ссылается ПриходныйКассовыйОрдер (ПКО).
Первым делом мы заходим в ПКО, проверяем табличную часть «Расшифровка платежа», видим там ссылку на реализацию, очищаем ее или заменяем на документ расчетов (например, «Сделку» или «Ввод остатков»), проводим документ. Казалось бы, связь разорвана. Но при повторной попытке удаления РеализацияТоваровУслуг все равно остается в списке заблокированных. Почему так происходит? Выясним причину, изучив структуру объектов 1С.
В конфигурации «Управление торговлей 10.3» (и других решениях на обычных формах) многие документы имеют реквизит шапки ДокументОснование. Особенность этого реквизита заключается в том, что разработчики часто не выводят его на форму документа. Он заполняется автоматически при создании документа на основании другого объекта (например, когда ПКО создается кнопкой «На основании» из реализации).
Проанализируем ситуацию: на форме ПКО мы видим только те данные, которые вывел разработчик (сумма, контрагент, табличная часть с расшифровкой). Однако в самой таблице базы данных в поле ДокументОснование продолжает храниться ссылка на ту самую старую реализацию. Пока это поле не будет очищено, стандартное удаление не позволит уничтожить документ-основание.
Чтобы убедиться в наличии ссылки в этом реквизите, мы можем воспользоваться консолью запросов или программным кодом:
// Пример кода для проверки значения скрытого реквизита
ДокументОбъект = СсылкаНаПКО.ПолучитьОбъект();
Сообщить("Документ основание: " + ДокументОбъект.ДокументОснование);
Разберем по шагам несколько вариантов решения этой задачи, от простых до более продвинутых.
Способ 1: Использование универсальной обработки «Поиск и замена значений»
Это самый безопасный и наглядный метод для администратора. Рассмотрим алгоритм действий:
\1c\Conversion или доступна на ИТС).Способ 2: Программная очистка реквизита
Если документов много, мы можем написать небольшую обработку. Посмотрим на пример кода, который очищает ДокументОснование в ПКО:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриходныйКассовыйОрдер.Ссылка КАК Ссылка
|ИЗ
| Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
|ГДЕ
| ПриходныйКассовыйОрдер.ДокументОснование = &СтараяРеализация";
Запрос.УстановитьПараметр("СтараяРеализация", ОбъектДляУдаления);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ОбъектПКО = Результат.Ссылка.ПолучитьОбъект();
ОбъектПКО.ДокументОснование = Неопределено; // Или соответствующее пустое значение типа
ОбъектПКО.Записать(РежимЗаписиДокумента.Запись);
// Используем просто запись, чтобы не пересчитывать движения, если ПКО уже был скорректирован
КонецЦикла;
Важно помнить, что в УТ 10.3 документ может быть «привязан» не только через реквизиты, но и через записи в регистрах. Проанализируем основные регистры, где может «застрять» ссылка:
ДокументРасчетов.Если вы очистили все реквизиты в самом документе (шапку и ТЧ), но ПКО остается проведенным, он продолжает удерживать ссылку через свои движения. В этом случае необходимо либо перепровести документ (чтобы он сформировал новые движения без учета старой реализации), либо воспользоваться обработкой «Корректировка записей регистров», если свертка выполнялась вручную.
Иногда специалисты предлагают использовать метод Объект.Удалить() для непосредственного удаления документа без проверки ссылочной целостности. Рассмотрим риски этого подхода. Прямое удаление приведет к появлению «битых ссылок» (надписей вида <Объект не найден> (84:9f...)) во всех связанных объектах. Это может нарушить работу отчетов по взаиморасчетам и привести к ошибкам при выполнении регламентных операций.
Поэтому мы рекомендуем всегда сначала находить и корректно очищать ссылки через НайтиСсылки() или стандартный механизм удаления помеченных, и только в исключительных случаях, на копии базы, прибегать к прямому удалению с последующим Тестированием и Исправлением (ТиИ) для очистки ссылок «в никуда».
Подводя итоги, если после свертки базы в УТ 10.3 вы не можете удалить документ из-за связи с другим объектом, выполните следующие действия:
ДокументОснование) с помощью консоли запросов.Такой системный подход позволит вам поддерживать информационную базу в чистоте и избегать ошибок при формировании аналитической отчетности после свертки.