При работе в конфигурации 1С:Управление торговлей 10.3 технические специалисты часто сталкиваются с ситуацией, когда старые документы (например, за 2013 год) невозможно удалить стандартной обработкой «Удаление помеченных объектов». Система выдает сообщение, что на документ ссылается другой объект, созданный значительно позже — например, реализация 2018 года. При этом визуальный осмотр формы документа не выявляет никаких связей: реквизиты «Сделка», «Документ расчетов» и табличные части кажутся пустыми.
В этой статье мы подробно разберем, почему возникают такие «невидимые» связи, как их обнаружить программными средствами и какими способами можно очистить базу от ненужных данных без нарушения ссылочной целостности.
Прежде чем приступать к удалению, нам необходимо понять механику платформы 1С:Предприятие 8. Если стандартный поиск не показывает ссылку в основных реквизитах, это не значит, что её нет. Рассмотрим основные места, где может «спрятаться» ссылка:
РеализацияТоваровУслуг в 2018 году, система списывает товар по методу FIFO или LIFO. Если на остатках числится товар, поступивший по документу 2013 года, в регистре ПартииТоваровНаСкладах будет создана запись, где в измерении ДокументОприходования зафиксирована ссылка на то самое старое поступление. Удаление поступления заблокировано, пока существует эта запись.ДанныеПервичныхДокументов или специфических регистрах для обмена данными, которые не отображаются напрямую в структуре документа.Проанализируем возможности стандартных инструментов. Обработка Поиск и замена значений — это мощный инструмент, который позволяет не только заменять ссылки, но и находить их во всех таблицах базы данных, включая те, которые не видны в обычном интерфейсе.
Для этого выполним следующие шаги:
В результате мы получим список всех объектов и, что немаловажно, конкретных метаданных (регистров, табличных частей), где встречается эта ссылка. Это поможет сузить круг поиска.
Если визуальный поиск не дает результатов, обратимся к консоли запросов. Рассмотрим ситуацию, когда мы подозреваем, что ссылка скрыта в одном из реквизитов реализации, который не выведен на форму. Проанализируем объект с помощью прямого запроса ко всем полям таблицы.
Пример текста запроса для консоли:
ВЫБРАТЬ
Реализация.*
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Ссылка = &СсылкаНаРеализацию
Важный нюанс: Стандартная консоль запросов может не отображать скрытые системные поля или поля, добавленные расширениями. Однако такой запрос позволяет увидеть значения реквизитов типа Сделка, Проект, ДокументОснование и других, которые могут быть программно скрыты от пользователя. Если в результате запроса в какой-то колонке вы увидите номер и дату вашего старого поступления — причина найдена.
Наиболее точный технический способ определить «держателя» ссылки — программное использование метода платформы НайтиПоСсылкам(). Этот метод возвращает таблицу значений, в которой четко указано, какой именно объект и через какой реквизит ссылается на удаляемый элемент.
Создадим небольшую внешнюю обработку и пропишем в ней следующий код:
// Создаем массив с одной ссылкой - нашим поступлением
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаУдаляемоеПоступление);
// Получаем таблицу ссылок
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
// Перебираем результат
Для Каждого СтрокаСсылки Из ТаблицаСсылок Цикл
Сообщить("Объект-ссылка: " + СтрокаСсылки.Данные);
Сообщить("Метаданные (где сидит ссылка): " + СтрокаСсылки.Метаданные.ПолноеИмя());
КонецЦикла;
Этот метод незаменим, так как он анализирует не только документы, но и движения регистров. Если отчет покажет, что ссылка находится в РегистрНакопления.ПартииТоваровНаСкладах.Измерение.ДокументОприходования, значит, вам необходимо либо перепровести реализацию 2018 года (чтобы она подцепила другие партии), либо смириться с тем, что старое поступление должно остаться в базе для корректности партионного учета.
Рассмотрим совет, который часто дают на форумах: заменить ссылку на «пустую». Рассмотрим, как это сделать правильно, чтобы не повредить базу. Если вы выяснили, что ссылка в документе 2018 года в реквизите Сделка на самом деле ошибочна и не должна там находиться, можно воспользоваться обработкой поиска и замены, выбрав в качестве значения «На что заменять» — Пустая ссылка данного типа документа.
Внимание! Никогда не делайте этого для реквизитов в регистрах накопления (в движениях). Если вы принудительно очистите ДокументОприходования в партиях, ваш расчет себестоимости «развалится», и отчеты по прибыли будут показывать некорректные данные.
Если программные методы поиска не помогают, воспользуемся инструментами разработчика в конфигураторе. Проанализируем объект Документ.ПоступлениеТоваровУслуг. Нажмем на нем правой кнопкой мыши и выберем пункт «Поиск ссылок на объект». Конфигуратор просканирует всю структуру метаданных и покажет список всех объектов (документов, регистров, планов видов характеристик), которые потенциально могут содержать ссылки на данный тип данных.
Это поможет понять, в какие «закоулки» конфигурации стоит заглянуть. Возможно, это какой-то специфический регистр сведений, о котором вы забыли.
В некоторых сообщениях на форумах встречается совет использовать метод УдалитьОбъекты(..., Ложь). Разберем, почему это опасно. Этот метод принудительно удаляет запись из таблицы базы данных, игнорируя проверку целостности.
Последствия такого действия:
Поэтому мы рекомендуем всегда идти по пути очистки ссылающихся объектов, а не принудительного удаления источника ссылки.
Подведем итог. Если вы столкнулись с невозможностью удаления старых поступлений в УТ 10.3, действуйте по следующему алгоритму:
НайтиПоСсылкам, чтобы точно узнать имя регистра или реквизита.Сделка или в независимых регистрах и она там явно лишняя — воспользуйтесь обработкой «Поиск и замена значений».Помните, что в учетных системах документы прошлых лет часто являются «фундаментом» для текущих остатков и себестоимости. Тщательный анализ связей — залог стабильной работы вашей базы 1С.