Как найти и пометить на удаление заказы покупателей без связей и оснований в 1С:Управление торговлей 10.3

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

В процессе эксплуатации 1С:Управление торговлей 10.3 часто возникает ситуация, когда в базе накапливается большое количество «мусорных» заказов покупателей. Это документы, которые были созданы по ошибке, не были доведены до сделки и при этом не имеют ни документа-основания, ни подчиненных документов (реализаций, счетов, оплат). В этой статье мы подробно разберем, как автоматизировать процесс их поиска и корректно пометить на удаление, не нарушив целостность данных.

Анализ структуры связей документа

Прежде чем приступать к удалению, проанализируем, что именно мы считаем «одиноким» заказом. В системе 1С:Предприятие 8 связи между объектами могут быть реализованы двумя способами. Во-первых, через реквизит ДокументОснование (или аналогичные по смыслу реквизиты, например, Сделка). Во-вторых, через подчиненные документы, которые ссылаются на наш заказ. Чтобы документ считался полностью изолированным, он должен соответствовать двум условиям:

  1. Поле ДокументОснование у самого заказа должно быть пустым.
  2. В базе не должно существовать других объектов, которые ссылаются на данный ЗаказПокупателя.

Рассмотрим подробнее способы реализации этой проверки.

Способ 1: Использование консоли запросов и критериев отбора

В конфигурации УТ 10.3 существует стандартный механизм для отслеживания иерархии документов — критерий отбора СвязанныеДокументы. Мы можем использовать его в запросе, чтобы быстро найти те заказы, по которым нет никаких движений в структуре подчиненности.

Разберем логику построения такого запроса. Нам необходимо выбрать все заказы и попытаться «присоединить» к ним данные из таблицы критерия отбора. Если данных в правой таблице нет, значит, подчиненных документов не существует.


ВЫБРАТЬ
    Заказ.Ссылка КАК ЗаказСсылка
ИЗ
    Документ.ЗаказПокупателя КАК Заказ
ЛЕВОЕ СОЕДИНЕНИЕ 
    КритерийОтбора.СвязанныеДокументы(Заказ.Ссылка) КАК Связи
ПО ИСТИНА
ГДЕ
    Заказ.ДокументОснование = ЗНАЧЕНИЕ(Документ.ПустаяСсылка)
    И Связи.Ссылка ЕСТЬ NULL
    И Заказ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Важный нюанс: Использование критериев отбора непосредственно в запросах с параметрами может иметь ограничения по производительности на больших базах. Поэтому проанализируем альтернативный метод проверки через реквизиты подчиненных документов.

Способ 2: Программный поиск ссылок (метод НайтиСсылки)

Этот метод является самым надежным, так как он проверяет не только логические связи (структуру подчиненности), но и любые упоминания документа в регистрах сведений, накопления и задачах. Однако стандартный поиск ссылок часто путает пользователя, показывая записи в технических регистрах (например, РегистрСведений.ОбъектыДоступаДокументов). Нам необходимо программно отсеять эти технические записи.

Рассмотрим алгоритм на языке 1С:


Процедура ПометитьОдинокиеЗаказы()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ЗаказПокупателя.Ссылка
        |ИЗ
        |	Документ.ЗаказПокупателя КАК ЗаказПокупателя
        |ГДЕ
        |	ЗаказПокупателя.ДокументОснование = ЗНАЧЕНИЕ(Документ.ПустаяСсылка)
        |	И ЗаказПокупателя.ПометкаУдаления = ЛОЖЬ";
    
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        МассивСсылок = Новый Массив;
        МассивСсылок.Добавить(Результат.Ссылка);
        
        ТаблицаСсылок = НайтиСсылки(МассивСсылок);
        
        // Анализируем найденные ссылки
        ЕстьРеальныеСвязи = Ложь;
        Для Каждого СтрокаСсылки Из ТаблицаСсылок Цикл
            // Исключаем системные объекты и сам документ
            Если Метаданные.РегистрыСведений.Содержит(СтрокаСсылки.Данные.Метаданные()) Тогда
                Продолжить;
            КонецЕсли;
            
            Если СтрокаСсылки.Данные = Результат.Ссылка Тогда
                Продолжить;
            КонецЕсли;
            
            // Если нашли другой документ - значит связь есть
            Если Метаданные.Документы.Содержит(СтрокаСсылки.Данные.Метаданные()) Тогда
                ЕстьРеальныеСвязи = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        Если НЕ ЕстьРеальныеСвязи Тогда
            ОбъектЗаказа = Результат.Ссылка.ПолучитьОбъект();
            ОбъектЗаказа.УстановитьПометкуУдаления(Истина);
            Сообщить("Помечен на удаление: " + Результат.Ссылка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

В данном примере мы используем функцию НайтиСсылки(), которая возвращает таблицу. Мы перебираем эту таблицу и проверяем тип найденных объектов. Если ссылка ведет на РегистрСведений, мы её игнорируем, так как это могут быть служебные записи. Если же мы находим другой Документ, мы понимаем, что заказ связан с цепочкой продаж и трогать его нельзя.

Способ 3: Метод «от противного» (через копию базы)

Иногда быстрее и проще пойти экспериментальным путем. Этот способ подходит для системных администраторов и опытных пользователей, которым нужно быстро очистить базу без написания кода.

  1. Создаем полную копию рабочей информационной базы.
  2. В копии заходим в список документов Заказы покупателей.
  3. Выделяем абсолютно все документы (Ctrl+A) и устанавливаем пометку на удаление.
  4. Запускаем стандартную процедуру «Удаление помеченных объектов» (в монопольном режиме).
  5. При удалении платформа 1С автоматически проверит все связи. Те документы, на которые есть ссылки (основания, реализации, оплаты), не будут удалены.
  6. После завершения процесса мы получим список документов, которые «выжили». Это и есть связанные заказы.
  7. Теперь мы можем выгрузить список этих ссылок или их номера и в рабочей базе пометить на удаление все заказы, кроме тех, что остались в копии.

Этот метод гарантирует, что вы не удалите ничего лишнего, так как контроль ссылочной целостности на уровне платформы — самый строгий фильтр.

Меры предосторожности при работе с регистрами

Выясним причину, по которой автор вопроса упоминал РегистрСведенийКлючЗаписи. При записи или проведении документа в УТ 10.3 система генерирует записи в различных регистрах (например, ЗаказыПокупателей, Продажи, ДополнительныеСведения).

Важно помнить:

Использование групповой обработки

Если вы не хотите писать код, можно воспользоваться типовой консолью Групповая обработка справочников и документов, которая встроена в УТ 10.3 (меню «Сервис»).

Проанализируем ситуацию: в стандартной обработке можно легко настроить фильтр Документ основание Равно [Пустая ссылка]. Однако она не умеет проверять наличие подчиненных документов. Поэтому данный инструмент эффективен только как первый этап фильтрации. После него всё равно потребуется ручная проверка или использование одного из описанных выше программных методов.

Рассмотрим резюме: для качественной очистки базы лучше всего сочетать Способ 2 (программный перебор) с предварительным анализом через консоль запросов. Это позволит вам точно контролировать процесс и избежать удаления важных данных, которые могут быть связаны с заказами косвенно.

← На главную