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

Программист 1С v7.7 Управленческий учет
← На главную

В процессе разработки отчетов и обработок на платформе 1С:Предприятие 7.7 часто возникает необходимость тонкой настройки выборки данных. Одной из типичных задач является исключение из результата запроса документов, которые были помечены пользователем на удаление, но еще не стерты из базы данных физически. Если этого не сделать, итоговые суммы в отчетах могут оказаться недостоверными, так как будут включать в себя «мусорные» данные.

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

Использование директивы Обрабатывать

Для управления выборкой объектов по признаку их «жизненного цикла» (помечен на удаление или нет) в языке запросов 1С 7.7 предусмотрена специальная директива Обрабатывать. Рассмотрим ее синтаксис и возможные значения. Рассмотрим ситуацию: у нас есть стандартный запрос по документам Реализация, и мы хотим видеть только те объекты, которые не находятся в «корзине».

Для этого в текст запроса необходимо добавить следующую строку:

|Обрабатывать НеПомеченныеНаУдаление;

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

Совместное использование с фильтром по проведенным документам

Часто возникает вопрос: не возникнет ли конфликта, если мы одновременно захотим отфильтровать документы и по пометке удаления, и по статусу проведения? Выясним причину опасений: в языке запросов 7.7 существует отдельная директива ОбрабатыватьДокументы, которая отвечает за фильтрацию проведенных и непроведенных документов.

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


Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Период с НачДата по КонДата;
|Обрабатывать НеПомеченныеНаУдаление;
|ОбрабатыватьДокументы Непроведенные;
|ФирмаЗ = Документ.Реализация.Фирма;
|Контр = Документ.Реализация.Контрагент;
|СумОтгруз = Документ.Реализация.СуммаВзаиморасчетов;
|Функция СуммаСумм = Сумма(СумОтгруз);
|Группировка Документ;
|Условие (ФирмаЗ = Фирма);
|Условие (Контр = Контрагент);
|";

Проанализируем работу этой конструкции. Важно понимать, что директивы Обрабатывать и ОбрабатыватьДокументы работают по принципу логического «И». Это значит, что в итоговую выборку попадут только те документы, которые удовлетворяют обоим условиям одновременно. Конфликта между ними не возникает, так как они проверяют разные системные реквизиты объекта.

Технические нюансы и производительность

Рассмотрим, почему использование директив предпочтительнее, чем фильтрация данных внутри цикла обхода результата запроса. Когда мы пишем директиву непосредственно в тексте запроса, платформа 1С (особенно в версии для MS SQL Server) транслирует это условие в SQL-запрос WHERE ISMARK = 0.

Посмотрим на преимущества такого подхода:

  1. Скорость выполнения: СУБД отсекает ненужные записи сразу, не передавая их в память приложения 1С.
  2. Экономия ресурсов: Уменьшается объем данных, перекачиваемых по сети.
  3. Простота кода: Вам не нужно писать дополнительные проверки типа Если Запрос.Документ.ПометкаУдаления() = 1 Тогда Продолжить; КонецЕсли; внутри цикла Пока Запрос.Группировка() = 1 Цикл.

Альтернативный способ через секцию Условие

В некоторых сложных случаях, когда логика фильтрации зависит от внешних параметров, можно использовать встроенные функции в секции Условие. Однако помните, что этот метод может работать медленнее на больших объемах данных.

Пример использования функции:

|Условие (Документ.Реализация.ПометкаУдаления() = 0);

Тем не менее, для стандартных задач настоятельно рекомендуется использовать именно директиву Обрабатывать, так как она является штатным и максимально быстрым инструментом платформы.

Важные правила оформления запроса

Разберем по шагам, где именно в тексте запроса должны располагаться наши директивы. В 1С 7.7 строгий порядок следования секций:

  1. Сначала всегда идет определение периода (Период с... по...;).
  2. Сразу после периода следует указывать директивы управления выборкой (Обрабатывать...).
  3. Затем описываются переменные запроса (источники данных).
  4. Далее идут функции (Функция...).
  5. В конце располагаются группировки и условия (Группировка..., Условие...).

Если нарушить этот порядок и поставить Обрабатывать в самый конец текста, запрос может выдать синтаксическую ошибку или проигнорировать инструкцию.

Таким образом, мы выяснили, что для корректной фильтрации достаточно одной строки кода, добавленной в начало текста запроса. Это простое изменение гарантирует, что ваши отчеты будут отражать только актуальные, не помеченные на удаление данные, обеспечивая высокую точность учета.

← На главную