Внутренняя ошибка был достигнут предел служб выражений 1с

Добрый день. Ситуация такая
Сервер win-2008 r2 х64
48 гб озу
Xenon e5620 2.4ghz
1c сервер х64
Платформа 8.2.19.130
Размер базы в файловом варианте ~35гб
База ут (10.3.5.1) вся переписанная, работает в режиме совместимости с 8.1
Sql 2012 х64
Настройки скула:
Максимальный объем памяти сервера = 20гб
Минимальный объем памяти для запроса = 15гб
Поддерживать приоритет SQL Server = да
Максимальная степень параллелизма = 1

При формировании типового отчета «ОтчетПоКредитнойЛинии». При установке отбора по контрагенту
«В списке», «Не в списке» и т.п база падает с ошибкой
Изображение

Я так предполагаю что это связано с этим предостережением
Including an extremely large number of values (many thousands) in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table.

Видимо, использовании отбора «В списке», «в группе из списка» .. преобразуются в SQl в IN
В следствии чего происходит ошибка.

Что самое обидное — на ПОСТГРЕ и в ФАЙЛОВОМ ВАРИАНТЕ нету таких проблем.

Возможно ли лишить проблему не переписывая все стандартные отчеты ?

   Benevalete

19.10.17 — 06:46

Бухгалтерия 1.6.8.3 сконвертированная под платформой 8.3.5.1231, SQL

После доработки ОСВ по счету при формировании по счетам 62(9 субсчетов), 76(более 15 субсчетов) и еще некоторым счетам возникает следующая ошибка: «Ошибка СУБД: Внутренняя ошибка, был достигнут предел служб выражений». Полный текст ошибки — http://prntscr.com/gz7ft4 В файловой копии базы такой ошибки нет, запрос на ней выполняется около 4х секунд

Доработка следующая: в тексте основного запроса поля субконто1, субконто2 и т.д. сделаны опциональными, то есть для каждого субсчета выбирается свое субконто, подходящее по типу значения.

Тест запроса стандартный, до изменения:

«ВЫБРАТЬ РАЗРЕШЕННЫЕ

    ОстаткиИОбороты.Счет КАК Счет,

    СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,

    СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,

    СуммаОборотДт КАК СуммаОборотДт,

    СуммаОборотКт КАК СуммаОборотКт,

    СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,

    СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,

              ОстаткиИОбороты.Субконто1 КАК Субконто1,

              ОстаткиИОбороты.Субконто2 КАК Субконто2

ИЗ

    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет),

, Организация = &Организация ) КАК ОстаткиИОбороты

ИТОГИ

    СУММА(СуммаНачальныйОстатокДт),

    СУММА(СуммаНачальныйОстатокКт),

    СУММА(СуммаОборотДт),

    СУММА(СуммаОборотКт),

    СУММА(СуммаКонечныйОстатокДт),

    СУММА(СуммаКонечныйОстатокКт)

    ПО ОБЩИЕ,

    Счет ИЕРАРХИЯ КАК Счет ,

Субконто1,

Субконто2

АВТОУПОРЯДОЧИВАНИЕ

»

——————————————————-

Текст запроса после доработки:

«ВЫБРАТЬ РАЗРЕШЕННЫЕ

    ОстаткиИОбороты.Счет КАК Счет,

    СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,

    СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,

    СуммаОборотДт КАК СуммаОборотДт,

    СуммаОборотКт КАК СуммаОборотКт,

    СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,

    СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,

ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения1 ТОГДА ОстаткиИОбороты.Субконто1

       КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения1 ТОГДА ОстаткиИОбороты.Субконто2

       КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения1 ТОГДА ОстаткиИОбороты.Субконто3

КОНЕЦ КАК Субконто1,

ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения2 ТОГДА ОстаткиИОбороты.Субконто1

       КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения2 ТОГДА ОстаткиИОбороты.Субконто2

       КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения2 ТОГДА ОстаткиИОбороты.Субконто3

КОНЕЦ КАК Субконто2

ИЗ

    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет),

, Организация = &Организация ) КАК ОстаткиИОбороты

ИТОГИ

    СУММА(СуммаНачальныйОстатокДт),

    СУММА(СуммаНачальныйОстатокКт),

    СУММА(СуммаОборотДт),

    СУММА(СуммаОборотКт),

    СУММА(СуммаКонечныйОстатокДт),

    СУММА(СуммаКонечныйОстатокКт)

    ПО ОБЩИЕ,

    Счет ИЕРАРХИЯ КАК Счет ,

Субконто1,

Субконто2

АВТОУПОРЯДОЧИВАНИЕ

»

ТипИзмерения — тип детализации в настройке отчета

Без этой доработки осв по счету формируется с некорректной детализацией, к примеру у всех субсчетов субконто1 имеет вид «Подразделения»,  а у одного субсчета «подразделения» это субконто2, то при задании в настройках детализации по «подразделениям», последний субсчет детализируется в пустом поле. Исправлена эта ошибка только в бухгалтерии редакции 3.0, мне нужно доработать бухгалтерию 1.6 своими силами.

