Ошибка СУБД — выражения Case могут быть вложенными только до уровня 10

Миниатюра

 

Я покажу вам как решить проблему, возникающую у программистов, сталкивающихся с ошибкой «Ошибка СУБД — выражения Case могут быть вложенными только до уровня 10».

Эта ошибка возникает при исполнении запроса, в котором встречаются поля с условиями. Если вложенность условий превышает 10, то СУБД (некоторые виды СУБД имеют свои условия) не может обработать запрос.

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

Начинающие (и не только!) программисты 1с пользуются исключительно справкой 1с (очень удобно), в том числе встроенной справкой в конструкторе запросов.

Не все программисты знают, и еще меньше догадываются, что справка по языку запросов, встроенная в конструктор запросов 1с, не полная.

Она не отражает многих особенностей, фишек и даже расширений языка 1с!

 

СКРЫТАЯ ФИШКА ЯЗЫКА ЗАПРОСОВ 1с, не описанная в официальной справке 1с!

 

Сразу скажу, что те, кто знает SQL, об этой фишке в курсе. Более того, среди программистов 1с 7, которые должны знать SQL в свзи со спецификой 1с 7, знают о ней.

Когда программисту 1с 7 говоришь об этой фишке, он пожимает плечами, и говорит — «Ну и что? Все это знают!»

Когда говоришь программисту 1с 8, воспитанному на 8 платформе 1с, он удивленно восклицает: «Интересно! Не знал!»

Например, нигде в справке не указано, что в языке запросов есть возможность написать следующее выражение:

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

Таким образом, если _УСЛОВИЕ_1_ выполнено, тогда _УСЛОВИЕ_2_ никогда не будет проверятся.

Поэтому, в вышеуказанном синтаксисе необходимо, чтобы условия были выставлены в порядке возникновения (или были равноценными)

Если условия равноценны, то есть выполняется только одно из них в один момент времени, то полезно использовать вышеуказанный синтаксис.

 

Что используют программисты 1с 8 (те, кто не в курсе) вместо указанного выше синтаксиса языка запросов 1с?

Недостатки такого синтаксиса:

  1. Большое количество вложенных условий не может быть обработано СУБД (если более 10)
  2. Нечитабельность. Чтобы понять, о чем идет речь в условии, нужно напрягать мозги

Преимущества синтаксиса:

  1. Строгая иерархия условий. Вы точно знаете, что Условие_2_ не будет проверятся ранее Условие_1

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

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

 

Как я столкнулся с таким синтаксисом в повседневной программисткой деятельности.

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

Запрос прекрасно отладил в консоли запросов по частям. Все хорошо работает. Запрос заменяет несколько страниц текста. Работает как множество вложенных циклов (в стиле программирования 1с 7). Все прекрасно.

Начинаю запускать отчет в 1с 8 Предприятие. Ошибка!

1.1. Ошибка при формировании отчета 1.1. Ошибка при формировании отчета
1.2. Сообщение об ошибке при формировании отчета 1.2. Сообщение об ошибке при формировании отчета
2.1. Схема компоновки данных отчета 2.1. Схема компоновки данных отчета
2.1. Поле запроса с большим уровнем вложенности условий 2.2. Поле запроса с большим уровнем вложенности условий
3.1. Что делать с уровнем вложенности условий в запросе 3.1. Что делать с уровнем вложенности условий в запросе
3.2. Что делать с уровнем вложенности условий в запросе 3.2. Что делать с уровнем вложенности условий в запросе
4. Упростили выражение, используя синтаксис ВЫБОР КОГДА КОГДА КОНЕЦ 4. Упростили выражение, используя синтаксис ВЫБОР КОГДА КОГДА КОНЕЦ
4.1. При формировании отчета возникла ошибка СУБД 4.1. При формировании отчета возникла ошибка СУБД
4.2. Официальный ответ Microsoft по ошибке 4.2. Официальный ответ Microsoft по ошибке

Таким образом, что Microsoft посоветовала по поводу ошибки «Внутренняя ошибка: был достигнут предел служб выражений»?

Она посоветовала следующую последовательность шагов:

  1. Разбить большие операторы ВЫБОР КОГДА но множество меньших по размеру. Например я разбил свой оператор на  2 части.
  2. Каждый кусок оператора поместить в свою временную таблицу.
  3. Временную таблицу обрабатывать следующим шагом в пакетном запросе в скопированном запросе. Применять к условию следующую часть оператора.

Например, допустим, был запрос вот такой:

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

Так что воспринимайте вышеуказанный запрос, как пример.

Вот, как можно переписать запрос:

В этом запросе условие разбито на 2 половины. Каждая половина работает в своем пакетном запросе, обрабатывается последовательно в пакете запросов.

Таким образом можно решить проблему.

Вот такие дела, товарищи программисты! По мере осознания мной новых фишек, и вспоминания пройденного за более чем 7 лет программирования, буду публиковать.

А теперь извините, спешу откланятся, дела-с!

Теги: ,

>