Как исправить вылет 1С:Предприятие 7.7 с ошибкой c000020c при работе через сетевое окружение или терминальный сервер?

Системный администратор 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Особенно часто эта проблема заявляет о себе при использовании механизмов прямых запросов через внешнюю компоненту 1CPP.dll (объект ODBCRecordset) и активном использовании конфигурационных файлов классов вроде defcls.prm. Давайте подробно проанализируем природу этого сбоя, выясним, почему он возникает на определенных версиях операционных систем (например, при связке Windows Server 2016 и Windows Server 2008 R2), и разберем по шагам комплексное решение этой проблемы.

Физика процесса: почему происходит падение с ошибкой c000020c?

Код ошибки c000020c в системной классификации операционных систем семейства Windows соответствует константе STATUS_CONNECTION_DISCONNECTED (сетевое подключение разорвано). Этот сбой напрямую связан с другим известным типом критической ошибки — InPageError (код STATUS_IN_PAGE_ERROR или 0xC0000006).

Для того чтобы понять, почему 1С 7.7 закрывается без предупреждения, рассмотрим механизм работы операционной системы с исполняемыми файлами по сети:

  1. Проецирование файлов в память (In-Page Mapping): Когда клиентский компьютер или терминальный сервер запускает 1С:Предприятие (1cv7.exe или 1cv7s.exe), а также внешние компоненты (1CPP.dll, FormEx.dll, TurboMD.dll) непосредственно из сетевой папки общего доступа (SMB/CIFS), операционная система не загружает эти файлы в физическую оперативную память целиком. Вместо этого файлы проецируются в виртуальное адресное пространство процесса.
  2. Динамическая подгрузка страниц: По мере выполнения кода, когда программе требуется вызвать функцию из DLL-библиотеки или считать конфигурационный файл (например, defcls.prm), операционная система обращается к сетевому ресурсу для чтения соответствующей страницы данных ("page fault").
  3. Микроразрыв сетевого соединения: Если в момент обращения к сетевому диску происходит кратковременный сетевой затык, коллизия пакетов, превышение таймаута сессии протокола SMB или блокировка сетевого порта антивирусом, сетевой перенаправитель Windows сообщает о потере связи — выдается ошибка STATUS_CONNECTION_DISCONNECTED.
  4. Аварийное завершение процесса: Так как операционная система физически не может получить доступ к исполняемому коду программы по сети, она мгновенно прекращает выполнение процесса 1С. Программа просто исчезает с экрана пользователя без записи ошибок в журнал регистрации самой 1С.

Ситуация усугубляется при использовании файла конфигурации классов defcls.prm. Если этот файл располагается в сетевой папке базы и к нему постоянно обращаются механизмы 1CPP.dll, любой сетевой сбой при его чтении вызовет мгновенное падение платформы. Именно поэтому удаление этого файла или блокировка доступа к нему приводит к аналогичным вылетам.

Шаг 1. Локализация исполняемых файлов платформы и внешних компонент

Самое главное и надежное правило при администрировании 1С 7.7 в терминальном режиме — никогда не запускать исполняемые файлы и внешние компоненты с сетевых ресурсов. Нам необходимо перенести всю нагрузку по чтению библиотек на локальные диски терминального сервера.

Давайте выполним перенос по следующему алгоритму:

  1. Создайте на локальном диске каждого терминального сервера (например, на диске C:\) выделенный каталог для платформы: C:\Program Files (x86)\1Cv77\BIN\.
  2. Скопируйте в эту папку все файлы из оригинального каталога установки 1С 7.7 (включая 1cv7s.exe, словари, системные библиотеки).
  3. Перенесите туда же (или в отдельную локальную папку на сервере терминалов) все необходимые внешние компоненты: 1CPP.dll, FormEx.dll, TurboMD.dll, DialMail.dll.
  4. Измените ярлыки запуска 1С у пользователей терминала. Путь к исполняемому файлу должен указывать строго на локальный диск сервера терминалов, а сетевой путь должен остаться только в параметрах выбора информационной базы.

Теперь давайте изменим код инициализации внешних компонент в конфигурации. Вместо загрузки библиотек из каталога базы данных по сети, мы настроим поиск локальных копий на диске терминального сервера. Рассмотрим пример оптимизированного кода в процедуре ПриНачалеРаботыСистемы:


Процедура ПриНачалеРаботыСистемы()
    // Определим локальный путь к внешним компонентам на сервере терминалов
    ЛокальныйКаталогВК = "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 терминального сервера.

