
В языке запросов 1С операторы КОГДА и ТОГДА применяются для построения условных выражений, которые влияют на результат выборки, вычисления и фильтрацию данных. Ошибка в выборе оператора часто приводит к некорректным результатам или сбоям при выполнении запроса.
КОГДА используется для задания условия, при котором выполняется определённое действие или возвращается значение. Этот оператор аналогичен конструкции CASE WHEN в SQL и определяет, при каком условии должно быть выполнено выражение. Например, его применяют для вычисления поля в зависимости от состояния документа или значения реквизита.
ТОГДА применяется как часть условного выражения, связанная с результатом, который возвращается при выполнении условия, заданного через КОГДА. Он указывает, что именно вернуть при истинности выражения. В сочетании с ИНАЧЕ оператор формирует полную логическую структуру.
Правильное использование этих операторов повышает точность формирования отчетов и сокращает время обработки данных. В запросах, где требуется разветвлённая логика, важно понимать, где ставить КОГДА для проверки условия, а где ТОГДА – для возврата результата.
Разница в назначении операторов когда и тогда в языке запросов 1С
В запросах 1С оператор КОГДА отвечает за формулировку условия, при котором выполняется определённое выражение. Он определяет логическую часть конструкции, указывая, в каких случаях должно быть возвращено конкретное значение. Обычно его используют в блоке вычислений, где результат зависит от состояния данных, например статуса документа или признака активности записи.
Оператор ТОГДА определяет результат, который возвращается при выполнении условия, заданного через КОГДА. Он формирует выходное значение при истинности выражения. Если условие ложно, дальнейшая обработка продолжается через оператор ИНАЧЕ, где задаётся альтернативный результат.
Конструкция вида ВЫБОР КОГДА … ТОГДА … ИНАЧЕ … КОНЕЦ используется для реализации условной логики внутри одного запроса. Ошибка в понимании ролей операторов приводит к нарушению синтаксиса или искажению результатов, так как КОГДА не может существовать без соответствующего ТОГДА, а ТОГДА без КОГДА лишён смысла.
При проектировании запросов рекомендуется рассматривать КОГДА как средство проверки условия, а ТОГДА – как инструмент возврата значения при выполнении этого условия. Чёткое разделение их функций помогает создавать корректные вычисляемые поля и управлять логикой без дополнительных процедур в модуле обработки.
Как работает оператор когда в условиях выборки данных

Оператор КОГДА используется в запросах 1С для проверки условий при формировании выборки или вычислении выражений. Он возвращает логическое значение, определяя, выполняется ли заданное условие. На его основе система решает, какое значение использовать в дальнейшем выражении или включать ли запись в результат.
Внутри конструкции ВЫБОР оператор КОГДА задаёт конкретные критерии, например: состояние документа, наличие связанной записи, значение поля или диапазон дат. Это позволяет динамически изменять возвращаемое значение без создания отдельных запросов. Пример: ВЫБОР КОГДА Статус = «Проведен» ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ – в результате возвращает сумму только для проведённых документов.
При использовании КОГДА в блоке ГДЕ или ИМЕЮЩИЕ оператор помогает уточнить отбор, исключая ненужные записи на этапе выборки. Это повышает производительность обработки, так как условие вычисляется до формирования итогового набора данных.
Рекомендуется использовать КОГДА для выражений, где результат зависит от нескольких логических ветвей. Если требуется просто ограничить выборку, лучше задать условие напрямую в блоке ГДЕ, а не через конструкцию ВЫБОР, чтобы запрос выполнялся быстрее.
Использование тогда для ветвления логики в запросе