По остальным счетам ОСВ формируется корректно(счет 91.08 — 11 субсчетов). Гугл выдает информацию о том, что данная ошибка проявляется на SQL, для файловой версии и Postgre такой проблемы нет. Пожалуйста, подскажите, как можно ее устранить или хотя бы обойти?

Более подробно причины доработок указаны в предыдущей теме: ОСВ по счету ошибка детализации по субконто

   Benevalete

4 — 19.10.17 — 08:37

(3) Да, была такая идея, но не совсем понимаю как получить тот же результат по итогам, если указан итог по «Счет ИЕРАРХИЯ», то есть оператором «выбор когда» я получаю субконто уже по тому, что получилось в результате иерархических итогов (счет = 91, у него субконто1 всегда одинаковое, а у его субсчетов может быть разное)

   Benevalete

5 — 19.10.17 — 08:45

(2) Конкретно для осв по счету: берется выбранный счет, к примеру 10, анализируются его субконто(субконто1 — номенклатура, субконто2 — склады), на основании этого заполняется настройка детализации: «По номенклатуре, по складам», если убираем детализацию по складам, в запрос выше попадает только субконто1 — номенклатура, по умолчанию там оба субконто(поля запроса формируются циклом).

  

Benevalete

13 — 23.10.17 — 03:05

Примерный текст запроса:

        «ВЫБРАТЬ РАЗРЕШЕННЫЕ

        |    ОстаткиИОбороты.Счет КАК Счет,

        |    ОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,

        |    ОстаткиИОбороты.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,

        |    ОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,

        |    ОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт,

        |    ОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,

        |    ОстаткиИОбороты.СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,

        |    ВЫБОР

        |        КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения1

        |            ТОГДА ОстаткиИОбороты.Субконто1

        |        КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения1

        |            ТОГДА ОстаткиИОбороты.Субконто2

        |        КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения1

        |            ТОГДА ОстаткиИОбороты.Субконто3

        |    КОНЕЦ КАК Субконто1,

        |    ВЫБОР

        |        КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения2

        |            ТОГДА ОстаткиИОбороты.Субконто1

        |        КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения2

        |            ТОГДА ОстаткиИОбороты.Субконто2

        |        КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения2

        |            ТОГДА ОстаткиИОбороты.Субконто3

        |    КОНЕЦ КАК Субконто2

        |ПОМЕСТИТЬ ВТ

        |ИЗ

        |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет), , Организация = &Организация) КАК ОстаткиИОбороты

        |;

        |

        |////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ

        |    ВТ.Счет КАК Счет,

        |    ВТ.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,

        |    ВТ.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,

        |    ВТ.СуммаОборотДт КАК СуммаОборотДт,

        |    ВТ.СуммаОборотКт КАК СуммаОборотКт,

        |    ВТ.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,

        |    ВТ.СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,

        |    ЕСТЬNULL(ВТ.Субконто1, НЕОПРЕДЕЛЕНО) КАК Субконто1,

        |    ЕСТЬNULL(ВТ.Субконто2, НЕОПРЕДЕЛЕНО) КАК Субконто2,

        |    ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ВТ.Субконто1, НЕОПРЕДЕЛЕНО)) КАК Субконто1Представление,

        |    ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ВТ.Субконто2, НЕОПРЕДЕЛЕНО)) КАК Субконто2Представление,

        |    ПРЕДСТАВЛЕНИЕ(ВТ.Счет)

        |ИЗ

        |    ВТ КАК ВТ

        |ИТОГИ

        |    СУММА(СуммаНачальныйОстатокДт),

        |    СУММА(СуммаНачальныйОстатокКт),

        |    СУММА(СуммаОборотДт),

        |    СУММА(СуммаОборотКт),

        |    СУММА(СуммаКонечныйОстатокДт),

        |    СУММА(СуммаКонечныйОстатокКт)

        |ПО

        |    ОБЩИЕ,

        |    Счет ИЕРАРХИЯ,

        |    Субконто1,

        |    Субконто2

        |АВТОУПОРЯДОЧИВАНИЕ»;

У меня есть хранимая процедура SQL Server с почти 300 переменными внутри нее.

Переменные были созданы следующим образом:

CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN SUM(Col)  OVER(PARTITION BY grp_loc,COMM) ELSE 0 END AS "SALES_1"

Поскольку у этого есть проблема с данными, все переменные были заменены следующим образом:

SUM(CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN Col ELSE 0 END)  OVER(PARTITION BY grp_loc,COMM) AS "SALES_1"

Проблема с данными была решена с помощью приведенного выше оператора, но процедура выдает следующую ошибку, когда мы добавляем все 300 переменных. Если добавлено только около 100, процедура работает нормально.

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

В соответствии с опубликованным ответом я попытался разбить запрос на несколько запросов выбора, и ошибка была устранена, но при объединении результата данные не были получены правильно.

