Как в запросе 1С отобрать документы, помеченные на удаление, и почему их нет в регистрах?

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

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

Причина отсутствия данных в регистрах

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

  1. Документ переходит в состояние "не проведен".
  2. Все движения документа по регистрам накопления и бухгалтерии автоматически удаляются.

Таким образом, если мы делаем запрос к таблице РегистрНакопления.Продажи, мы физически не сможем найти там записи, связанные с помеченным на удаление документом РеализацияТоваровУслуг. Записей в этой таблице просто не существует. Выясним, как обойти это ограничение.

Обращение к таблице документов

Для того чтобы получить данные о помеченных на удаление объектах, мы должны обращаться напрямую к физической таблице документа. Рассмотрим пример правильного обращения к документам реализации с фильтром по пометке удаления и дополнительному реквизиту:


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

В данном случае мы работаем с основной таблицей документов, где хранятся все записи — и проведенные, и помеченные на удаление, и просто записанные черновики. Это единственный надежный способ "увидеть" удаленные объекты.

Исправление синтаксических ошибок в запросе

Разберем распространенную ошибку синтаксиса, упомянутую в обсуждении: ССЫЛКА Документ.РеализацияТоваровУслугПомеченыеНаУдаления. В языке запросов 1С не существует отдельной таблицы для удаленных документов. Пометка на удаление — это не тип данных, а свойство (реквизит) объекта.

Правильный алгоритм проверки типа и состояния документа в сложном запросе (например, когда мы работаем с составным типом Регистратор в списке значений) выглядит следующим образом:


ВЫБОР
    КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
        И Продажи.Регистратор.ПометкаУдаления = ИСТИНА
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
КОНЕЦ

Важный нюанс: Обращение через точку от составного типа (Регистратор.ПометкаУдаления) может существенно замедлить выполнение запроса. Если база данных велика, рекомендуется сначала отобрать ссылки во временную таблицу, а затем соединить её с основной таблицей документа РеализацияТоваровУслуг.

Комбинированный подход: объединение данных

Если нам нужно получить и данные из регистров (по проведенным документам), и данные по помеченным на удаление объектам, оптимальным решением будет использование оператора ОБЪЕДИНИТЬ ВСЕ. Рассмотрим структуру такого запроса:


// Часть 1: Получаем данные по движениям из регистра
ВЫБРАТЬ
    Продажи.Регистратор КАК Ссылка,
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Количество КАК Количество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &НачПериода И &КонПериода

ОБЪЕДИНИТЬ ВСЕ

// Часть 2: Добираем данные из табличных частей удаленных документов
ВЫБРАТЬ
    РеализацияТовары.Ссылка,
    РеализацияТовары.Номенклатура,
    РеализацияТовары.Количество
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
    РеализацияТовары.Ссылка.ПометкаУдаления = ИСТИНА
    И РеализацияТовары.Ссылка.Дата МЕЖДУ &НачПериода И &КонПериода
    И РеализацияТовары.Ссылка.СпособВыгрузкиВЭДО = &ВсегдаВыгружать

Проанализируем этот пример. В первой части мы берем актуальные движения. Во второй части мы обращаемся к табличной части документа, так как нам нужны данные о товарах, которых в регистре уже нет из-за пометки удаления. Обратите внимание, что при использовании ОБЪЕДИНИТЬ ВСЕ количество и порядок колонок должны строго совпадать.

Рекомендации по оптимизации

Работа с помеченными на удаление объектами требует внимательности к производительности:

  1. Фильтр по периоду: Всегда ограничивайте выборку документов по дате. Поиск по всей таблице документов РеализацияТоваровУслуг без индекса по дате может "повесить" систему.
  2. Проверка типа: Используйте конструкцию ССЫЛКА, если поле может содержать ссылки на разные типы документов.
  3. Индексация: Помните, что стандартный реквизит ПометкаУдаления проиндексирован системой, но эффективнее всего он работает в паре с Дата или Проведен.

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

← На главную