Работа с выборками данных в системе 1С:Предприятие часто требует не просто извлечения информации, а её предварительной обработки на уровне базы данных. Одним из самых мощных инструментов для реализации логики «если-то» непосредственно в тексте запроса является оператор ВЫБОР. Этот конструкт, заимствованный из стандарта SQL, позволяет формировать вычисляемые поля, значения которых зависят от выполнения определенных условий.

Ошибки в написании таких конструкций приводят к тому, что запрос либо не выполняется, либо возвращает некорректные данные, что критично для отчетов и сложных обработок. Понимание разницы между синтаксическими элементами КОГДА и ИНАЧЕ является фундаментом для грамотного программирования на встроенном языке.

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

Синтаксическая структура оператора ВЫБОР

Оператор ВЫБОР представляет собой условное выражение, которое возвращает одно из нескольких возможных значений в зависимости от результата проверки логических условий. Базовая структура всегда начинается с ключевого слова и заканчивается указанием типа возвращаемого результата.

Внутри конструкции используется ключевое слово КОГДА, за которым следует проверяемое условие. Если условие истинно, выполняется ветвь, указанная после слова ТОГДА. Система последовательно проверяет условия сверху вниз.

Если ни одно из условий не выполнилось, управление передается ветви ИНАЧЕ. Отсутствие этой части допустимо, но тогда при невыполнении всех условий будет возвращено значение NULL, что может нарушить логику дальнейших вычислений.

Важно соблюдать строгий порядок следования элементов: сначала идут пары КОГДА-ТОГДА, и только в самом конце, опционально, блок ИНАЧЕ. Нарушение этой последовательности приведет к синтаксической ошибке компилятора запросов.

⚠️ Внимание: Оператор ВЫБОР должен возвращать значения совместимых типов данных во всех ветвях. Нельзя в одной ветке вернуть Число, а в другой — Строку, если поле не приведено к универсальному типу.

💡

Используйте явное приведение типов (например, КАК ЧИСЛО(15,2)) для всех ветвей ВЫБОР, чтобы избежать ошибок типов на клиенте или при записи во временную таблицу.

Простые условия и сравнение значений

Наиболее частый сценарий использования — это классификация данных по простым признакам. Например, необходимо пометить документы статусом в зависимости от суммы или даты. Для этого используются стандартные операторы сравнения: =, <>, >, <.

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

ВЫБОР

КОГДА Документ.Проведен = ЛОЖЬ ТОГДА "Черновик"

КОГДА Документ.ПометкаУдаления = ИСТИНА ТОГДА "Удален"

ИНАЧЕ "Проведен"

КОНЕЦ

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

Можно также использовать проверку на неопределенное значение NULL (или ЕСТЬ NULL в синтаксисе 1С). Это критически важно при работе с не заполненными реквизитами справочников или документов.

Использование сложных логических выражений

В реальных задачах редко достаточно проверки одного поля. Часто требуется комбинация нескольких условий, связанных логическими операторами И, ИЛИ, НЕ. Синтаксис запросов 1С полностью поддерживает эти конструкции внутри блока КОГДА.

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

  • 🔍 Проверка диапазона значений: Цена МЕЖДУ 100 И 500
  • 🔍 Проверка вхождения в список: ВидНоменклатуры В ("Товар", "Услуга")
  • 🔍 Отрицание: НЕ Статус = "Закрыт"

При построении сложных условий крайне важно использовать скобки для группировки, так как приоритет выполнения операторов может привести к неожиданному результату. Логика И выполняется раньше, чем ИЛИ, если не задано иное.

⚠️ Внимание: Избегайте избыточной вложенности условий. Если логика становится слишком громоздкой, проще сделать несколько подзапросов или использовать временные таблицы для промежуточных расчетов.

📊 Какой тип условий вы используете чаще?
Простые сравнения (=, >)
Диапазоны (МЕЖДУ)
Сложная логика (И/ИЛИ)
Проверка на NULL

Вложенные операторы ВЫБОР

Язык запросов 1С допускает вложенность операторов ВЫБОР. Это означает, что в ветви ТОГДА или в условии КОГДА может находиться другой оператор выбора. Такая техника необходима для реализации многоуровневой классификации данных.

Представьте задачу расчета скидки, которая зависит от типа клиента, а внутри типа клиента — от суммы заказа. Внешний ВЫБОР проверяет тип контрагента, а внутренний — сумму.

ВЫБОР

КОГДА ТипКлиента = "Опт" ТОГДА

ВЫБОР

КОГДА Сумма > 100000 ТОГДА 10

ИНАЧЕ 5

КОНЕЦ

ИНАЧЕ 0

КОНЕЦ

