Ошибка: Microsoft SQL Cannot create a row of size

24.10.23

База данных - HighLoad оптимизация

Разбор исправления ошибки "Microsoft SQL Cannot create a row of size" в 1С при открытии формы.

Скачать файлы

Наименование Файл Версия Размер
Для спонсоров, которым помогла статья творить доброе-вечное.
.jpg 257,03Kb
0
.jpg 257,03Kb Скачать

Статья вряд ли заинтересует правоверных джедаев, но может пригодится для олдфагов вроде меня, использующих тёмную силу "загугли" и "копипаста". 

Итак, при входе на определенную форму с динамическим списком получаем ошибку:

Microsoft SQL Cannot create a row of size 8077 which is greater than the allowatte maximum row size of 8066

Типа, длина записи в таблице MS SQL не может превышать размера страницы - 8 кб.

Ошибки нет в PosgreSQL, где варится тестовая база. Но переход рабочей базы на PSQL не рассматривается по религиозным причинам. Ошибка произвольно появлялась то у одного, то у другого пользователя и далее уходить не собиралась. Трассировка ничего не дала, а в консоли запросов ошибки не было. В консоли запросов у конкретного пользователя с ошибкой даже и результата не было, только пустые колонки, но ошибка при открытии формы - была.

По советам трудящихся "возвертай всё взад, <падший ангел апокалипсиса>" вернул исходный запрос и с удивлением обнаружил, что лучше не стало. Истерически паникуя с воплями "Шеф, шеф, всё пропало!", обращаемся к вселенскому разуму.

 

Запрос просто не может генерировать Армагеддон.

 

Помощь бывалого админа сервера 1С была неоценимой: "Запрос слишком большой, превышающий максимальный запрос для SQL. В 1С есть трассировка <а мужики то и не знали>. Надо исправить запрос." Спасибо, Кэп! Другой правоверный прогер сказал, что что-то такое было и после исправления дюжины ошибок в монструозном запросе, полегчало, но у меня не тот случай.

В интернете про эту проблему ничишуя толком не нашел. Походу в гугле забанили, ибо обнаружил только какие-то мантры сенсеев про то что, запрос, написанный нами, и отправленный от 1С к серверу отличается нюансами (см. анекдот про Василия Ивановича, Петьку и нюанс). Они явно о чём-то знали. Но путь ситха джедая усеян горами трупов из ошибок и обработок.

 

На infostart, на форумах 1С, на форумах Axapta сенсеи говорят одно и то же: резать запрос.

 

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

 

Содержимое запроса, вызывающее взрыв радиатора SQL под капотом 1С.

 

Звонок юзеру про сортировку - активно юзает. Бинго. В 1С Предприятие удаляем настройки формы - по-ба-ба-м... ошибка исчезает... На всякий случай, в 1С:УТ11 это делается через 1С Предприятие в панели "НСИ и Администрирование", далее "Настройки пользователей и прав", "Персональные настройки пользователей", "Настройки пользователей". У нужного пользователя я жамкнул "Очистить всё" и позже пожалел, потому что удалились настройки очень важных отчетов, а что там было, никто не помнит. Поэтому надо выбирать конкретную форму и нажимать "Очистить".

 

Магия 1С

 

Ошибки нет! Но ненадолго... Стоит отсортировать по колонке - 1С даёт пинка под зад. Но мы на верном пути - печень не обманет. Она нутром чует.

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

Значит, что-то кроме сортировки в форме добавляет адынэс. Смотрим на используемые реквизиты, которые вытягиваются запросом. И тут находим золотую жилу с типом:

ДокументСсылка.

Но судя по соцопросам, используется всего пара документов. Меняем реквизит ДокументСсылка на ДокументСсылка.НашСамыйГлавныйДокумент, а СправочникСсылка удаляем вообще совсем нафиг навсегда. Ошибка исчезает.

 

 

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

"А почему вообще вдруг возникла ошибка?" - вопросит внимательный читатель: "Ведь до какого-то момента всё летало нормально." Всё верно, просто новые справочники и документы растут как грибы-мутанты после кислотного дождя. И случилось неочевидное - после добавления нового мелкого справочника MS SQL подняла бунд.

1С8 Ошибка Microsoft SQL Cannot create a row of size

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 руб.

02.09.2020    101508    561    385    

608

1C:Предприятие для программистов: Запросы и отчеты. Онлайн-интенсив с 27 ноября по 27 декабря 2023г.