BEGIN

CREATE TABLE #TEMPTAB1
(
TYPE_1 char(15),
NUMBER_1 char(7),
STATUS_1 char(1),
...
)
CREATE TABLE #TEMPTAB2
(
TYPE_2 char(15),
NUMBER_2 char(7),
STATUS_2 char(1),
...
)
CREATE TABLE #TEMPTAB3
(
TYPE_3 char(15),
NUMBER_3 char(7),
STATUS_3 char(1),
...
)

SELECT * FROM 
    #TEMPTAB1 T1 
     INNER JOIN 
    #TEMPTAB2 T2 ON T1.TYPE_1=T2.TYPE_2 AND T1.NUMBER_1 = T2.NUMBER_2 AND T1.STATUS_1 = T2.STATUS_2
     INNER JOIN 
    #TEMPTAB3 T3 ON T1.TYPE_1=T3.TYPE_3 AND T1.NUMBER_1 = T3.NUMBER_3 AND T1.STATUS_1 = T3.STATUS_3

END

Может ли кто-нибудь предложить способ исправить соединения в приведенном выше коде.

2 ответа

Лучший ответ

Пожалуйста, напишите запрос еще раз!

Эта проблема возникает из-за того, что SQL Server ограничивает количество идентификаторов и констант, которые могут содержаться в одном выражении запроса. Это ограничение составляет 65 535.

Один из подходов может быть таким:

Вы можете разделить запрос на выборку на несколько запросов, сохранить результат во временных таблицах и объединить результаты в конце.

больше информации


8

Tharif
12 Авг 2015 в 06:31

Для меня это была версия SQL Server. У меня не было проблем с запуском того же запроса к SQL Server 2017 в производственной среде, но я столкнулся с проблемой с SQL Server 2018 на стадии подготовки. Я понизил свою версию SQL Server до 2017 года с 2018 года на производстве, и проблема была решена. На данный момент это может быть проблемой с SQL Server 2018.


0

Raghav
4 Дек 2019 в 10:16

I have a SQL Server stored procedure with nearly 300 variables within it.

The variables were created as follows:

CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN SUM(Col)  OVER(PARTITION BY grp_loc,COMM) ELSE 0 END AS "SALES_1"

As this has data issue all the variables were replaced like:

SUM(CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN Col ELSE 0 END)  OVER(PARTITION BY grp_loc,COMM) AS "SALES_1"

The data issue has been solved by the above statement, but the procedure throws the below error when we add all the 300 variables, if only about 100 is added, the procedure runs fine.

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

As per the answer posted I have tried to split the query to multiple select queries and the error has been resolved, but while combining the result the data has not been fetched correctly.

BEGIN

CREATE TABLE #TEMPTAB1
(
TYPE_1 char(15),
NUMBER_1 char(7),
STATUS_1 char(1),
...
)
CREATE TABLE #TEMPTAB2
(
TYPE_2 char(15),
NUMBER_2 char(7),
STATUS_2 char(1),
...
)
CREATE TABLE #TEMPTAB3
(
TYPE_3 char(15),
NUMBER_3 char(7),
STATUS_3 char(1),
...
)

SELECT * FROM 
    #TEMPTAB1 T1 
     INNER JOIN 
    #TEMPTAB2 T2 ON T1.TYPE_1=T2.TYPE_2 AND T1.NUMBER_1 = T2.NUMBER_2 AND T1.STATUS_1 = T2.STATUS_2
     INNER JOIN 
    #TEMPTAB3 T3 ON T1.TYPE_1=T3.TYPE_3 AND T1.NUMBER_1 = T3.NUMBER_3 AND T1.STATUS_1 = T3.STATUS_3

END

Can anyone please suggest a way to correct the joins in the above code.

Всем привет!
Произошла такая беда…  :cry:

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

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

Нужна помощь от разработчиков!
Где хранятся настройки списков пользователя. Возможно удаление этой или всех настроек для списка документов «Задачи» поправит ситуацию.

Главное добиться чтобы Список задач начал открываться без каких либо настроек списка..

Очень ждем помощи, т.к. работать нет возможности, только если под другим пользователем (((

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

Сложность запроса подтверждается ошибкой
Ошибки:
———————————————————————————
06.02.2015 18:48:35
Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: Внутренняя ошибка: был достигнут предел служб выражений. Проверьте потенциально сложные выражения в запросе и постарайтесь их упростить.
HRESULT=80040E14, SQLSrvr: SQLSTATE=42000, state=2, Severity=11, native=8632, line=1

Изменено: Александр Митин08.02.2015 11:02:53

Возможно, вам также будет интересно:

  • Внутренняя ошибка буфер предоставленный для считывания значения столбца слишком мал
  • Внутренняя ошибка браузера на сони смарт тв
  • Внутренняя ошибка блока srs бмв х5 е53
  • Внутренняя ошибка блока srs honda cr v
  • Внутренняя ошибка библиотеки фсзн как исправить

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии