Почему вылетает 1С 7.7 на терминальном сервере и как решить конфликт с библиотекой mfc42.dll и службой ctfmon.exe?

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

Работа устаревших, но до сих пор активно используемых конфигураций на платформе 1С:Предприятие 7.7 в терминальной среде (RDP или Citrix) часто сопровождается внезапными и непредсказуемыми вылетами программы. Пользователи могут жаловаться на то, что 1С мгновенно закрывается без видимых причин при подборе номенклатуры, открытии диалога печати, формировании отчетов или проведении документов. При этом в журнале событий Windows (Event Viewer) регистрируются ошибки приложения 1cv7s.exe, ссылающиеся на сбои в библиотеках mfc42.dll, Moxel.dll, kernel32.dll или gdi32.dll.

Давайте подробно разберем природу этого конфликта и рассмотрим проверенные практические методы его устранения — от простых административных манипуляций до тонкой настройки реестра и изоляции библиотек.

Техническая суть конфликта: почему падает 1С 7.7?

Платформа 1С 7.7 является классическим 32-битным ANSI-приложением, разработанным с использованием библиотек Microsoft Foundation Classes (MFC). За обработку ввода текста, переключение раскладок клавиатуры и работу языковой панели в современных операционных системах Windows отвечает служба текстового ввода — Text Services Framework (TSF), главным исполняемым файлом которой является процесс ctfmon.exe.

В терминальной многопользовательской среде служба TSF пытается динамически внедрить свои библиотеки (в частности, msctf.dll и msimtf.dll) в адресное пространство каждой запущенной сессии 1С. Поскольку TSF функционирует в Юникоде и создает собственный поток мониторинга внутри процесса 1cv7s.exe, возникает критический конфликт синхронизации потоков. При обращении 1С к стандартным элементам интерфейса операционной системы (например, при вызове модальных окон выбора принтера, календаря или динамических списков подбора товаров) происходит взаимная блокировка потоков (deadlock) или попытка обращения к защищенным областям памяти. Результатом становится аварийное завершение процесса с кодом исключения Access Violation (0xc0000005), указывающим на сбой в mfc42.dll.


Метод 1. Полное отключение и блокировка службы ctfmon.exe

Самым популярным и быстрым способом решения проблемы среди системных администраторов является полное исключение процесса ctfmon.exe из пользовательских терминальных сессий. Однако операционная система Windows снабжена механизмом защиты системных файлов (WFP — Windows File Protection), который автоматически восстанавливает исполняемый файл службы при попытке его удаления.

Проанализируем по шагам, как правильно нейтрализовать этот процесс на сервере:

  1. Откроем проводник на сервере и перейдем в свойства папок. Обязательно снимем флаг Скрывать защищенные системные файлы и активируем отображение скрытых файлов и папок, чтобы получить доступ к кэшу системных файлов.
  2. Перейдем в каталог резервного копирования библиотек Windows: C:\WINDOWS\system32\dllcache\.
  3. Найдем в этой папке файл ctfmon.exe и переименуем его, например, в ctfmon.bak.
  4. Перейдем в основной каталог системных файлов: C:\WINDOWS\system32\.
  5. Переименуем рабочий файл ctfmon.exe в ctfmon.old.
  6. Чтобы предотвратить повторное создание файла операционной системой, создадим в папке C:\WINDOWS\system32\ пустой текстовый файл, назовем его ctfmon.exe и в его свойствах установим флаг Только чтение, а также уберем права на запись для системы во вкладке "Безопасность".
  7. Завершим все активные терминальные сессии пользователей или вручную снимем процесс ctfmon.exe в диспетчере задач для каждого подключенного пользователя.

После проведения этих манипуляций служба перестанет запускаться, и вылеты 1С прекратятся.


Метод 2. Восстановление раскладки клавиатуры с помощью Internat.exe или Punto Switcher

После удаления ctfmon.exe администраторы сталкиваются со следующей проблемой: у пользователей в терминальных сессиях пропадает языковая панель и теряется возможность переключения раскладки клавиатуры (с русского на английский и наоборот). Нам необходимо предоставить альтернативный инструмент для переключения языков.

Рассмотрим два надежных варианта замены:

Вариант А. Использование классической утилиты Internat.exe

Утилита internat.exe использовалась в более ранних версиях операционных систем (Windows NT / 2000) и не имеет внутренних конфликтов с библиотеками MFC. Мы можем использовать её для стабильной работы на Windows Server 2003.

  1. Скачаем оригинальный файл internat.exe (рекомендуется версия 5.0.2920.0 для Windows 2000/2003) и сопутствующую ему библиотеку индикатора раскладки.
  2. Разместим исполняемый файл в системной директории сервера.
  3. Пропишем запуск утилиты в реестре в ветке автозапуска для всех пользователей:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"internat.exe"="internat.exe"

Вариант Б. Установка стороннего переключателя раскладки

В качестве альтернативы можно установить на терминальный сервер программное обеспечение для автоматического переключения раскладки клавиатуры, например Punto Switcher. Программа работает на уровне перехвата ввода клавиатуры и не использует механизмы службы TSF, что полностью защищает сессии 1С от падений. Достаточно установить программу на сервере и добавить её исполняемый файл в автозагрузку терминальных пользователей.


