Ошибка could not continue scan with NOLOCK due to data movement возникает в клиент-серверной 1С:Предприятие 8.3 на MS SQL Server. Платформа выполняет запрос с подсказкой NOLOCK (грязное чтение), а в этот момент страница данных таблицы сдвигается из-за параллельной транзакции — сканирование прерывается. В 9 случаях из 10 это симптом проблем с целостностью БД или регламентным обслуживанием.
Что означает эта ошибка
1С на уровне СУБД использует разные уровни изоляции. При чтении справочников и регистров без явных блокировок MS SQL применяет режим READ UNCOMMITTED. Если в момент сканирования таблицы другая транзакция перемещает страницы (split, reorganize, изменение кластерного индекса) — сервер не может гарантировать целостность результата и аварийно прерывает запрос с сообщением «could not continue scan with NOLOCK».
Сама по себе ошибка не означает потерю данных, но почти всегда указывает на повреждение страниц, фрагментацию или конфликт с антивирусом/бэкапом, который держит файлы БД.
Microsoft SQL Server Native Client 11.0: Could not continue scan with NOLOCK due to data movement.
HRESULT=80004005, SQLSrvr: SQLSTATE=42000, state=2, Severity=10, native=601, line=1
Появляется в модальном окне 1С при открытии справочника, проведении документа, формировании отчёта или фоновых регламентных задачах. В журнале регистрации фиксируется как «Ошибка СУБД» с native code 601.
Причины появления
- Физическое повреждение страниц таблицы или индекса в файле
.mdf. - Сильная фрагментация индексов (более 30–50%), отсутствие регламентных операций.
- Устаревшая статистика — оптимизатор строит неверный план и упирается в движение страниц.
- Параллельная нагрузка: длинная транзакция перестраивает кластерный индекс во время чтения.
- Антивирус или агент резервного копирования сканирует файлы БД на лету.
- Сбой дисковой подсистемы (битые сектора, проблемы с RAID-контроллером).
- Аварийное завершение SQL-сервиса (отключение питания, kill процесса).
Способ 1: Проверка целостности через DBCC CHECKDB
Перед любыми действиями сделайте полный бэкап БД средствами MS SQL. Затем в SQL Server Management Studio выполните:
USE [имя_базы_1С];
GO
DBCC CHECKDB ('имя_базы_1С') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO Если команда выводит ошибки уровня consistency errors — нужно восстанавливаться. Самый щадящий путь:
DBCC CHECKDB ('имя_базы_1С', REPAIR_REBUILD); Если не помогает, используется REPAIR_ALLOW_DATA_LOSS — но только из бэкапа, потому что возможны потери. Перед этим переводят БД в режим SINGLE_USER:
ALTER DATABASE [имя_базы_1С] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB ('имя_базы_1С', REPAIR_ALLOW_DATA_LOSS);
ALTER DATABASE [имя_базы_1С] SET MULTI_USER; Способ 2: Реиндексация и обновление статистики
Если CHECKDB не нашёл ошибок, проблема в фрагментации. Запустите регламентное обслуживание:
- В SSMS откройте «Maintenance Plans» (Планы обслуживания).
- Создайте план с задачами: Rebuild Index, Reorganize Index, Update Statistics.
- Запустите план вручную для проблемной базы.
Альтернатива — скрипт по всем таблицам:
EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? REBUILD WITH (ONLINE = OFF)'; EXEC sp_updatestats;
Операция требует свободного места в логе и tempdb — закладывайте окно обслуживания ночью.
Способ 3: Тестирование и исправление в Конфигураторе
После работ на стороне SQL обязательно проведите тестирование информационной базы средствами 1С. Все пользователи должны выйти.
- Запустите Конфигуратор от имени администратора.
- Меню: Администрирование → Тестирование и исправление.
- Включите флаги: «Реиндексация таблиц», «Проверка логической целостности», «Проверка ссылочной целостности», «Пересчёт итогов», «Сжатие таблиц информационной базы».
- Режим: «Тестирование и исправление», действия при ошибках — «Не изменять».
- Запустите и дождитесь окончания (на больших базах — несколько часов).
Способ 4: Рестарт SQL-сервиса и проверка дисков
Если ошибка появилась после сбоя питания или зависания сервера:
- Остановите службу
SQL Server (MSSQLSERVER)через services.msc. - Запустите
chkdsk C: /fдля диска с файлами БД (если это системный — потребуется перезагрузка). - Проверьте журнал Windows (Event Viewer → System) на ошибки диска и контроллера.
- Запустите SQL-сервис. В журнале SQL (
ERRORLOG) посмотрите recovery — все ли БД поднялись.
Способ 5: Восстановление из резервной копии
Если CHECKDB показывает неустранимые ошибки и REPAIR грозит потерями, разворачивайте предыдущий бэкап:
- В SSMS: Базы данных → правой кнопкой → Restore Database.
- Источник — последний валидный full backup, затем differential и transaction log backups в правильной последовательности.
- После восстановления проверьте регламентными операциями 1С.
- Информацию за период между сбоем и бэкапом восстанавливают повторным вводом.
Профилактика
Настройте план обслуживания MS SQL: ежедневно — обновление статистики и reorganize индексов, еженедельно — полный rebuild и DBCC CHECKDB. Ежедневный full backup + transaction log каждые 30–60 минут. Папки с файлами БД (.mdf, .ldf, .bak) добавьте в исключения антивируса. Используйте отдельные диски для данных, логов и tempdb. Не выключайте сервер кнопкой — только через корректный shutdown с предварительной остановкой служб 1С и SQL.
FAQ
Можно ли продолжать работу с базой при появлении этой ошибки?
Кратковременно — да, если ошибка единичная. Но устранять её нужно в ближайшее окно обслуживания: повреждение страниц прогрессирует, и риск потери данных растёт.
DBCC CHECKDB ничего не нашёл, а ошибка всё равно появляется. Что делать?
Проверьте план обслуживания и статистику. Запустите rebuild всех индексов и sp_updatestats. Если повторяется — проблема в железе: диагностика SMART, RAID-контроллера, проверка памяти ECC.
Помогает ли отключение NOLOCK на стороне 1С?
1С не даёт прямого управления подсказками SQL — режим чтения зависит от уровня изоляции и кода конфигурации. Лечить нужно причину (повреждение/фрагментацию), а не симптом.
Как часто запускать DBCC CHECKDB на боевой базе?
Полный CHECKDB — раз в неделю в окно обслуживания. На очень больших БД (от 500 ГБ) допустимо разбивать на CHECKTABLE по группам таблиц или использовать PHYSICAL_ONLY в будни и полный — на выходных.
Чем отличается REPAIR_REBUILD от REPAIR_ALLOW_DATA_LOSS?
REPAIR_REBUILD пересобирает индексы и не теряет данные. REPAIR_ALLOW_DATA_LOSS удаляет повреждённые страницы — данные на этих страницах теряются. Второй вариант — крайняя мера, только если бэкапа нет.
Нужно ли тестировать ИБ в Конфигураторе после ремонта SQL?
Да, обязательно. SQL восстановит физическую целостность, но логическая целостность (битые ссылки, рассинхронизация итогов) — компетенция платформы 1С. Без тестирования ИБ возможны ошибки проведения.
Влияет ли антивирус на эту ошибку?
Прямо влияет. Если антивирус блокирует или сканирует файлы .mdf во время записи — SQL получает ошибки I/O, которые приводят к повреждению страниц. Исключения для путей БД обязательны.