Оператор ТОГДА в языке запросов 1С определяет результат выполнения условия, заданного через КОГДА. Он используется для формирования значения, которое возвращается при истинности логического выражения. Таким образом, ТОГДА управляет ветвлением логики внутри одной конструкции, позволяя вычислять разные результаты в зависимости от состояния данных.
Чаще всего ТОГДА применяют в сочетании с КОГДА и ИНАЧЕ в блоке ВЫБОР. Такая структура заменяет несколько отдельных запросов, объединяя их в одно выражение. Например: ВЫБОР КОГДА ТипДокумента = «Заказ» ТОГДА Количество * Цена ИНАЧЕ 0 КОНЕЦ – возвращает вычисленное значение только для заказов, исключая другие типы документов.
Использование ТОГДА особенно полезно при создании вычисляемых полей, где результат должен зависеть от нескольких условий. Это позволяет реализовать разветвлённую логику без обращения к внешним функциям и уменьшает нагрузку на модуль обработки данных.
При составлении выражений важно соблюдать порядок элементов конструкции: КОГДА задаёт условие, ТОГДА – результат при выполнении условия, ИНАЧЕ – значение по умолчанию. Ошибка в последовательности или пропуск одного из операторов приводит к синтаксическим ошибкам и искажению данных в выборке.
Типичные ошибки при замене когда на тогда и наоборот

Ошибки при работе с операторами КОГДА и ТОГДА чаще всего связаны с неправильным пониманием их роли в структуре условного выражения. Замена одного на другой нарушает синтаксис и логику вычисления запроса.
- Использование ТОГДА вместо КОГДА в начале условия. Конструкция ВЫБОР ТОГДА… вызывает ошибку компиляции, так как ТОГДА не может существовать без предварительного условия, определённого через КОГДА.
- Пропуск оператора ТОГДА после условия. Запись вида КОГДА Статус = «Проведен» 0 некорректна, так как отсутствует указание, какое значение вернуть при выполнении условия. Правильный вариант – КОГДА Статус = «Проведен» ТОГДА 0.
- Использование КОГДА в блоке результата. Попытка написать ТОГДА КОГДА… нарушает структуру выражения, поскольку КОГДА допустим только на уровне проверки условия.
- Несоответствие количества операторов КОГДА и ТОГДА. Каждый КОГДА должен иметь связанный ТОГДА. Несбалансированные конструкции вызывают сообщение об ошибке «Ожидалось ключевое слово ТОГДА».
- Отсутствие оператора КОНЕЦ после последнего блока. Даже при правильной расстановке КОГДА и ТОГДА отсутствие завершающего слова КОНЕЦ приводит к сбою при выполнении запроса.
Для проверки правильности конструкции рекомендуется использовать отладчик запросов 1С. Он позволяет выявить несоответствия между операторами и подсвечивает место, где нарушена структура условного выражения.
Примеры запросов с когда для фильтрации по условию

