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