При выполнении регламентных процедур закрытия месяца (в частности, при формировании записей книги покупок и книги продаж) пользователи могут сталкиваться с критической ошибкой выполнения запроса. Подобная ситуация часто возникает не из-за программных ошибок в коде конфигурации, а по причине физического или логического повреждения данных на уровне СУБД MS SQL Server — появления так называемых ошибок согласованности (consistency errors).
Разберем подробный алгоритм диагностики, безопасного восстановления структуры базы данных на стороне SQL-сервера и последующей проверки целостности штатными средствами платформы 1С:Предприятие.
Проанализируем первопричину проблемы. Для регламентных операций по учету НДС строятся сложные агрегированные запросы. Если затронута страница данных или поврежден индекс одной из задействованных таблиц, СУБД аварийно прерывает выполнение запроса.
Прежде чем приступать к исправлению, необходимо гарантировать эксклюзивный доступ к информационной базе. Выполним следующие подготовительные действия:
Теперь запустим диагностику базы данных на наличие физических и логических повреждений с помощью консольной команды СУБД:
DBCC CHECKDB ('ИмяБД') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Если в выводе команды обнаруживаются ошибки согласованности (например, CHECKDB обнаружил 0 ошибок размещения и 12 ошибок согласованности), это свидетельствует о повреждении страниц таблиц или индексов.
Рассмотрим способы устранения найденных ошибок. Наиболее безопасным подходом является перестроение некластеризованных индексов поврежденных таблиц. Если поврежден только индекс, этого достаточно для возвращения базы в работоспособное состояние. Для восстановления всех индексов таблицы используется команда:
ALTER INDEX ALL ON ИмяПоврежденнойТаблицы REBUILD;
Если ошибки затрагивают страницы данных, применим утилиту восстановления DBCC CHECKDB. Для этого базу данных необходимо перевести в однопользовательский режим, выполнить процедуру ремонта и вернуть многопользовательский доступ. Разберем последовательность команд:
-- Переводим базу в монопольный режим с немедленным сбросом незавершенных транзакций
ALTER DATABASE ИмяБД SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- Запускаем исправление ошибок согласованности
DBCC CHECKDB ('ИмяБД', REPAIR_ALLOW_DATA_LOSS);
-- Возвращаем базу данных в многопользовательский режим
ALTER DATABASE ИмяБД SET MULTI_USER;
Важное предупреждение: параметр REPAIR_ALLOW_DATA_LOSS является крайней мерой, так как устраняет ошибки путем физического удаления поврежденных страниц данных. Это может повлечь потерю части строк документов или регистров, поэтому наличие свежего бэкапа строго обязательно.
После завершения процедур восстановления на уровне СУБД необходимо полностью очистить кэш запросов и сессионные данные. Перезапустим службы:
Перезапуск служб гарантирует освобождение заблокированных ресурсов и перестроение пулов соединений между сервером приложений и СУБД.
После ремонта на уровне SQL необходимо устранить возможные логические несоответствия в метаданных 1С (ссылки на удаленные объекты, рассинхронизацию итогов регистров). Запустим конфигуратор и откроем меню Администрирование — Тестирование и исправление.
Выберем следующие обязательные параметры:
Обратите внимание на техническое ограничение: утилита chdbfl.exe предназначена исключительно для файловых баз данных (файлов формата .1CD). Для клиент-серверного варианта на MS SQL она неприменима напрямую — восстановление выполняется только средствами SQL и встроенным механизмом тестирования конфигуратора.
Если прямое исправление через SQL затруднено или ошибки повторяются, применим универсальный метод очистки физической структуры базы 1С:
.dt).В процессе загрузки платформа 1С создает таблицы и индексы с нуля, что полностью исключает перенос битых физических страниц и фрагментированных структур SQL.
После выполнения указанных шагов снимем блокировку регламентных заданий, запустим сеанс «1С:Бухгалтерии» и повторно выполним операции закрытия месяца — формирование книги покупок и книги продаж пройдет штатно без ошибок выполнения запросов.