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

0

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 такой проблемы нет. Пожалуйста, подскажите, как можно ее устранить или хотя бы обойти?

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

2

PCcomCat

19.10.17

08:16

Уже забыли, как она выглядет эта Бухгалтерия 1.6.

3

PCcomCat

19.10.17

08:26

А если кинуть во временную таблицу результат без итогов и группировки, а уж потом группировать и собирать итоги?

4

Benevalete

19.10.17

08:37

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

5

Benevalete

19.10.17

08:45

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

6

rphosts

19.10.17

09:08

Тии? Разумеется после бэкапа

7

Benevalete

19.10.17

10:10

(6) попробуем, но это надолго, база очень большая

8

assasu

19.10.17

10:23

(0) отчеты надо делать такими что бы их можно было поддерживать.

9

Benevalete

19.10.17

10:54

(8) Это вы обращаете к разработчику бухгалтерии 1.6?

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

10

Benevalete

19.10.17

11:24

Люди, знающие толк в SQL, пожалуйста скажите: почему данный запрос безо всяких сложностей и не за столь большое время выполняемый в файловой базе, не может быть обработан в SQL?

11

bodri

19.10.17

17:04

попробуй переделать вот это:

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

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

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

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

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

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

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

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

у MS SQL какой-то трабл с такими условиями, лет 8 назад было что-то подобное, после этого такие конструкции избегаю

12

Benevalete

20.10.17

11:20

(3) (11) ура ура! Я разобралась как перенести проблемные поля во временную таблицу и ошибка больше не проявляется, даже на внушительном объеме данных. Всем спасибо за помощь! чуть позже скину пример запроса, вдруг кому пригодится

13

Benevalete

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

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

Добрый день. Ситуация такая
Сервер 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
В следствии чего происходит ошибка.

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

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

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

Has anyone seen this before and found a good workaround?

I managed to get around this issue by splitting my SQL query into two parts essentially and writing the first SQL select query to a temp table and the second part, a new SQL select statement selects from the temporary table and uses alot of CROSS APPLY operator to Calculate cascading computed columns.

This is an example of how the second part looks but I’m using alot more Cross Applys to produce new columns which are calculations:

Select * from #tempTable        

cross apply
    (
      select HmmLowestSalePrice =
       round(((OurSellingPrice + 1.5) / 0.95) - (CompetitorsLowestSalePrice) + 0.08, 2)
    ) as HmmLowestSalePrice 

cross apply
    (
      select checkLowestSP =
       case 
        when adjust = 'No Room' then 'No Room'
        when OrginalTestSalePrice >= CompetitorsLowestSalePrice then 'Minus'
        when OrginalTeslSalePrice < CompetitorsLowestSalePrice then 'Ok'
      end
) as checkLowestSP  

cross apply
    (
        select AdjustFinalNewTestSP =
        case
        when FinalNewTestShipping < 0 Then  NewTestSalePrice - (FinalNewTestShipping)
        when FinalNewTestShipping >= 0 Then NewTestSalePrice
        end
) as AdjustFinalNewTestSP

cross apply
    (
      select CheckFinalSalePriceWithWP  =
      case 
        when round(NewAdminSalePrice, 2) >= round(wholePrice, 2) then 'Ok'

        when round(NewAdminSalePrice, 2) < round(wholePrice, 2) then 'Check'
      end
    ) as CheckFinalPriceWithWP 


DROP TABLE #tempTable

My goal to to put this into a sql report and it work fine if there is 1 user only as the #tempTable will get created and dropped in the same execution and the results are displayed in the report correctly. But in the future if there are concurrent users I’m concerned that they will be writing to the same #tempTable which will affect the results?

I’ve looked at putting this into stored procedures but still get the error message above.

У меня есть хранимая процедура 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

Автор pomestnik, 06 окт 2015, 10:54

0 Пользователей и 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

При формировании не сложного отчета падать база стала! ( п.с этот отчет даже в файловом варианте нормально формируется)


Это у вас запросы коряво написаны. в одном запросе выборка получается огромная. если вы выбираете , не типизируя, например, из реквизита Документ — составной, то там все виды документов выберутся. и так далее.
Как вариант в настройках самого сикул сервера увеличить размер запроса.
Но вообще, вообще переписывать запрос надо ,да

Помог? Нажми — Спасибо :)
skype: Soprov1C


Отчет стандартый Утшный… на построителе
Падает при использовании отбора «В списке», «в группе из списка» ..
Я так полагаю эти отборы преобразуются в SQl  в IN
Нашел такое предостережение
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. 
Рекомендуют использовать временные таблицы. Это мне все отчеты надо переписывать типовые, т.к в построителя нельяз ВТ использовать… не хочется мне всего этого

В настройках сервера — минимальный объем памяти для запроса (кб) = 1024  — это его попробовать увеличить ???


попробуйте с него начните
потмо у вас режим совместимости. тоже отключайте. ну и так далее. процесс творческий.

Добавлено: 06 окт 2015, 12:56


( и сразу, не считайте программистов 1С богами.у них косяков не меньше)

Помог? Нажми — Спасибо :)
skype: Soprov1C


Понравилась статья? Поделить с друзьями:
  • Внутренняя ошибка библиотеки эсф
  • Внутренняя ошибка браузера телевизор сони
  • Внутренняя ошибка библиотеки на портале эсчф
  • Внутренняя ошибка блока срс
  • Внутренняя ошибка библиотеки госзакупки