Конструкция КОГДА в языке запросов 1С позволяет задать условную фильтрацию прямо внутри выражений, не прибегая к отдельным разделам ГДЕ или ИМЕЮЩИЕ. Это удобно при вычислении значений, которые зависят от состояния данных. Рассмотрим примеры, где использование КОГДА упрощает логику выборки.
| Пример | Описание |
|---|---|
ВЫБРАТЬ Товары.Наименование, КОГДА Товары.Остаток <= 0 ТОГДА "Нет в наличии" ИНАЧЕ "В наличии" КАК Статус ИЗ Справочник.Товары КАК Товары; |
|
ВЫБРАТЬ Продажи.Покупатель, СУММА(КОГДА Продажи.Дата > НАЧАЛОПЕРИОДА(ТЕКУЩАЯДАТА(), МЕСЯЦ) ТОГДА Продажи.Сумма ИНАЧЕ 0) КАК СуммаТекущегоМесяца ИЗ Документ.РеализацияТоваровУслуг КАК Продажи СГРУППИРОВАТЬ ПО Продажи.Покупатель; |
Считает сумму продаж за текущий месяц без отдельного фильтра в секции ГДЕ. Условие задается через КОГДА внутри агрегатной функции. |
ВЫБРАТЬ Сотрудники.ФИО, КОГДА Сотрудники.ДатаУвольнения ЕСТЬ NULL ТОГДА "Работает" ИНАЧЕ "Уволен" КАК Статус ИЗ Справочник.Сотрудники КАК Сотрудники; |
Используется для отображения актуального статуса сотрудника по признаку наличия даты увольнения. |
Применение КОГДА особенно полезно, когда необходимо задать фильтрацию внутри вычислений или агрегатов, не разбивая логику запроса на несколько частей. Это повышает читаемость и позволяет избежать дублирования условий.
Примеры запросов с тогда для вычисления значений
Оператор ТОГДА в запросах 1С используется для задания вычисляемого результата внутри конструкции КОГДА … ТОГДА … ИНАЧЕ …. Он определяет, какое значение присвоить полю при выполнении условия. Это удобно при создании сводных данных, расчетов по категориям и формировании итогов без дополнительных процедур на стороне кода.
- Расчет скидки по типу клиента:
ВЫБРАТЬ Клиенты.Наименование, КОГДА Клиенты.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКлиентов.Постоянный) ТОГДА 0.1 ИНАЧЕ 0 КАК ПроцентСкидки ИЗ Справочник.Клиенты КАК Клиенты;
Значение поля ПроцентСкидки вычисляется автоматически. Для постоянных клиентов устанавливается скидка 10%, для остальных – 0%.
- Определение категории по сумме продаж:
ВЫБРАТЬ Продажи.Покупатель, СУММА(Продажи.Сумма) КАК ОбщаяСумма, КОГДА СУММА(Продажи.Сумма) > 50000 ТОГДА "Крупный клиент" ИНАЧЕ "Обычный клиент" КАК Категория ИЗ Документ.РеализацияТоваровУслуг КАК Продажи СГРУППИРОВАТЬ ПО Продажи.Покупатель;
Поле Категория определяется в зависимости от накопленного объема продаж, без использования отдельной логики в обработчике.
- Расчет налога в зависимости от ставки НДС:
ВЫБРАТЬ Товары.Наименование, Товары.Стоимость, КОГДА Товары.СтавкаНДС = 20 ТОГДА Товары.Стоимость * 0.2 ИНАЧЕ Товары.Стоимость * 0.1 КАК СуммаНалога ИЗ Справочник.Товары КАК Товары;
Использование ТОГДА позволяет в одном выражении задать формулу расчета налога по разным ставкам без внешних условий.
- Применяйте ТОГДА, если результат должен зависеть от конкретного условия.
- Избегайте вложенных КОГДА при сложных расчетах – лучше вынести промежуточные результаты в поля временных таблиц.
- Проверяйте типы данных: выражения с ТОГДА и ИНАЧЕ должны возвращать одинаковый тип (число, строка и т.д.).
Как отладить запрос при неверном использовании когда или тогда

Ошибки при применении КОГДА и ТОГДА часто связаны с несоответствием структуры выражений, неправильным порядком ключевых слов или разными типами возвращаемых значений. Для устранения таких проблем важно пошагово проверить синтаксис и контекст выполнения запроса.
1. Проверка структуры выражения
Каждое условие должно иметь три части: КОГДА <условие> ТОГДА <значение> ИНАЧЕ <значение>. Пропуск любой части вызывает ошибку синтаксиса. Пример некорректного фрагмента:
КОГДА Остаток < 0 ТОГДА "Нет"
Исправленный вариант:
КОГДА Остаток < 0 ТОГДА "Нет" ИНАЧЕ "Да"
2. Проверка типов данных
Значения после ТОГДА и ИНАЧЕ должны быть одного типа. Если в одном случае возвращается число, а в другом строка, запрос не выполнится. Пример:
КОГДА Количество > 10 ТОГДА "Много" ИНАЧЕ 0
Исправленный вариант:
КОГДА Количество > 10 ТОГДА "Много" ИНАЧЕ "Мало"
3. Использование режима пошаговой отладки
В Конфигураторе откройте окно запроса и выполните его с параметрами. Используйте кнопку Показать текст запроса – это позволяет увидеть итоговую строку запроса после подстановки переменных и проверить корректность условий.
4. Проверка условий на уровне данных
Если логика КОГДА не срабатывает, временно замените КОГДА … ТОГДА … на простое выражение, например:
ВЫБРАТЬ Остаток, Остаток < 0 КАК Проверка
Это помогает убедиться, что условие действительно возвращает нужные булевы значения.
5. Анализ ошибок выполнения
Сообщения вроде «Ожидалось выражение» или «Тип результата не определён» указывают на проблемы с размещением КОГДА или отсутствием ИНАЧЕ. После исправления проверяйте, что результат выражения доступен в списке полей выборки.
Пошаговая проверка структуры, типов и порядка операторов помогает точно определить место ошибки и корректно сформировать выражение с КОГДА и ТОГДА.
Рекомендации по выбору между когда и тогда в сложных выражениях

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