Как исправить ошибку SDBL Быстрая вставка запрещена (не было вызова suspendIndexing()) при тестировании и исправлении

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При выполнении процедуры Тестирование и исправление информационной базы (ТиИ) в клиент-серверном варианте работы можно столкнуться с критическим сбоем платформы: Ошибка SDBL: Быстрая вставка запрещена (не было вызова suspendIndexing()). Проблема чаще всего возникает на устаревших релизах платформы (включая линейку 8.2 и ранние версии 8.3) в высоконагруженных базах с большим объемом накопленных данных (например, в 1С:Управление производственным предприятием 1.3).

Разберем природу этого сбоя и рассмотрим пошаговые методы его устранения.

Причины возникновения ошибки SDBL

Выясним причину сбоя. Аббревиатура SDBL (Simple DataBase Layer) обозначает внутренний уровень абстракции платформы 1С, отвечающий за трансляцию запросов и операций с данными в команды конкретной СУБД (например, MS SQL Server). Ошибка вызвана внутренним программным сбоем в коде платформы:

  1. При реструктуризации или пересчете итогов платформа пытается выполнить массовую пакетную вставку данных (Fast/Bulk Insert) во временные или основные таблицы СУБД.
  2. Для выполнения быстрой вставки движок базы данных должен временно отключить обслуживание индексов таблицы вызовом внутренней функции suspendIndexing().
  3. Если платформа по какой-либо причине пропускает этот вызов перед формированием потока данных, уровень SDBL блокирует дальнейшую операцию и аварийно прерывает процесс.

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

Пошаговый запуск Тестирования и исправления без исправления ошибок

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

Разберем правильный порядок действий:

  1. Создадим резервную копию базы данных средствами СУБД перед началом любых манипуляций.
  2. Откроем конфигуратор и перейдем в меню Администрирование > Тестирование и исправление....
  3. Переключим переключатель в положение Только тестирование (без создания/очистки объектов и исправления ошибок). Это позволит собрать детальный лог и выяснить, на какой именно таблице происходит сбой.
  4. Запустим проверки строго по отдельности, выполняя их поочередно:
    1. Реиндексация таблиц информационной базы;
    2. Проверка логической целостности;
    3. Проверка ссылочной целостности;
    4. Пересчет итогов;
    5. Реструктуризация таблиц информационной базы.

Раздельный запуск снижает нагрузку на временные таблицы СУБД и во многих случаях позволяет успешно завершить тесты, которые падали при общем запуске.

Обслуживание базы средствами MS SQL Server

Поскольку ошибка возникает на стыке 1С и СУБД, выполним регламентные операции на стороне MS SQL Server перед повторным запуском ТиИ:

  1. Проверим физическую и логическую целостность базы данных с помощью команды Transact-SQL: DBCC CHECKDB ('ИмяБазыДанных') WITH NO_INFOMSGS, ALL_ERRORMSGS;
  2. Выполним перестроение индексов (REBUILD) и полное обновление статистик для всех таблиц базы. Это нормализует планы выполнения запросов и внутренние структуры СУБД.
  3. Убедимся, что на дисках с файлами данных, лога транзакций (LDF) и базы tempdb достаточно свободного места для расширения.

Управление итогами регистров

Если ошибка воспроизводится на этапе Пересчет итогов, разберем действия по оптимизации регистров накопления и бухгалтерии в режиме 1С:Предприятие:

  1. Перейдем в режим 1С:Предприятие с полными правами и откроем форму Управление итогами (или стандартную обработку управления итогами).
  2. Проверим дату, по которую рассчитаны итоги. Если итоги рассчитаны на несколько лет вперед или содержат неактуальные периоды, сместим границу рассчитанных итогов на конец предыдущего месяца.
  3. Выполним отключение и повторное включение итогов по проблемным регистрам. Это пересоздаст агрегатные таблицы на уровне СУБД.

Обновление версии платформы 1С:Предприятие

Рассматриваемая ошибка в коде SDBL является официально зарегистрированным платформенным багом старых версий (в частности, платформы 8.2). В более поздних сборках линейки 1С:Предприятие 8.3 этот механизм был полностью переработан.

Для окончательного устранения проблемы переведем информационную базу на актуальный релиз платформы 1С:Предприятие 8.3:

  1. Развернем тестовый контур с новой версией платформы.
  2. Подключим базу данных и проверим режим совместимости конфигурации (для УПП 1.3 стандартно используется режим совместимости с версией 8.2.13 или 8.2.16).
  3. Запустим полное тестирование и исправление в новой версии платформы. На актуальных релизах платформы вызовы suspendIndexing() выполняются корректно, и ошибка SDBL не воспроизводится.

Ограничения использования выгрузки в DT

Иногда для решения ошибок предлагают выгрузить базу в файл .dt, загрузить в файловый вариант и провести ТиИ там. Обратим внимание: для крупных корпоративных систем (таких как УПП с базой объемом в десятки и сотни гигабайт) данный способ неприменим. Выгрузка в .dt может завершиться ошибкой нехватки памяти, а файловый формат 1CD имеет жесткое техническое ограничение на размер одной таблицы (не более 4 ГБ). Все регламентные процедуры для тяжелых баз следует выполнять непосредственно в клиент-серверном режиме.

← На главную