Конструктор запроса в системе 1С:Предприятие — это мощный инструмент, который позволяет разработчикам создавать сложные SQL-подобные инструкции без необходимости помнить весь синтаксис наизусть. Однако некоторые элементы управления скрыты за контекстными меню или функциональными кнопками. Одной из наиболее часто используемых, но вызывающих вопросы у новичков конструкций, является ВЫБОР (аналог CASE в SQL). В данной статье мы подробно разберем, как реализовать эту логику, используя только визуальные средства конструктора.
Рассмотрим самый распространенный и правильный способ создания сложных полей. Чаще всего нам требуется создать вычисляемое поле, результат которого зависит от определенного условия. Выполним следующие шаги:
ВЫБОР.Система автоматически сформирует каркас запроса:
ВЫБОР
КОГДА ТОГДА
ИНАЧЕ
КОНЕЦ
Проанализируем структуру: после ключевого слова КОГДА мы должны вписать условие (например, Остаток < 0), а после ТОГДА — результат, который вернет запрос (например, "Дефицит"). Ветка ИНАЧЕ является необязательной, но крайне рекомендуемой для обработки исключений или значений по умолчанию.
Выясним еще один быстрый способ добавления конструкции без лишних переходов. На той же вкладке Поля в правой колонке (где отображается итоговый список полей запроса) можно нажать правую кнопку мыши на пустом месте. В появившемся меню выберем пункт Добавить. Это действие откроет то же самое окно редактирования выражения, где мы сможем воспользоваться описанным выше алгоритмом.
Важный нюанс: если вы хотите обернуть уже существующее поле в конструкцию ВЫБОР, просто выделите это поле в списке и нажмите кнопку f(x). Текст поля уже будет в окне, и вам останется только «дорисовать» логические условия вокруг него.
Мало кто знает, что конструктор выражений поддерживает перетаскивание элементов. Если вы открыли окно редактирования выражения, вы можете перетаскивать поля из дерева Доступные поля (левая часть) прямо в текст условия внутри ВЫБОР. Это позволяет избежать опечаток в именах реквизитов через точку, таких как Номенклатура.НаименованиеПолное.
Проанализируем две формы записи, которые поддерживает конструктор и язык запросов 1С:
КОГДА.
ВЫБОР
КОГДА Ссылка.ПометкаУдаления ТОГДА "Удален"
КОГДА Ссылка.Проведен ТОГДА "Проведен"
ИНАЧЕ "Черновик"
КОНЕЦ
ВЫБОР Ссылка.ВидОперации
КОГДА ЗНАЧЕНИЕ(Перечисление.ВидыОпераций.Поступление) ТОГДА "Приход"
ИНАЧЕ "Прочее"
КОНЕЦ
Разберем типичные ситуации, с которыми сталкиваются разработчики при работе в конструкторе:
Типизация результата: Важно помнить, что все ветки ТОГДА и ветка ИНАЧЕ должны возвращать данные одного и того же типа (или совместимых типов). Если в одном случае вы возвращаете число 0, а в другом строку "Нет данных", конструктор выдаст ошибку несовместимости типов. В таких случаях лучше возвращать либо пустую строку, либо числовой ноль.
Вложенные условия: Конструктор позволяет создавать вложенные конструкции ВЫБОР. Рассмотрим пример, когда внутри одного условия нам нужно проверить еще одно:
ВЫБОР
КОГДА Сумма > 1000 ТОГДА
ВЫБОР
КОГДА Валюта = &ВалютаРубль ТОГДА "Крупная рублевая"
ИНАЧЕ "Крупная валютная"
КОНЕЦ
ИНАЧЕ "Мелкая"
КОНЕЦ
Хотя визуально это может выглядеть громоздко, конструктор запроса корректно обрабатывает такие вложения при закрытии окна по кнопке ОК.
Потеря форматирования: Посмотрим на ситуацию глазами опытных разработчиков. Часто отмечается, что конструктор запроса «схлопывает» красиво написанный текст. Если вы вручную расставили отступы и переносы строк в сложном блоке ВЫБОР, будьте готовы к тому, что после повторного открытия конструктора и нажатия ОК, система может выстроить код в более компактный (и менее читаемый) вид. Именно поэтому сложные запросы иногда предпочитают дописывать вручную в текстовом режиме.
Использование в Группировках и Условиях: Конструкция ВЫБОР не ограничивается только списком полей. Мы можем использовать ее на вкладке Группировка, чтобы объединить данные в группы по какому-то сложному признаку, или на вкладке Условия, хотя в последнем случае чаще эффективнее использовать стандартные логические операторы И, ИЛИ.
Мы выяснили, что для создания конструкции ВЫБОР в конструкторе не нужно писать весь код руками. Достаточно использовать Редактор выражения, найти в разделе Прочие готовый шаблон и заполнить его нужными полями через перетаскивание или выбор из списка. Это гарантирует отсутствие синтаксических ошибок, так как конструктор проверяет целостность операторов КОГДА, ТОГДА и КОНЕЦ автоматически.