Почему процесс 1cv7.exe не завершается после выхода из 1С 7.7 и как это исправить?

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

При эксплуатации платформы 1С:Предприятие 7.7 как в локальном, так и в терминальном режиме на сервере нередко возникает неприятная ситуация: пользователь штатно закрывает программу, графическое окно исчезает, но в диспетчере задач процесс 1cv7.exe (или 1cv7s.exe) продолжает бесконечно висеть в памяти. Этот «зависший» процесс удерживает блокировки файлов базы данных (в частности, 1cv7.LCK, журналов регистрации Syslog\1cv7.mlg и индексных файлов), не позволяя другим пользователям монопольно зайти в базу или выполнить резервное копирование.

Разберем подробно, почему платформа не завершает свой процесс, как провести диагностику и какими методами можно полностью решить эту проблему.

Выясняем природу зависания: локализация проблемы

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

  1. Подключим к списку баз любую типовую конфигурацию (например, чистую «Торговля и Склад 7.7» или «Бухгалтерский учет»).
  2. Запустим сеанс под тем же пользователем на том же сервере или компьютере и сразу закроем программу.
  3. Если типовая база закрывается штатно и процесс сразу исчезает из списка задач, значит, проблема связана со спецификой отраслевого решения (системой защиты, внешними компонентами или кодом конфигурации).
  4. Если зависает даже чистая типовая база или окно Конфигуратора, источник проблемы находится на уровне операционной системы, сетевых разделяемых ресурсов или стороннего программного обеспечения.

Причина 1. Зависание внешних компонент защиты и неосвобожденные COM-объекты

В конфигурациях сторонних разработчиков (например, решениях от «1С-Рарус», таких как «Альфа-Авто») активно применяются собственные внешние компоненты защиты (библиотеки AutoService.dll, AUTOTRAN.dll и др.), работающие совместно с электронными ключами. При старте системы в глобальном модуле выполняется инициализация этих компонент.

Посмотрим на типовой фрагмент процедуры ПриНачалеРаботыСистемы:


Если ЗагрузитьВнешнююКомпоненту("V7plus.dll") = 1 Тогда
    глАнализатор = СоздатьОбъект("AddIn.XMLParser");
    глТекст = СоздатьОбъект("AddIn.V7TextFile");
КонецЕсли;

Состояние("Инициализация защищенных функций");
Если ЗагрузитьВнешнююКомпоненту("AutoService.dll") = 0 Тогда
    Предупреждение("ОШИБКА ИНИЦИАЛИЗАЦИИ ЗАЩИЩЕННЫХ ФУНКЦИЙ", "!!!");
    СтатусВозврата(0);
    Возврат;
Иначе
    Рарус_Компонента = СоздатьОбъект("AddIn.AutoService");
    Рарус_Компонента.ПриНачалеРаботыСистемы();
КонецЕсли;

Проанализируем этот код: в процессе работы создаются глобальные объекты для работы с XML и файлами через V7plus.dll, а также управляющий объект внешней компоненты защиты. Защитные компоненты часто создают скрытые системные потоки (threads), которые периодически опрашивают ключ защиты по протоколам USB, LPT или по локальной сети.

Если при выходе из программы ссылка на COM-объект или внешнюю компоненту остается активной, внутренний счетчик ссылок Windows COM не сбрасывается в ноль. В результате динамическая библиотека не может корректно выполнить выгрузку из адресного пространства (процедуру DLL_PROCESS_DETACH), и весь процесс платформы намертво зависает в памяти.

Для гарантированной выгрузки объектов откроем глобальный модуль и перейдем к предопределенной процедуре ПриЗавершенииРаботыСистемы. Обязательно выполним принудительное обнуление всех глобальных переменных, ссылающихся на внешние объекты:


Процедура ПриЗавершенииРаботыСистемы()
    // Запрос подтверждения выхода пользователя
    Если Вопрос("Завершить работу программы?", "Да+Нет", 10) = "Нет" Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;

    // Принудительно освобождаем COM-объекты V7Plus
    глАнализатор = 0;
    глТекст = 0;

    // Принудительно выгружаем объект системы защиты
    Рарус_Компонента = 0;
КонецПроцедуры

