При эксплуатации платформы 1С:Предприятие 7.7 как в локальном, так и в терминальном режиме на сервере нередко возникает неприятная ситуация: пользователь штатно закрывает программу, графическое окно исчезает, но в диспетчере задач процесс 1cv7.exe (или 1cv7s.exe) продолжает бесконечно висеть в памяти. Этот «зависший» процесс удерживает блокировки файлов базы данных (в частности, 1cv7.LCK, журналов регистрации Syslog\1cv7.mlg и индексных файлов), не позволяя другим пользователям монопольно зайти в базу или выполнить резервное копирование.
Разберем подробно, почему платформа не завершает свой процесс, как провести диагностику и какими методами можно полностью решить эту проблему.
Первым шагом необходимо определить, в чем именно кроется причина: в самой технологической платформе 1С, в коде отраслевой конфигурации или во внешнем системном окружении. Для этого выполним простую проверку:
В конфигурациях сторонних разработчиков (например, решениях от «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-объекта, позволяя библиотеке освободить занятые дескрипторы и корректно остановить свои фоновые потоки.
Одной из скрытых и распространенных причин зависания 1cv7.exe и 1cv7s.exe является работа утилит удаленного доступа и средств записи экрана (в частности, TeamViewer версий 11–12 и выше). При запуске клиентская часть подобного ПО внедряет свои библиотеки (hook-перехватчики) в графические оконные процессы для отображения кнопок быстрого доступа в заголовках окон.
Этот механизм перехвата нарушает стандартную последовательность закрытия дескрипторов ввода-вывода платформы 1С:Предприятие 7.7. В результате окно программы пропадает, но процесс остается в памяти, продолжая жестко удерживать файлы базы данных:
1cv7.LCK;\Syslog\1cv7.mlg;\Syslog\links.tmp и \SYSLOG\1cv7evt.txt.Чтобы проверить эту гипотезу, закроем клиентское приложение TeamViewer на рабочей станции или в терминальной сессии (обратите внимание: фоновая системная служба обычно не мешает, блокировку вызывает именно запущенный пользовательский интерфейс TeamViewer.exe). Если после закрытия TeamViewer платформа 1С завершается штатно, необходимо отключить интеграцию TeamViewer с окнами приложений в его дополнительных настройках либо исключить запуск клиентской части на терминальном сервере.
Если база данных расположена на сетевом диске, при выходе из программы 1С сбрасывает дисковые кэши файлов .dbf и .cdx. При включенных оппортунистических блокировках Windows (SMB2/SMB3 Leases и Oplocks) сетевой стек может заблокировать закрытие дескриптора файла в ожидании подтверждения от сервера, что приводит к зависанию процесса 1cv7.exe в состоянии ожидания ядра.
Аналогично действуют антивирусные программы с включенным монитором реального времени (On-Access Scanner): когда 1С закрывает файл журнала или блокировок, антивирус перехватывает его для проверки, блокируя освобождение хэндла.
Для устранения проблемы настроим сервер и рабочие станции:
BIN) и каталог информационной базы целиком в список исключений антивирусного сканера.*.dbf, *.cdx, *.lck, *.mlg, *.tmp.EnableOplocks = 0 в ветке LanmanServer\Parameters).Платформа 1С:Предприятие 7.7 разрабатывалась для старых версий операционных систем. Современные механизмы защиты памяти Windows (DEP — Data Execution Prevention) могут прерывать процедуру деинициализации старых библиотек внешних компонент при освобождении динамической памяти, оставляя процесс «висеть» без вывода сообщений об ошибке.
Разберем, как исправить эту проблему средствами операционной системы:
1cv7.exe (или 1cv7s.exe) из папки установки BIN в список исключений.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%), не затрагивая сеансы других пользователей.