При работе со старыми, но проверенными временем конфигурациями на платформе 1С:Предприятие 7.7 в современных сетевых средах системные администраторы часто сталкиваются с труднообъяснимыми падениями программы. Одним из наиболее коварных сбоев является вылет системы с системным кодом ошибки c000020c. Данная ошибка возникает внезапно, может проявляться раз в несколько дней и полностью парализует работу пользователей в терминальных сессиях.
Особенно часто эта проблема заявляет о себе при использовании механизмов прямых запросов через внешнюю компоненту 1CPP.dll (объект ODBCRecordset) и активном использовании конфигурационных файлов классов вроде defcls.prm. Давайте подробно проанализируем природу этого сбоя, выясним, почему он возникает на определенных версиях операционных систем (например, при связке Windows Server 2016 и Windows Server 2008 R2), и разберем по шагам комплексное решение этой проблемы.
Код ошибки c000020c в системной классификации операционных систем семейства Windows соответствует константе STATUS_CONNECTION_DISCONNECTED (сетевое подключение разорвано). Этот сбой напрямую связан с другим известным типом критической ошибки — InPageError (код STATUS_IN_PAGE_ERROR или 0xC0000006).
Для того чтобы понять, почему 1С 7.7 закрывается без предупреждения, рассмотрим механизм работы операционной системы с исполняемыми файлами по сети:
1cv7.exe или 1cv7s.exe), а также внешние компоненты (1CPP.dll, FormEx.dll, TurboMD.dll) непосредственно из сетевой папки общего доступа (SMB/CIFS), операционная система не загружает эти файлы в физическую оперативную память целиком. Вместо этого файлы проецируются в виртуальное адресное пространство процесса.defcls.prm), операционная система обращается к сетевому ресурсу для чтения соответствующей страницы данных ("page fault").STATUS_CONNECTION_DISCONNECTED.Ситуация усугубляется при использовании файла конфигурации классов defcls.prm. Если этот файл располагается в сетевой папке базы и к нему постоянно обращаются механизмы 1CPP.dll, любой сетевой сбой при его чтении вызовет мгновенное падение платформы. Именно поэтому удаление этого файла или блокировка доступа к нему приводит к аналогичным вылетам.
Самое главное и надежное правило при администрировании 1С 7.7 в терминальном режиме — никогда не запускать исполняемые файлы и внешние компоненты с сетевых ресурсов. Нам необходимо перенести всю нагрузку по чтению библиотек на локальные диски терминального сервера.
Давайте выполним перенос по следующему алгоритму:
C:\) выделенный каталог для платформы: C:\Program Files (x86)\1Cv77\BIN\.1cv7s.exe, словари, системные библиотеки).1CPP.dll, FormEx.dll, TurboMD.dll, DialMail.dll.Теперь давайте изменим код инициализации внешних компонент в конфигурации. Вместо загрузки библиотек из каталога базы данных по сети, мы настроим поиск локальных копий на диске терминального сервера. Рассмотрим пример оптимизированного кода в процедуре ПриНачалеРаботыСистемы:
Процедура ПриНачалеРаботыСистемы()
// Определим локальный путь к внешним компонентам на сервере терминалов
ЛокальныйКаталогВК = "C:\1Cv77_Bin\DLL\";
// Попытка загрузки 1CPP.dll из локального каталога
Если ЗагрузитьВнешнююКомпоненту(ЛокальныйКаталогВК + "1CPP.dll") = 0 Тогда
// Если локально не найдено, пробуем загрузить из каталога базы по сети (резервный вариант)
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "1CPP.dll") = 0 Тогда
Предупреждение("Не удалось обнаружить компоненту 1CPP.dll! Работа с базой ограничена.", 5);
КонецЕсли;
КонецЕсли;
// Аналогично загружаем FormEx.dll
Если ЗагрузитьВнешнююКомпоненту(ЛокальныйКаталогВК + "FormEx.dll") = 0 Тогда
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "FormEx.dll") = 0 Тогда
Предупреждение("Не удалось обнаружить компоненту FormEx.dll!", 5);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой подход полностью исключает сетевую подкачку бинарного кода внешних компонент по протоколу SMB. Даже если сеть кратковременно "моргнет", процесс 1С останется в памяти, так как исполняемый код библиотек будет стабильно считываться с локального SSD/HDD терминального сервера.
В современных операционных системах по умолчанию включены функции разгрузки сетевого протокола на аппаратный уровень сетевой карты. Под высокой нагрузкой (большое число RDP-сессий) драйверы сетевых карт часто некорректно обрабатывают эти функции, что приводит к микросекундным пропаданиям пакетов и вызывает ошибку STATUS_CONNECTION_DISCONNECTED (c000020c).
Для устранения этих рисков выполним отключение сетевых оптимизаций на терминальном сервере (WS 2008 R2) и на сервере СУБД/Файловом сервере (WS 2016):
netsh int tcp set global chimney=disabled
netsh int tcp set global rss=disabled
netsh int ip set global taskoffload=disabled
IPv4 Checksum Offload (Разгрузка контрольной суммы IPv4)Large Send Offload V2 (IPv4) (Большой сегмент отправки)TCP Checksum Offload (IPv4) (Разгрузка контрольной суммы TCP)Receive Side Scaling (RSS) (Получение масштабирования на стороне приема)Отключение данных параметров снизит вероятность микроразрывов сетевых сессий при передаче больших пакетов данных между терминальным сервером и сервером СУБД.
Протокол SMB (Server Message Block) имеет встроенный механизм оптимизации ресурсов, который закрывает неактивные сессии совместного доступа к файлам через определенный интервал времени (по умолчанию — 15 минут). Если пользователь отошел от терминала, сессия переходит в "спящий" режим, соединение разрывается, а при попытке обращения к базе данных происходит мгновенное аварийное завершение процесса.
Настроим сервер, где физически хранится база данных и файлы конфигурации (в нашем примере — WS 2016):
regedit от имени Администратора.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
AutodisconnectREG_DWORD (DWORD 32 бита)ffffffff (или максимальное десятичное число 4294967295).
net stop lanmanserver
net start lanmanserver
Данная настройка запретит серверу принудительно разрывать "спящие" сессии пользователей, что сведет к минимуму вероятность получения ошибки c000020c при возвращении пользователя к работе после простоя.
Современные антивирусные мониторы могут кратковременно блокировать доступ к файлам баз данных 1С (файлам таблиц .dbf, файлу конфигурации .md, а также файлу defcls.prm) в процессе их сканирования "на лету". Для 1С 7.7 такая задержка доступа критична и воспринимается операционной системой как разрыв сетевого соединения.
Давайте внесем необходимые исключения в антивирусное ПО на всех серверах:
1cv7.exe, 1cv7s.exe, а также процессы RDP-сервера в список доверенных программ.Temp в профилях пользователей на терминальном сервере) в список исключений сканирования, так как 1С 7.7 очень активно создает там временные файлы при формировании тяжелых отчетов и прямых запросов.Применение этого комплекса мер позволит полностью избавиться от внезапных вылетов платформы 1С 7.7 с ошибкой c000020c, обеспечит стабильную работу прямых запросов через ODBCRecordset и избавит администраторов от необходимости регулярной перезагрузки серверов для сброса сетевых блокировок.