Как устранить ошибку «Прекращена работа программы 1С:V7 starter program» при COM-соединении из 1С 8.3?

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

При интеграции современных версий 1С:Предприятие 8.3 со старыми базами на платформе 1С 7.7 через механизм COM-соединения системные администраторы и разработчики часто сталкиваются с неприятной проблемой. Регламентные задания успешно подключаются к «семерке», забирают данные, но в момент завершения сеанса процесс 1cv7s.exe аварийно завершается. На сервере начинают накапливаться модальные окна Windows с сообщением «Прекращена работа программы 1С:V7 starter program (for SQL)». Эти окна блокируют выполнение последующих заданий, так как система ожидает реакции пользователя (нажатия кнопки «Закрыть программу»), а в фоновом режиме нажать ее некому.

Проанализируем технические подробности: в журнале событий Windows такая ошибка фиксируется с кодом исключения 0xc0000005 в модуле ntdll.dll. Это классическая ошибка нарушения прав доступа к памяти (Access Violation). Разберем пошагово, как устранить эту проблему, настроив систему и программный код.

Принудительное завершение работы 1С 7.7 из кода

Первое, что мы должны проверить — как именно закрывается соединение в коде 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 в методе ЗавершитьРаботуПрограммы позволяет закрыть программу без подтверждения, что критически важно для регламентных заданий.

Настройка Desktop Heap (Рабочий стол сессии)

Если программное закрытие не помогает, значит, причина кроется в нехватке ресурсов операционной системы для отрисовки графических элементов. Даже если 1С 7.7 запущена в режиме COM, она все равно пытается инициализировать базовые объекты интерфейса (GDI). Для регламентных заданий, которые запускаются в «сессии 0» (неинтерактивной), выделяется очень ограниченный объем памяти под эти задачи.

Разберем, как увеличить этот лимит через реестр Windows. Нам понадобится параметр SharedSection.

  1. Откроем редактор реестра regedit.
  2. Перейдем в ветку: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems.
  3. Найдем строковый параметр Windows.
  4. В его длинном значении найдем фрагмент SharedSection=xxxx,yyyy,zzzz.

Нас интересует третье число (zzzz). По умолчанию оно может составлять 512 или даже меньше. Увеличим его до 1024 или 2048. Это выделит больше памяти для отрисовки «невидимых» окон 1С 7.7 в фоновом режиме, что предотвратит крах ntdll.dll.

Важно: После изменения этого параметра требуется перезагрузка сервера.

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

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

Посмотрим, как добавить 1С 7.7 в исключения:

  1. Откроем Свойства системы -> Дополнительно -> Производительность (Параметры).
  2. Перейдем на вкладку Предотвращение выполнения данных.
  3. Выберем вариант «Включить DEP для всех программ и служб, кроме выбранных ниже».
  4. Нажмем «Добавить» и укажем путь к файлу 1cv7s.exe (обычно в папке C:\Program Files (x86)\1Cv77\BIN\).

Отключение диалоговых окон Windows Error Reporting

Даже если ошибка продолжает изредка возникать, мы можем сделать так, чтобы она не «вешала» систему и не блокировала очередь заданий. Для этого отключим визуальное отображение отчетов об ошибках (WER).

Проанализируем необходимые изменения в реестре для пользователя, под которым запущен сервер 1С:

  1. В ветке HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting найдем или создадим параметр DontShowUI типа DWORD и установим значение 1.
  2. В ветке HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting создадим параметр Disabled со значением 1.

Эти настройки заставят Windows «молча» закрывать упавший процесс 1cv7s.exe, позволяя 1С 8.3 запустить новое регламентное задание в штатном режиме.

Проблема принтера по умолчанию и прав доступа

Выясним еще одну неочевидную причину: 1С 7.7 при инициализации (даже через COM) обращается к настройкам принтера по умолчанию. Если регламентное задание выполняется под системной учетной записью, у которой нет принтера, или если сетевой принтер недоступен, процесс может «зависнуть» или вылететь с ошибкой обращения к памяти.

Рекомендуемые действия:

  1. Зайдите на сервер под учетной записью, от которой работает служба 1C:Enterprise Server.
  2. Установите любой локальный виртуальный принтер (например, Microsoft XPS Document Writer) и сделайте его принтером по умолчанию.
  3. Убедитесь, что у этого пользователя есть полные права на папку BIN в каталоге установки 1С 7.7 и на папку с самой информационной базой. Часто ошибка в ntdll.dll возникает при попытке записи временного файла в защищенную директорию при закрытии программы.

Очистка зависших процессов

В завершение рассмотрим радикальный, но эффективный метод — принудительную очистку памяти. Если после выполнения всех операций в коде 1С 8.3 вы видите, что процессы 1cv7s.exe все равно остаются в диспетчере задач, можно применить команду taskkill.

Пример кода в 1С 8.3 для «подчистки» за собой:

КомандаСистемы("taskkill /f /im 1cv7s.exe");

Использование этого метода гарантирует, что к следующему запуску регламентного задания оперативная память сервера будет очищена от «призраков» старых соединений, а модальные окна не будут накапливаться в сессии.

← На главную