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