Шаг 2. Отключение сетевых оптимизаций сетевой карты (TCP Offloading)

В современных операционных системах по умолчанию включены функции разгрузки сетевого протокола на аппаратный уровень сетевой карты. Под высокой нагрузкой (большое число RDP-сессий) драйверы сетевых карт часто некорректно обрабатывают эти функции, что приводит к микросекундным пропаданиям пакетов и вызывает ошибку STATUS_CONNECTION_DISCONNECTED (c000020c).

Для устранения этих рисков выполним отключение сетевых оптимизаций на терминальном сервере (WS 2008 R2) и на сервере СУБД/Файловом сервере (WS 2016):

  1. Откройте командную строку от имени Администратора.
  2. Последовательно выполните следующие системные команды для отключения глобальных сетевых оптимизаций TCP/IP:
    
    netsh int tcp set global chimney=disabled
    netsh int tcp set global rss=disabled
    netsh int ip set global taskoffload=disabled
    
  3. Перейдите в Диспетчер устройств Windows, найдите вашу сетевую карту в разделе "Сетевые адаптеры", откройте её свойства и перейдите на вкладку Дополнительно (Advanced).
  4. Найдите и переведите в состояние Disabled (Выключено) следующие параметры (названия могут немного отличаться в зависимости от производителя сетевой карты):
    • IPv4 Checksum Offload (Разгрузка контрольной суммы IPv4)
    • Large Send Offload V2 (IPv4) (Большой сегмент отправки)
    • TCP Checksum Offload (IPv4) (Разгрузка контрольной суммы TCP)
    • Receive Side Scaling (RSS) (Получение масштабирования на стороне приема)

Отключение данных параметров снизит вероятность микроразрывов сетевых сессий при передаче больших пакетов данных между терминальным сервером и сервером СУБД.

Шаг 3. Корректировка таймаутов автоотключения SMB-сессий

Протокол SMB (Server Message Block) имеет встроенный механизм оптимизации ресурсов, который закрывает неактивные сессии совместного доступа к файлам через определенный интервал времени (по умолчанию — 15 минут). Если пользователь отошел от терминала, сессия переходит в "спящий" режим, соединение разрывается, а при попытке обращения к базе данных происходит мгновенное аварийное завершение процесса.

Настроим сервер, где физически хранится база данных и файлы конфигурации (в нашем примере — WS 2016):

  1. Запустите редактор реестра regedit от имени Администратора.
  2. Перейдите по следующему пути: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
  3. Найдите или создайте параметр со следующими характеристиками:
    • Имя параметра: Autodisconnect
    • Тип параметра: REG_DWORD (DWORD 32 бита)
    • Значение: укажите шестнадцатеричное значение ffffffff (или максимальное десятичное число 4294967295).
  4. Чтобы изменения вступили в силу без перезагрузки всего сервера, перезапустите службу "Сервер" через консоль служб или выполнив команды в cmd:
    
    net stop lanmanserver
    net start lanmanserver
    

Данная настройка запретит серверу принудительно разрывать "спящие" сессии пользователей, что сведет к минимуму вероятность получения ошибки c000020c при возвращении пользователя к работе после простоя.

Шаг 4. Настройка исключений антивирусного программного обеспечения

Современные антивирусные мониторы могут кратковременно блокировать доступ к файлам баз данных 1С (файлам таблиц .dbf, файлу конфигурации .md, а также файлу defcls.prm) в процессе их сканирования "на лету". Для 1С 7.7 такая задержка доступа критична и воспринимается операционной системой как разрыв сетевого соединения.

Давайте внесем необходимые исключения в антивирусное ПО на всех серверах:

  1. Добавьте в список исключений (исключите из проверки в реальном времени) полный путь к каталогу информационной базы 1С на сервере хранения.
  2. Включите исполняемые файлы платформы 1cv7.exe, 1cv7s.exe, а также процессы RDP-сервера в список доверенных программ.
  3. Обязательно добавьте локальные каталоги временных файлов пользователей (папки Temp в профилях пользователей на терминальном сервере) в список исключений сканирования, так как 1С 7.7 очень активно создает там временные файлы при формировании тяжелых отчетов и прямых запросов.

Применение этого комплекса мер позволит полностью избавиться от внезапных вылетов платформы 1С 7.7 с ошибкой c000020c, обеспечит стабильную работу прямых запросов через ODBCRecordset и избавит администраторов от необходимости регулярной перезагрузки серверов для сброса сетевых блокировок.

← На главную