Присваивание переменной числового значения 0 принудительно уменьшает счетчик ссылок COM-объекта, позволяя библиотеке освободить занятые дескрипторы и корректно остановить свои фоновые потоки.

Причина 2. Конфликт со сторонним системным софтом и службами перехвата (TeamViewer)

Одной из скрытых и распространенных причин зависания 1cv7.exe и 1cv7s.exe является работа утилит удаленного доступа и средств записи экрана (в частности, TeamViewer версий 11–12 и выше). При запуске клиентская часть подобного ПО внедряет свои библиотеки (hook-перехватчики) в графические оконные процессы для отображения кнопок быстрого доступа в заголовках окон.

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

  1. Файл блокировок сессий: 1cv7.LCK;
  2. Системный журнал: \Syslog\1cv7.mlg;
  3. Служебные ссылки: \Syslog\links.tmp и \SYSLOG\1cv7evt.txt.

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

Причина 3. Блокировки файлов по сети (SMB Oplocks) и антивирусные сканеры

Если база данных расположена на сетевом диске, при выходе из программы 1С сбрасывает дисковые кэши файлов .dbf и .cdx. При включенных оппортунистических блокировках Windows (SMB2/SMB3 Leases и Oplocks) сетевой стек может заблокировать закрытие дескриптора файла в ожидании подтверждения от сервера, что приводит к зависанию процесса 1cv7.exe в состоянии ожидания ядра.

Аналогично действуют антивирусные программы с включенным монитором реального времени (On-Access Scanner): когда 1С закрывает файл журнала или блокировок, антивирус перехватывает его для проверки, блокируя освобождение хэндла.

Для устранения проблемы настроим сервер и рабочие станции:

  1. Добавим каталог с исполняемыми файлами платформы (каталог BIN) и каталог информационной базы целиком в список исключений антивирусного сканера.
  2. Исключим из проверки расширения файлов *.dbf, *.cdx, *.lck, *.mlg, *.tmp.
  3. Если база лежит на файловом сервере, отключим оппортунистические блокировки на уровне службы общего доступа к файлам через системный реестр (параметр EnableOplocks = 0 в ветке LanmanServer\Parameters).

Причина 4. Предотвращение выполнения данных (DEP) и режим совместимости

Платформа 1С:Предприятие 7.7 разрабатывалась для старых версий операционных систем. Современные механизмы защиты памяти Windows (DEP — Data Execution Prevention) могут прерывать процедуру деинициализации старых библиотек внешних компонент при освобождении динамической памяти, оставляя процесс «висеть» без вывода сообщений об ошибке.

Разберем, как исправить эту проблему средствами операционной системы:

  1. Откроем свойства системы, перейдем в раздел Дополнительно → Быстродействие → вкладка Предотвращение выполнения данных.
  2. Если выбран режим включения DEP для всех программ, кроме выбранных, добавим файл 1cv7.exe (или 1cv7s.exe) из папки установки BIN в список исключений.
  3. В свойствах исполняемого файла 1cv7.exe на вкладке Совместимость включим режим совместимости с Windows XP (Пакет обновления 3). Это скорректирует работу диспетчера системной кучи (Heap Manager) и предотвратит зависания при освобождении ресурсов.

Обходное решение для терминального сервера

Если корень проблемы лежит в закрытой библиотеке защиты, обновление которой невозможно получить от разработчика, на терминальном сервере можно настроить запуск 1С через командный сценарий. Он гарантирует завершение «хвостов» процесса строго после того, как пользователь закрыл основное окно программы.

Создадим командный файл start1c.cmd следующего содержания:


@echo off
start /wait "" "C:\Program Files (x86)\1Cv77\BIN\1cv7.exe" enterprise /D"D:\Bases\AlphaAuto\"
taskkill /f /im 1cv7.exe /fi "USERNAME eq %USERNAME%"

Команда start /wait приостанавливает выполнение скрипта до тех пор, пока пользователь взаимодействует с программой. Как только окно 1С закрывается, управление возвращается скрипту, и утилита taskkill принудительно завершает оставшийся в памяти процесс, фильтруя его строго по имени текущей терминальной сессии (%USERNAME%), не затрагивая сеансы других пользователей.

← На главную