Метод 3. Отключение диспетчера текстовых служб (TSF) через системный реестр

Если мы не хотим физически удалять файлы операционной системы и нарушать целостность конфигурации Windows File Protection, мы можем отключить интеграцию текстовых служб непосредственно через системный реестр. Этот метод является более элегантным и безопасным.

Разберем, какие параметры необходимо скорректировать:

  1. Откроем редактор реестра regedit под учетной записью администратора.
  2. Для отключения вмешательства службы в потоки ввода текущего пользователя перейдем по пути: HKEY_CURRENT_USER\Software\Microsoft\CTF. Создадим параметр типа DWORD с именем Disable Thread Input Manager и присвоим ему значение 1.
  3. Если сервер работает под управлением операционной системы старого поколения (например, Windows Server 2003 R2), мы можем полностью деактивировать системную службу архитектуры Cicero. Для этого перейдем в ветку: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\SystemShared. Найдем или создадим параметр CUAS (тип DWORD) и установим его значение в 0.

Для применения изменений пользователям потребуется перелогиниться в своих терминальных сессиях.


Метод 4. Локальная изоляция библиотеки mfc42.dll (метод DLL Redirection)

Часто аварийное завершение работы происходит из-за того, что на сервере установлены различные сторонние приложения, которые регистрируют свои (зачастую некорректные или модифицированные) версии общей библиотеки mfc42.dll в системе. В результате платформа 1С начинает обращаться к системной библиотеке, которая подвержена внешним воздействиям.

Мы можем изолировать процесс 1С, заставив его использовать строго определенную, стабильную версию библиотеки:

  1. Найдем заведомо рабочую версию файла mfc42.dll (например, из состава официальных дистрибутивов Visual Studio или чистой установки ОС).
  2. Скопируем этот файл непосредственно в папку запуска платформы 1С. Обычно это путь: C:\Program Files (x86)\1Cv77\BIN\.
  3. В этой же папке создадим пустой файл с именем 1cv7s.exe.local (или 1cv7.exe.local, в зависимости от используемого исполняемого файла).

Присутствие файла с расширением .local активирует в Windows механизм перенаправления библиотек (DLL Redirection). Теперь при запуске 1С операционная система в первую очередь загрузит файлы библиотек из локального каталога программы, полностью игнорируя системные DLL в папке System32, что исключит влияние внешних служб.


Метод 5. Настройка исключений предотвращения выполнения данных (DEP)

Служба текстового ввода динамически транслирует код перехвата ввода в работающие процессы. Система безопасности Windows на уровне механизма DEP (Data Execution Prevention) может расценить это действие как попытку несанкционированного изменения памяти (переполнение буфера) и принудительно завершить процесс 1cv7s.exe с ошибкой.

Чтобы исключить этот сценарий, настроим правила DEP:

  1. Откроем Панель управления -> Система -> Дополнительные параметры системы.
  2. На вкладке "Дополнительно" в разделе "Быстродействие" нажмем кнопку Параметры.
  3. Перейдем на вкладку Предотвращение выполнения данных.
  4. Если выбран режим "Включить DEP для всех программ и служб, кроме выбранных ниже", нажмем кнопку Добавить и укажем пути к исполняемым файлам платформы 1С (1cv7.exe, 1cv7s.exe).
  5. Применим изменения и перезагрузим сервер (если потребуется).

Метод 6. Изменение кодовой базы конфигурации: отказ от системных модальных окон

Для разработчиков и архитекторов систем 1С 7.7 существует еще один важный аспект. Наблюдения показывают, что триггером вылета платформы часто служит вызов системного диалога выбора даты. При выполнении встроенного метода ВвестиДату() операционная система открывает стандартный календарь Windows, на который немедленно пытается повесить свой перехватчик служба ctfmon.exe.

Если мы хотим гарантировать стабильность работы без изменения системных настроек ОС, мы можем переписать этот участок кода. Заменим стандартный вызов:


// Стандартный вызов, провоцирующий падение в терминале
Если ВвестиДату(ВыбДата, "Выберите дату проведения документа") = 1 Тогда
    // Код обработки даты
КонецЕсли;

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


Дополнительно: решение проблемы 100% загрузки процессора при блокировках

При работе большого количества пользователей в терминале (как в случае, описанном в сообщении 6), помимо вылетов из-за ctfmon.exe, часто возникает проблема взаимных блокировок таблиц базы данных (особенно в DBF-версиях на файлах 1sjourn.dbf) и лавинообразного роста нагрузки на процессоры сервера до 100%.

Для устранения этой смежной проблемы рекомендуется внедрить известное в сообществе исправление ожидания блокировок (патч ВК от Romix). Данное решение оптимизирует цикл ожидания освобождения заблокированных таблиц СУБД, заменяя жесткий бесконечный цикл опроса на циклические паузы с освобождением процессорного времени (функция Sleep), что разгружает сервер и делает работу пользователей плавной и комфортной.

← На главную