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