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