Как исправить ошибку СУБД «недостаточно памяти» и сбой OLE DB при получении параметров сеанса в 1С?

Системный администратор 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При работе с крупными информационными базами «1С:Предприятие», особенно после обновления платформы, конфигурации или переноса базы данных на новый сервер СУБД, администраторы и разработчики часто сталкиваются с аппаратными сбоями. Одним из наиболее коварных симптомов является аварийное завершение работы системы при попытке прочитать параметры сеанса.

В этой статье мы подробно разберем, почему возникает ошибка получения значения атрибута контекста ДатаОбновленияПовторноИспользуемыхЗначенийМРО, как это связано с архитектурой Библиотеки стандартных подсистем (БСП), и какими методами можно полностью устранить эту проблему на уровне платформы «1С» и MS SQL Server.

Выясняем причину: архитектурная ловушка параметров сеанса в БСП

На первый взгляд ошибка выглядит парадоксально. Платформа аварийно завершает работу на следующей строке кода:


Если ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО <> АктуальнаяДата Тогда 
    // Код обработки
КонецЕсли;

Казалось бы, почему простое сравнение даты с датой вызывает ошибку «Недостаточно памяти» или «Произошли ошибки во время выполнения многошаговой операции OLE DB»? Причина кроется в механизме работы платформы «1С:Предприятие» и логике БСП.

В БСП инициализация параметров сеанса выполняется пакетно. При первом обращении к любому, даже самому легковесному параметру сеанса (такому как ДатаОбновленияПовторноИспользуемыхЗначенийМРО), система неявно запускает общий обработчик УстановкаПараметровСеанса. В рамках этого процесса инициализируются и другие параметры сеанса, жестко связанные с подсистемой обмена данными:

Оба этих параметра представляют собой объекты типа ХранилищеЗначения. Они содержат огромные бинарные массивы (LOB-данные) — сериализованные XML-схемы и таблицы правил регистрации для всех планов обмена, существующих в конфигурации. Пытаясь прочитать простую дату, сервер приложений «1С» (процесс rphost) начинает одновременно выгружать из СУБД терабайты системных данных правил регистрации и десериализовать их в оперативную память. Именно на этом стыке происходит сбой СУБД или сетевого провайдера.

Анализируем причины ошибки СУБД «Недостаточно памяти»

Если при получении параметра сеанса SQL-сервер возвращает ошибку нехватки памяти, нам необходимо проанализировать три ключевых фактора:

  1. Конфликт за оперативную память на сервере «все в одном». Если СУБД MS SQL Server и сервер приложений «1С» развернуты на одном физическом или виртуальном сервере, SQL Server по умолчанию будет стремиться занять под свой буферный пул всю доступную память операционной системы. Когда рабочему процессу rphost внезапно требуется выделить непрерывный блок памяти под десериализацию правил регистрации, ОС отказывает ему в этом, либо сам SQL Server рапортует о нехватке внутренних ресурсов.
  2. Ограничения кластера 1С. Проанализируем настройки безопасности в консоли администрирования кластера «1С». Если для рабочего сервера заданы жесткие лимиты на «Предельный объем памяти рабочих процессов» или параметр «Безопасный расход памяти за один вызов», то чтение огромного хранилища значений моментально превысит эти лимиты, приведя к принудительному уничтожению процесса.
  3. Проблемы с дисковой подсистемой базы TempDB. При сборке правил обмена СУБД генерирует сложные временные таблицы. Если системная база tempdb переполнена или имеет неоптимальные настройки авторасширения, СУБД выдает ошибку памяти.

Разбираем природу сбоя OLE DB (HRESULT=80040E21)

Код ошибки 80040E21 («Ошибки во время выполнения многошаговой операции OLE DB») свидетельствует о низкоуровневом сбое сетевого драйвера, через который сервер «1С» общается с MS SQL Server. Это происходит по следующим причинам:

Пошаговый план решения проблемы

Проанализируем комплекс мер, которые помогут гарантированно устранить эти ошибки.

Шаг 1. Очистка локального и серверного кэша

Прежде чем приступать к сложным манипуляциям с СУБД, исключим влияние неактуального кэша конфигурации. Выполним полную очистку кэша на сервере приложений «1С» (путем удаления содержимого папок srvinfo/reg_1541/snccntry при остановленной службе «1С») и на стороне пользователя.

Шаг 2. Тестирование и исправление (ТИИ) базы данных

Запустим конфигуратор «1С» и выполним процедуру «Тестирование и исправление». Обязательно выберем следующие пункты:

Важное замечание: в ряде случаев ТИИ успешно реструктурирует поврежденные таблицы констант и пересоздает индексы, что полностью решает проблему, как это произошло на одной из баз в рассматриваемом практическом кейсе.

Шаг 3. Проверка целостности базы данных на уровне MS SQL Server

Если средства «1С» не справились или зависли на этапе тестирования, выполним низкоуровневую диагностику структуры СУБД. Откроем SQL Server Management Studio (SSMS) и выполним следующий запрос:

DBCC CHECKDB ('Имя_Вашей_Базы_Данных') WITH NO_INFOMSGS, ALL_ERRORMSGS;

Внимательно проанализируем вывод команды. Если утилита обнаружит ошибки размещения (allocation errors) или согласованности (consistency errors), это означает физическое разрушение базы данных. В таком случае необходимо:

  1. Восстановить базу данных из последнего актуального бэкапа;
  2. При отсутствии бэкапа перевести базу в однопользовательский режим и выполнить исправление ошибок (учтите, что это может привести к потере части данных):

ALTER DATABASE Имя_Вашей_Базы_Данных SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB ('Имя_Вашей_Базы_Данных', REPAIR_ALLOW_DATA_LOSS);
GO
ALTER DATABASE Имя_Вашей_Базы_Данных SET MULTI_USER;
GO

Шаг 4. Обновление провайдера OLE DB на сервере 1С

Для устранения многошаговых ошибок OLE DB установим на сервере приложений «1С» современный драйвер доступа к данным — Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL). Платформа «1С:Предприятие» последних релизов автоматически распознает этот драйвер и использует его для стабильного сетевого соединения с SQL-сервером, обеспечивая корректную передачу больших пакетов информации.

Шаг 5. Ограничение потребления оперативной памяти SQL-сервером

Настроим лимиты выделения оперативной памяти для СУБД. Откроем свойства сервера в SSMS, перейдем в раздел «Memory» (Память) и установим параметр «Maximum server memory» (Максимальный размер памяти сервера). Рекомендуется оставлять операционной системе и процессам rphost сервера приложений «1С» не менее 4–8 ГБ свободной памяти (при условии совмещенного использования одного сервера).

Шаг 6. Оптимизация системной базы TempDB и обновление статистик

Убедимся, что файлы базы tempdb расположены на быстрых твердотельных накопителях (SSD/NVMe). Настроим авторасширение файлов базы tempdb фиксированным объемом (например, по 256 или 512 МБ), чтобы избежать задержек при выделении памяти.

Дополнительно сбросим кэш планов запросов СУБД и обновим статистики, выполнив в SSMS команды:


USE Имя_Вашей_Базы_Данных;
GO
EXEC sp_updatestats;
GO
DBCC FREEPROCCACHE;
GO

Эти действия заставят оптимизатор SQL-сервера построить новые, более оптимальные планы выполнения запросов для выборки данных из бинарных полей параметров сеанса.

← На главную