1С-программирование Запросы СКД Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения. Курс является вторым курсом траектории развития 1С-Разработчика, с углубленным изучением тем "Язык запросов" и "Отчеты", которые были рассмотрены в рамках “Базового курса для начинающих 1С-программистов”.

7500 руб.

04.10.2023    2549    48    0    

47

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    10746    Филин    37    

101

Все консоли запросов для 1С

Запросы Бесплатно (free)

Список всех популярных обработок.

17.03.2023    24598    kuzyara    72    

159

Пример многопоточной обработки (БСП)

HighLoad оптимизация БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка-шаблон, на основе которой можно делать свои многопоточные обработки данных для конфигураций на БСП.

13.02.2023    8359    6    echo77    8    

87

Идентификатор объекта в запросе. Вы этого хотели?

Запросы Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    28224    dsdred    26    

85

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

В предлагаемой статье решил привести примеры применения новых возможностей языка запросов 1С, начиная с версии платформы 8.3.20.

21.11.2022    20864    quazare    34    

120
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. paulwist 26.10.23 10:02 Сейчас в теме
"А почему вообще вдруг возникла ошибка?" - вопросит внимательный читатель: .... MS SQL подняла бунд.

Дык, "MS SQL подняла бунд" - это разве ответ, вы нашли причину?

Почему возникла такая ошибка?

Если нашли, то приведите репро-код (скрипт T-SQL) показывающий косяк!!!

А то получается статья "ни о чём" ;)
2. vakham 19 27.10.23 13:04 Сейчас в теме
(1) длина записи в таблице MS SQL не может превышать размера страницы - 8 кб.
И это всё, что доступно мне, ибо доступ в MS SQL мне закрыт. И админам закрыт. ;) (админам, Карл!)
3. paulwist 27.10.23 14:00 Сейчас в теме
В интернете про эту проблему ничишуя толком не нашел. Походу в гугле забанили,


Эта проблема гуглится за 5 сек с репро-кодом.

Cannot create a row of size XXXX which is greater than the allowable maximum row size of 8060

Но запрос крохотный как мои достижения, в то время как ошибка вылезает явно из-за огромного как мои амбиции select-a.


Поскольку, запрос (скрипт работы выборки) в статье не приведён, то ... "вангую", создаётся таблица/временная таблица/таблевар в которой длина строки больше 8К, в которую осуществляется попытка записать строку для формирования конечного результата.

Вынуть select-ом запись больше 8К нет проблем (те же n/varchar(max) -->> 2G ) и отдать её клиенту, поэтому сам select ни при чём, в MSSQL нет ограничения на количество "таблиц" в join, хоть 250.

И это всё, что доступно мне, ибо доступ в MS SQL мне закрыт. И админам закрыт.


То есть вы искали/исправляли/тестировали косяк на продуктиве?? Однако :)
4. lvictor58 135 02.11.23 10:06 Сейчас в теме
Скорей всего из-за того что начинает маслаться одновременно много таблиц. В конфигурациях на ОФ были запросы по отборам определенных реквизитов (например "Организация") из всех документов, где такой реквизит присутствует. Запрос строился в цикле с соединением таблиц. Так вот там если количество таких таблиц превышало 256 то цикл принудительно обрывался. И запускался по новой для формирования нового текста запроса по оставшимся.
В УФ либо команда разработчиков даже не задумывалась об этом, либо понадеялись на "авось".
5. paulwist 02.11.23 11:52 Сейчас в теме
Скорей всего из-за того что начинает маслаться одновременно много таблиц.


Соединяю 300 таблиц * 4000 байт в каждой, итого 120 000 байт в конечной выборке и где ошибка Cannot create a row??

-- что-то местный парсер ключевые слова create/select/from разделяет пробелами :)
cre ate      table #t (id char(4000));

declare 
@str varchar(max) = 'sel ect * fr om #t t0',
@i int = 0;

while @i < 300
begin
	set @i = @i + 1
	set @str = @str + ' inner join #t t' + cast(@i as char(4)) + ' on t' + cast(@i - 1 as char(4)) + '.id = t' + cast(@i as char(4)) + '.id'
end

exec (@str)
Показать


PS можно вместо 300 поставить 1000, сам запрос будет долго выполняться ~ 1.5 мин.

PSS ограничение 256 таблиц "растёт" от dbf, там драйвер ODBC не позволял больше таблиц соединять.
Оставьте свое сообщение