При выполнении ресурсоемких операций в клиент-серверном режиме — например, при массовом перепроведении документов или запуск тяжелых обработок — пользователи 1С могут столкнуться с внезапной ошибкой: «База данных не найдена. База данных отсутствует в сервере баз данных». Характерная особенность этой проблемы заключается в том, что после перезапуска программы 1С снова успешно подключается к СУБД и продолжает работу до следующего сбоя.
Разберем подробно причины возникновения этой ошибки и проанализируем шаги, необходимые для её полного устранения на сервере СУБД MS SQL Server Express.
Выясним, почему сервер СУБД теряет базу данных во время выполнения тяжелых монопольных операций. На основе анализа системных логов и настроек SQL Server выделяются три основные причины:
AUTO_CLOSE в СУБД: В бесплатных редакциях MS SQL Server Express параметр AUTO_CLOSE по умолчанию включен. Когда сервер 1С кратковременно освобождает все соединения к базе, СУБД автоматически выгружает её из памяти. При повторном обращении 1С сервер SQL начинает процесс инициализации (запись в логах Starting up database), и платформа 1С выдает ошибку по таймауту, не успев дождаться отклика.MDF (в зависимости от версии — от 4 ГБ до 10 ГБ). Если при проведении документов база распухает и достигает предельного объема, СУБД блокирует дальнейшую запись и сбрасывает подключения.Autogrow): Если для файлов MDF и LDF настроен прирост в процентах, то при интенсивной записи дисковая подсистема замораживает работу базы на время выделения нового пространства. Платформа 1С расценивает эту паузу как отвал базы данных.Проанализируем журнал событий SQL Server. Если в логах регулярно встречается сообщение Starting up database, необходимо отключить режим автоматического закрытия. Для этого выполним специальный скрипт T-SQL в среде SQL Server Management Studio (SSMS).
Откроем окно создания запроса и выполним следующую команду:
ALTER DATABASE [имя_вашей_базы] SET AUTO_CLOSE OFF;
После выполнения данной команды SQL Server перестанет выгружать базу данных из оперативной памяти при временном отсутствии активных сеансов, что исключит задержки на повторный запуск.
Посмотрим на объем базы данных. В MS SQL Server Express учитывается размер основного файла данных (.mdf), тогда как файл журнала транзакций (.ldf) в лимит 10 ГБ не входит.
Проверим текущий размер файлов через SQL Server Management Studio:
.mdf и .ldf.Если размер файла .mdf приближается к 10 ГБ, стандартная редакция Express перестанет обслуживать транзакции записи. В таком случае рассмотрим следующие варианты решения:
Рассмотрим параметры роста файлов базы данных. По умолчанию прирост файлов часто установлен в процентах (например, 10%), что при больших объемах приводит к колоссальным задержкам на дисковый ввод-вывод.
Изменим параметры авторасширения файлов MDF и LDF на фиксированный размер:
Дополнительно рекомендуем перевести модель восстановления базы данных в режим SIMPLE (Простая), если вам не требуется поминутное восстановление состояния из журнала транзакций. Это предотвратит неконтролируемый рост файла .ldf при массовом перепроведении документов.
ALTER DATABASE [имя_вашей_базы] SET RECOVERY SIMPLE;
Проанализируем сам процесс перепроведения документов. Выполнение групповой обработки в рамках одной бесконечной транзакции вызывает колоссальную нагрузку на tempdb и журнал транзакций СУБД. При нехватке ресурсов рабочий процесс 1С (rphost) может аварийно завершаться, из-за чего пользователи видят сообщение о пропавшей базе.
При обработке большого массива документов рекомендуем разбивать транзакции на небольшие порции (например, производить вызов ЗафиксироватьТранзакцию() каждые 100–500 документов). Это позволит СУБД своевременно освобождать временные таблицы и блокировки.