При работе с крупными информационными базами «1С:Предприятие», особенно после обновления платформы, конфигурации или переноса базы данных на новый сервер СУБД, администраторы и разработчики часто сталкиваются с аппаратными сбоями. Одним из наиболее коварных симптомов является аварийное завершение работы системы при попытке прочитать параметры сеанса.
В этой статье мы подробно разберем, почему возникает ошибка получения значения атрибута контекста ДатаОбновленияПовторноИспользуемыхЗначенийМРО, как это связано с архитектурой Библиотеки стандартных подсистем (БСП), и какими методами можно полностью устранить эту проблему на уровне платформы «1С» и MS SQL Server.
На первый взгляд ошибка выглядит парадоксально. Платформа аварийно завершает работу на следующей строке кода:
Если ПараметрыСеанса.ДатаОбновленияПовторноИспользуемыхЗначенийМРО <> АктуальнаяДата Тогда
// Код обработки
КонецЕсли;
Казалось бы, почему простое сравнение даты с датой вызывает ошибку «Недостаточно памяти» или «Произошли ошибки во время выполнения многошаговой операции OLE DB»? Причина кроется в механизме работы платформы «1С:Предприятие» и логике БСП.
В БСП инициализация параметров сеанса выполняется пакетно. При первом обращении к любому, даже самому легковесному параметру сеанса (такому как ДатаОбновленияПовторноИспользуемыхЗначенийМРО), система неявно запускает общий обработчик УстановкаПараметровСеанса. В рамках этого процесса инициализируются и другие параметры сеанса, жестко связанные с подсистемой обмена данными:
ПараметрыСеанса.ПравилаРегистрацииОбъектовПараметрыСеанса.ПравилаВыборочнойРегистрацииОбъектовОба этих параметра представляют собой объекты типа ХранилищеЗначения. Они содержат огромные бинарные массивы (LOB-данные) — сериализованные XML-схемы и таблицы правил регистрации для всех планов обмена, существующих в конфигурации. Пытаясь прочитать простую дату, сервер приложений «1С» (процесс rphost) начинает одновременно выгружать из СУБД терабайты системных данных правил регистрации и десериализовать их в оперативную память. Именно на этом стыке происходит сбой СУБД или сетевого провайдера.
Если при получении параметра сеанса SQL-сервер возвращает ошибку нехватки памяти, нам необходимо проанализировать три ключевых фактора:
rphost внезапно требуется выделить непрерывный блок памяти под десериализацию правил регистрации, ОС отказывает ему в этом, либо сам SQL Server рапортует о нехватке внутренних ресурсов.tempdb переполнена или имеет неоптимальные настройки авторасширения, СУБД выдает ошибку памяти.Код ошибки 80040E21 («Ошибки во время выполнения многошаговой операции OLE DB») свидетельствует о низкоуровневом сбое сетевого драйвера, через который сервер «1С» общается с MS SQL Server. Это происходит по следующим причинам:
_Const некорректно обрабатывает буфер обмена и аварийно прерывает сессию.Проанализируем комплекс мер, которые помогут гарантированно устранить эти ошибки.
Прежде чем приступать к сложным манипуляциям с СУБД, исключим влияние неактуального кэша конфигурации. Выполним полную очистку кэша на сервере приложений «1С» (путем удаления содержимого папок srvinfo/reg_1541/snccntry при остановленной службе «1С») и на стороне пользователя.
Запустим конфигуратор «1С» и выполним процедуру «Тестирование и исправление». Обязательно выберем следующие пункты:
Важное замечание: в ряде случаев ТИИ успешно реструктурирует поврежденные таблицы констант и пересоздает индексы, что полностью решает проблему, как это произошло на одной из баз в рассматриваемом практическом кейсе.
Если средства «1С» не справились или зависли на этапе тестирования, выполним низкоуровневую диагностику структуры СУБД. Откроем SQL Server Management Studio (SSMS) и выполним следующий запрос:
DBCC CHECKDB ('Имя_Вашей_Базы_Данных') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Внимательно проанализируем вывод команды. Если утилита обнаружит ошибки размещения (allocation errors) или согласованности (consistency errors), это означает физическое разрушение базы данных. В таком случае необходимо:
ALTER DATABASE Имя_Вашей_Базы_Данных SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB ('Имя_Вашей_Базы_Данных', REPAIR_ALLOW_DATA_LOSS);
GO
ALTER DATABASE Имя_Вашей_Базы_Данных SET MULTI_USER;
GO
Для устранения многошаговых ошибок OLE DB установим на сервере приложений «1С» современный драйвер доступа к данным — Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL). Платформа «1С:Предприятие» последних релизов автоматически распознает этот драйвер и использует его для стабильного сетевого соединения с SQL-сервером, обеспечивая корректную передачу больших пакетов информации.
Настроим лимиты выделения оперативной памяти для СУБД. Откроем свойства сервера в SSMS, перейдем в раздел «Memory» (Память) и установим параметр «Maximum server memory» (Максимальный размер памяти сервера). Рекомендуется оставлять операционной системе и процессам rphost сервера приложений «1С» не менее 4–8 ГБ свободной памяти (при условии совмещенного использования одного сервера).
Убедимся, что файлы базы tempdb расположены на быстрых твердотельных накопителях (SSD/NVMe). Настроим авторасширение файлов базы tempdb фиксированным объемом (например, по 256 или 512 МБ), чтобы избежать задержек при выделении памяти.
Дополнительно сбросим кэш планов запросов СУБД и обновим статистики, выполнив в SSMS команды:
USE Имя_Вашей_Базы_Данных;
GO
EXEC sp_updatestats;
GO
DBCC FREEPROCCACHE;
GO
Эти действия заставят оптимизатор SQL-сервера построить новые, более оптимальные планы выполнения запросов для выборки данных из бинарных полей параметров сеанса.