Чтение таких конструкций может быть затруднено, поэтому рекомендуется форматировать код с отступами. Глубокая вложенность (более 3 уровней) считается признаком плохого стиля и усложняет отладку.

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

Ограничения вложенности

Хотя технически ограничений на глубину вложенности в документации мало, на практике глубже 4-5 уровней запрос становится нечитаемым и может вызвать проблемы с оптимизацией плана выполнения на стороне СУБД.

Сравнение ВЫБОР и функции КОГДА

В среде разработчиков часто возникает путаница между оператором запроса ВЫБОР и встроенной функцией языка под названием КОГДА(). Это принципиально разные инструменты, работающие на разных уровнях исполнения кода.

Оператор ВЫБОР работает на уровне СУБД (SQL). Он выполняется сервером базы данных до того, как данные будут переданы в память процесса 1С. Это максимально производительный вариант для фильтрации и трансформации больших массивов.

Функция КОГДА() работает на уровне встроенного языка 1С. Она применяется к уже полученным данным в оперативной памяти. Использование этой функции в больших циклах может существенно замедлить работу программы.

Критерий Оператор ВЫБОР (Запрос) Функция КОГДА (Язык 1С)
Место выполнения Сервер СУБД (SQL) Клиент или Сервер приложений 1С
Производительность Высокая (работает с индексами) Низкая (перебор в памяти)
Синтаксис В тексте запроса В коде модуля
Типизация Строгая, на уровне полей Динамическая, любой тип

Всегда стремитесь переносить логику условного перехода в запрос, используя ВЫБОР. Это снижает сетевой трафик и нагрузку на процессор сервера приложений.

Типичные ошибки и отладка запросов

При написании условий разработчики часто допускают ошибки, связанные с типами данных или порядком проверки. Самая распространенная проблема — попытка сравнить поле типа СправочникСсылка со строкой без использования псевдонима .Наименование или .Код.

Также частой ошибкой является игнорирование значения NULL. В 1С пустое значение ссылки и NULL могут вести себя по-разному в зависимости от контекста сравнения. Всегда явно проверяйте ЕСТЬ NULL, если поле может быть не заполнено.

  • ❌ Сравнение разных типов данных без приведения.
  • ❌ Отсутствие закрывающего слова КОНЕЦ.
  • ❌ Использование переменных запроса внутри условия ВЫБОР без правильного синтаксиса (&).

Для отладки сложных условий используйте консоль запросов. Выполняйте запрос по частям, проверяя результат каждой ветки ТОГДА отдельно. Это поможет быстро локализовать логическую ошибку.

⚠️ Внимание: Интерфейс и возможности конструктора запросов могут меняться в разных версиях платформы. Если вы используете старую версию 1С (ниже 8.3.10), некоторые функции оптимизации могут работать иначе.

☑️ Проверка запроса перед запуском

Выполнено: 0 / 4

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

Использование оператора ВЫБОР само по себе не замедляет запрос, если условия написаны корректно. Однако, если в условии КОГДА используются функции от полей таблиц (например, ГОД(Дата)), это может запретить использование индексов.

Старайтесь писать условия так, чтобы поле оставалось «чистым» слева от знака сравнения. Вместо ГОД(Дата) = 2026 лучше использовать диапазон Дата МЕЖДУ ... И .... Это правило актуально и для условий внутри ВЫБОР.

Если условие зависит от значения, которое вычисляется в другом подзапросе, убедитесь, что соединение (JOIN) выполнено оптимально. Лишние вложенные запросы с условиями могут привести к декартовому произведению и резкому падению скорости.

💡

Главное правило оптимизации: Логика ВЫБОР должна быть максимально простой. Сложные вычисления выносите во внешние обработки, а в запросе оставляйте только фильтрацию и простую классификацию.

Можно ли использовать ВЫБОР в параметрах соединения (JOIN)?

Да, оператор ВЫБОР можно использовать в условиях соединения таблиц. Это позволяет реализовать сложную логику связывания данных, например, соединять таблицы по разным полям в зависимости от типа записи. Однако это может усложнить план выполнения запроса.

Что вернет запрос, если не указать ветвь ИНАЧЕ?

Если ни одно из условий КОГДА не выполнилось, а ветвь ИНАЧЕ не указана, оператор вернет значение NULL (неопределенное значение). Это может привести к ошибкам при попытке арифметических операций с результатом.

Допустимо ли возвращать разные типы данных из ветвей ТОГДА?

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

Как проверить условие на пустую строку в 1С?

Для проверки на пустую строку используйте сравнение Поле = "". Для проверки на неопределенное значение (NULL) используйте конструкцию Поле ЕСТЬ NULL. Это разные состояния в базе данных.