При интеграции современных версий 1С:Предприятие 8.3 со старыми базами на платформе 1С 7.7 через механизм COM-соединения системные администраторы и разработчики часто сталкиваются с неприятной проблемой. Регламентные задания успешно подключаются к «семерке», забирают данные, но в момент завершения сеанса процесс 1cv7s.exe аварийно завершается. На сервере начинают накапливаться модальные окна Windows с сообщением «Прекращена работа программы 1С:V7 starter program (for SQL)». Эти окна блокируют выполнение последующих заданий, так как система ожидает реакции пользователя (нажатия кнопки «Закрыть программу»), а в фоновом режиме нажать ее некому.
Проанализируем технические подробности: в журнале событий Windows такая ошибка фиксируется с кодом исключения 0xc0000005 в модуле ntdll.dll. Это классическая ошибка нарушения прав доступа к памяти (Access Violation). Разберем пошагово, как устранить эту проблему, настроив систему и программный код.
Первое, что мы должны проверить — как именно закрывается соединение в коде 1С 8.3. Часто разработчики просто обнуляют переменную, содержащую COM-объект, надеясь на автоматическое завершение процесса. Однако для 1С 7.7 этого недостаточно. Платформа 7.7 при завершении может пытаться записать лог-файлы или обновить состояние интерфейса, что в неинтерактивной сессии приводит к сбою.
Рассмотрим правильный способ завершения работы. Перед тем как разорвать соединение в 1С 8.3, необходимо вызвать внутренний метод 1С 7.7 для корректного выхода. Выясним, какой метод использовать:
// В контексте 1С 8.3 при работе с объектом 7.7
V7 = Новый COMОбъект("V77S.Application"); // или V77.Application
// ... выполняем полезную работу ...
// Вместо простого V7 = Неопределено;
// Вызываем штатное завершение работы программы 1С 7.7
V7.ЗавершитьРаботуПрограммы(0);
V7 = Неопределено;
Параметр 1 в методе ЗавершитьРаботуПрограммы позволяет закрыть программу без подтверждения, что критически важно для регламентных заданий.
Если программное закрытие не помогает, значит, причина кроется в нехватке ресурсов операционной системы для отрисовки графических элементов. Даже если 1С 7.7 запущена в режиме COM, она все равно пытается инициализировать базовые объекты интерфейса (GDI). Для регламентных заданий, которые запускаются в «сессии 0» (неинтерактивной), выделяется очень ограниченный объем памяти под эти задачи.
Разберем, как увеличить этот лимит через реестр Windows. Нам понадобится параметр SharedSection.
regedit.HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems.Windows.SharedSection=xxxx,yyyy,zzzz.Нас интересует третье число (zzzz). По умолчанию оно может составлять 512 или даже меньше. Увеличим его до 1024 или 2048. Это выделит больше памяти для отрисовки «невидимых» окон 1С 7.7 в фоновом режиме, что предотвратит крах ntdll.dll.
Важно: После изменения этого параметра требуется перезагрузка сервера.
Ошибка 0xc0000005 часто вызвана механизмом защиты DEP (Data Execution Prevention). Платформа 1С 7.7 была разработана задолго до появления строгих стандартов безопасности памяти, поэтому Windows может ошибочно считать ее действия вредоносными.
Посмотрим, как добавить 1С 7.7 в исключения:
1cv7s.exe (обычно в папке C:\Program Files (x86)\1Cv77\BIN\).Даже если ошибка продолжает изредка возникать, мы можем сделать так, чтобы она не «вешала» систему и не блокировала очередь заданий. Для этого отключим визуальное отображение отчетов об ошибках (WER).
Проанализируем необходимые изменения в реестре для пользователя, под которым запущен сервер 1С:
HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting найдем или создадим параметр DontShowUI типа DWORD и установим значение 1.HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting создадим параметр Disabled со значением 1.Эти настройки заставят Windows «молча» закрывать упавший процесс 1cv7s.exe, позволяя 1С 8.3 запустить новое регламентное задание в штатном режиме.
Выясним еще одну неочевидную причину: 1С 7.7 при инициализации (даже через COM) обращается к настройкам принтера по умолчанию. Если регламентное задание выполняется под системной учетной записью, у которой нет принтера, или если сетевой принтер недоступен, процесс может «зависнуть» или вылететь с ошибкой обращения к памяти.
Рекомендуемые действия:
1C:Enterprise Server.Microsoft XPS Document Writer) и сделайте его принтером по умолчанию.BIN в каталоге установки 1С 7.7 и на папку с самой информационной базой. Часто ошибка в ntdll.dll возникает при попытке записи временного файла в защищенную директорию при закрытии программы.В завершение рассмотрим радикальный, но эффективный метод — принудительную очистку памяти. Если после выполнения всех операций в коде 1С 8.3 вы видите, что процессы 1cv7s.exe все равно остаются в диспетчере задач, можно применить команду taskkill.
Пример кода в 1С 8.3 для «подчистки» за собой:
КомандаСистемы("taskkill /f /im 1cv7s.exe");
Использование этого метода гарантирует, что к следующему запуску регламентного задания оперативная память сервера будет очищена от «призраков» старых соединений, а модальные окна не будут накапливаться в сессии.