Работа устаревших, но до сих пор активно используемых конфигураций на платформе 1С:Предприятие 7.7 в терминальной среде (RDP или Citrix) часто сопровождается внезапными и непредсказуемыми вылетами программы. Пользователи могут жаловаться на то, что 1С мгновенно закрывается без видимых причин при подборе номенклатуры, открытии диалога печати, формировании отчетов или проведении документов. При этом в журнале событий Windows (Event Viewer) регистрируются ошибки приложения 1cv7s.exe, ссылающиеся на сбои в библиотеках mfc42.dll, Moxel.dll, kernel32.dll или gdi32.dll.
Давайте подробно разберем природу этого конфликта и рассмотрим проверенные практические методы его устранения — от простых административных манипуляций до тонкой настройки реестра и изоляции библиотек.
Платформа 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.
Самым популярным и быстрым способом решения проблемы среди системных администраторов является полное исключение процесса ctfmon.exe из пользовательских терминальных сессий. Однако операционная система Windows снабжена механизмом защиты системных файлов (WFP — Windows File Protection), который автоматически восстанавливает исполняемый файл службы при попытке его удаления.
Проанализируем по шагам, как правильно нейтрализовать этот процесс на сервере:
C:\WINDOWS\system32\dllcache\.ctfmon.exe и переименуем его, например, в ctfmon.bak.C:\WINDOWS\system32\.ctfmon.exe в ctfmon.old.C:\WINDOWS\system32\ пустой текстовый файл, назовем его ctfmon.exe и в его свойствах установим флаг Только чтение, а также уберем права на запись для системы во вкладке "Безопасность".ctfmon.exe в диспетчере задач для каждого подключенного пользователя.После проведения этих манипуляций служба перестанет запускаться, и вылеты 1С прекратятся.
После удаления ctfmon.exe администраторы сталкиваются со следующей проблемой: у пользователей в терминальных сессиях пропадает языковая панель и теряется возможность переключения раскладки клавиатуры (с русского на английский и наоборот). Нам необходимо предоставить альтернативный инструмент для переключения языков.
Рассмотрим два надежных варианта замены:
Утилита internat.exe использовалась в более ранних версиях операционных систем (Windows NT / 2000) и не имеет внутренних конфликтов с библиотеками MFC. Мы можем использовать её для стабильной работы на Windows Server 2003.
internat.exe (рекомендуется версия 5.0.2920.0 для Windows 2000/2003) и сопутствующую ему библиотеку индикатора раскладки.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"internat.exe"="internat.exe"
В качестве альтернативы можно установить на терминальный сервер программное обеспечение для автоматического переключения раскладки клавиатуры, например Punto Switcher. Программа работает на уровне перехвата ввода клавиатуры и не использует механизмы службы TSF, что полностью защищает сессии 1С от падений. Достаточно установить программу на сервере и добавить её исполняемый файл в автозагрузку терминальных пользователей.
Если мы не хотим физически удалять файлы операционной системы и нарушать целостность конфигурации Windows File Protection, мы можем отключить интеграцию текстовых служб непосредственно через системный реестр. Этот метод является более элегантным и безопасным.
Разберем, какие параметры необходимо скорректировать:
regedit под учетной записью администратора.HKEY_CURRENT_USER\Software\Microsoft\CTF.
Создадим параметр типа DWORD с именем Disable Thread Input Manager и присвоим ему значение 1.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\SystemShared.
Найдем или создадим параметр CUAS (тип DWORD) и установим его значение в 0.
Для применения изменений пользователям потребуется перелогиниться в своих терминальных сессиях.
Часто аварийное завершение работы происходит из-за того, что на сервере установлены различные сторонние приложения, которые регистрируют свои (зачастую некорректные или модифицированные) версии общей библиотеки mfc42.dll в системе. В результате платформа 1С начинает обращаться к системной библиотеке, которая подвержена внешним воздействиям.
Мы можем изолировать процесс 1С, заставив его использовать строго определенную, стабильную версию библиотеки:
mfc42.dll (например, из состава официальных дистрибутивов Visual Studio или чистой установки ОС).C:\Program Files (x86)\1Cv77\BIN\.1cv7s.exe.local (или 1cv7.exe.local, в зависимости от используемого исполняемого файла).Присутствие файла с расширением .local активирует в Windows механизм перенаправления библиотек (DLL Redirection). Теперь при запуске 1С операционная система в первую очередь загрузит файлы библиотек из локального каталога программы, полностью игнорируя системные DLL в папке System32, что исключит влияние внешних служб.
Служба текстового ввода динамически транслирует код перехвата ввода в работающие процессы. Система безопасности Windows на уровне механизма DEP (Data Execution Prevention) может расценить это действие как попытку несанкционированного изменения памяти (переполнение буфера) и принудительно завершить процесс 1cv7s.exe с ошибкой.
Чтобы исключить этот сценарий, настроим правила DEP:
1cv7.exe, 1cv7s.exe).Для разработчиков и архитекторов систем 1С 7.7 существует еще один важный аспект. Наблюдения показывают, что триггером вылета платформы часто служит вызов системного диалога выбора даты. При выполнении встроенного метода ВвестиДату() операционная система открывает стандартный календарь Windows, на который немедленно пытается повесить свой перехватчик служба ctfmon.exe.
Если мы хотим гарантировать стабильность работы без изменения системных настроек ОС, мы можем переписать этот участок кода. Заменим стандартный вызов:
// Стандартный вызов, провоцирующий падение в терминале
Если ВвестиДату(ВыбДата, "Выберите дату проведения документа") = 1 Тогда
// Код обработки даты
КонецЕсли;
На открытие нашей собственной, созданной в конфигураторе обработки-календаря. Собственные формы 1С отрисовываются внутренними механизмами платформы и не вызывают системных конфликтов с потоками ввода текстовых служб Windows.
При работе большого количества пользователей в терминале (как в случае, описанном в сообщении 6), помимо вылетов из-за ctfmon.exe, часто возникает проблема взаимных блокировок таблиц базы данных (особенно в DBF-версиях на файлах 1sjourn.dbf) и лавинообразного роста нагрузки на процессоры сервера до 100%.
Для устранения этой смежной проблемы рекомендуется внедрить известное в сообществе исправление ожидания блокировок (патч ВК от Romix). Данное решение оптимизирует цикл ожидания освобождения заблокированных таблиц СУБД, заменяя жесткий бесконечный цикл опроса на циклические паузы с освобождением процессорного времени (функция Sleep), что разгружает сервер и делает работу пользователей плавной и комфортной.