При работе с Универсальным отчетом в системе 1С:Предприятие пользователи часто сталкиваются с необходимостью создания собственных вычисляемых колонок. Для этого используются «Пользовательские поля», где можно прописать логику с помощью функции ВЫБОР. Однако синтаксис этих полей отличается от стандартного языка запросов 1С, что приводит к неочевидным ошибкам, таким как «Ожидается ТОГДА». В этой статье мы подробно разберем, почему возникает эта ошибка и как правильно группировать условия.
Рассмотрим ситуацию: вы пытаетесь написать условие, в котором одно и то же поле должно соответствовать одному из нескольких значений. Проблема заключается в том, что парсер (обработчик текста), который анализирует формулы в пользовательских полях интерфейса, работает менее гибко, чем компилятор запросов в конфигураторе. Проанализируем типичную ошибку: когда вы добавляете оператор ИЛИ, система перестает понимать, где заканчивается блок условий и начинается блок исполнения ТОГДА.
Основные причины сбоя парсера:
Если оператор ИЛИ вызывает ошибку, самым простым и надежным способом будет разбить условия на отдельные блоки КОГДА. Это гарантирует, что система корректно обработает каждое сравнение. Посмотрим на пример реализации:
ВЫБОР
КОГДА [Счет Кт.Код счета] = "90.01.1" ТОГДА "Доходы"
КОГДА [Счет Кт.Код счета] = "91.01" ТОГДА "Доходы"
КОНЕЦ
В данном случае мы продублировали результат для разных условий. Этот метод наиболее стабилен, так как исключает двусмысленность при чтении формулы программой. Разберем подробнее: каждое КОГДА проверяется последовательно до первого совпадения. Если первое условие ложно, 1С переходит ко второму.
Если необходимо использовать именно ИЛИ (например, при сочетании разных полей в одном условии), критически важно использовать скобки. Проанализируем ситуацию: парсер ожидает увидеть ТОГДА сразу после первого логического выражения. Чтобы «объяснить» системе, что условие продолжается, мы заключаем весь блок в скобки.
Рассмотрим правильный синтаксис:
ВЫБОР
КОГДА ([Счет Кт.Код счета] = "90.01.1" ИЛИ [Счет Кт.Код счета] = "91.01")
ТОГДА "Доходы"
КОНЕЦ
Важный нюанс: Старайтесь писать всю конструкцию КОГДА (...) ТОГДА в одну строку, если это позволяет объем выражения. Это минимизирует риск ошибки распознавания символов переноса.
Когда одно поле проверяется на вхождение в список конкретных значений, использование ИЛИ — не самый эффективный путь. В Системе компоновки данных (СКД), на которой базируется Универсальный отчет, предусмотрен оператор В. Это аналог SQL-оператора IN.
Посмотрим на пример, который значительно сокращает код и снижает вероятность ошибки:
ВЫБОР
КОГДА [Счет Кт.Код счета] В ("90.01.1", "91.01")
ТОГДА "Доходы"
КОНЕЦ
Обратите внимание на синтаксические особенности:
[НазваниеПоля].Сложности возникают и при использовании логического И. Например, нам нужно проверить не только счет, но и конкретную аналитику (субконто). Выясним причину ошибки: часто пользователь забывает, что каждое условие должно быть завершенным сравнением.
Рассмотрим пример правильной проверки двух разных полей:
ВЫБОР
КОГДА ([Счет Кт.Код счета] = "91.1" И [Вид субконто1 Кт.Наименование] = "Прочие доходы и расходы")
ТОГДА "Доходы"
КОНЕЦ
Здесь также применяются двойные скобки, если условий становится больше двух. Проанализируем конструкцию: КОГДА ((Условие1 И Условие2) ИЛИ Условие3) ТОГДА. Такой подход позволяет строить сложную иерархическую логику в отчетах.
При написании формул в вычисляемых полях часто забывают о том, что данные могут быть не заполнены. Если поле, которое вы проверяете, содержит NULL, то сравнение [Поле] = "Значение" вернет не ложь, а неопределенный результат, который может «сломать» всю логику ВЫБОР.
Для предотвращения таких ситуаций рекомендуется использовать функцию ЕстьNULL. Хотя в интерфейсных пользовательских полях она не всегда доступна в явном виде, хорошим тоном считается предварительная проверка на заполненность или использование оператора ПОДОБНО для строковых полей, так как он более устойчив к отсутствию данных.
Подводя итог, выделим ключевые правила, которые помогут избежать ошибки «Ожидается ТОГДА» и других синтаксических проблем:
ВЫБОР, КОГДА, ТОГДА, ИЛИ заглавными буквами помогает парсеру быстрее и точнее обрабатывать текст."90.01" обязательно.Используя эти методы, мы сможем создавать гибкие и точные отчеты, автоматизируя классификацию данных (например, разделение на доходы и расходы) без изменения конфигурации базы данных.