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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Особенности платформы при работе со статусами документов

Прежде чем переходить к написанию запроса, разберем важную особенность платформы 1С. Документы в системе имеют два основных булевых реквизита: Проведен и ПометкаУдаления.

На уровне ядра платформы 1С заложено жесткое правило: проведенный документ не может одновременно быть помечен на удаление. Если попытаться программно установить оба флага в значение Истина и записать документ, платформа выдаст исключение:

Проведенный документ не может быть помечен на удаление!

Из этого следует важный технический вывод: если документ имеет признак Проведен = ИСТИНА, он гарантированно не является помеченным на удаление (его ПометкаУдаления всегда равна ЛОЖЬ).

Написание условий в запросе 1С

Рассмотрим, как написать секцию ГДЕ в зависимости от требуемой бизнес-логики.

Вариант 1. Классическая явная проверка двух условий

Если требуется явно зафиксировать в коде проверку обоих флагов для наглядности, используем логический оператор И:


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

Вариант 2. Оптимизированный отбор для проводимых документов

Поскольку проведенный документ не может иметь пометку на удаление, для документов с включенным проведением условие ПометкаУдаления = ЛОЖЬ является логически избыточным. Запрос можно упростить:


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

Работа с непроводимыми документами

Разберем ситуацию, когда в метаданных у документа свойство Проведение установлено в значение Запретить (например, документы типа «Заказ», «Смета» или произвольные справочные документы). У таких объектов реквизит Проведен всегда равен ЛОЖЬ.

Если применить условие Проведен = ИСТИНА к непроводимому документу, запрос вернет пустую выборку. Для отбора действующих непроводимых документов следует использовать только проверку пометки на удаление:


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

Рекомендации по повышению производительности запросов

Проанализируем практические советы по работе с условиями в СУБД:

  1. Использование индексов: Реквизиты Проведен, ПометкаУдаления и Дата проиндексированы платформой по умолчанию. Старайтесь использовать простые равенства в условии ГДЕ, чтобы СУБД могла эффективно задействовать индексы таблиц.
  2. Избегайте сложных конструкций: Не используйте внутри секции ГДЕ конструкции ВЫБОР КОГДА ... КОНЕЦ без крайней необходимости, так как это препятствует оптимальному использованию индексов СУБД.
  3. Получение данных из регистров: Если целью запроса является получение движений, остатков или оборотов, запрашивайте виртуальные таблицы регистров (например, ОстаткиИОбороты), а не таблицы документов. Виртуальные таблицы автоматически учитывают движения только проведенных документов и не требуют дополнительной фильтрации по реквизитам документа.
← На главную