При организации автоматического выполнения регламентных процедур в 1С:Предприятии 7.7 через планировщик заданий Windows и командные файлы (CMD/BAT) разработчики часто сталкиваются со сбоем: после выполнения внешней обработки и вызова метода завершения работы программа падает с критической системной ошибкой «Приложение по адресу обратилось к памяти...» (Access Violation). На экране появляется модальное окно операционной системы с кнопками выбора отладки или закрытия, из-за чего процесс 1С не завершается, а командный файл останавливает свое дальнейшее выполнение.
Проанализируем причины такого поведения платформы 1С 7.7 и рассмотрим по шагам надежные способы решения этой проблемы.
Платформа 1С 7.7 построена на архитектуре Windows-приложений с жесткой зависимостью от цикла сообщений оконного интерфейса. Ошибка нарушения прав доступа к памяти при вызове метода ЗавершитьРаботуСистемы() обычно возникает по следующим причинам:
ЗавершитьРаботуСистемы() вызывается непосредственно из модуля формы обработки или до завершения отрисовки главного окна программы, ядро платформы пытается обратиться к уже освобожденным или еще не созданным оконным дескрипторам.v7plus.dll), подключений к базам через ADO, парсеров XML или объектов MS Excel перед закрытием платформы может произойти конфликт деинициализации библиотек в памяти.Классический и наиболее надежный механизм штатного завершения работы 1С 7.7 при регламентном старте — отказ от вызова ЗавершитьРаботуСистемы() внутри внешней обработки и корректное прерывание процедуры ПриНачалеРаботыСистемы() в глобальном модуле конфигурации.
Разберем по шагам, как настроить этот механизм:
ЗавершитьРаботуСистемы().ПриНачалеРаботыСистемы().СтатусВозврата(0) и оператор Возврат.Посмотрим на пример реализации в глобальном модуле конфигурации:
Процедура ПриНачалеРаботыСистемы()
// Проверяем имя пользователя, назначенного для регламентных задач
Если ИмяПользователя() = "РегламентныйРобот" Тогда
// Открываем и выполняем внешнюю обработку
ОткрытьФорму("Обработка", , КаталогИБ() + "ExtForms\AutoTask.ert");
// Отменяем дальнейший запуск системы и корректно выходим
СтатусВозврата(0);
Возврат;
КонецЕсли;
// Стандартный код инициализации для остальных пользователей
// ...
КонецПроцедуры
Когда платформа встречает СтатусВозврата(0) в процедуре ПриНачалеРаботыСистемы(), она штатно прерывает процесс старта и освобождает все занятые ресурсы без вызова исключений доступа к памяти.
Если вносить изменения в конфигурацию нежелательно, либо падение процесса вызвано сбоем в сторонних DLL, необходимо предотвратить блокировку скрипта планировщика.
Рассмотрим доработку командного файла (CMD/BAT). Вместо синхронного ожидания закрытия окна скрипт запускает 1С, ожидает завершения обработки по тайм-ауту (или по факту создания специального файла-флага) и принудительно снимает зависший процесс с помощью утилиты taskkill:
@echo off
rem Запуск 1С 7.7 в монопольном/пакетном режиме
start "" "C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe" enterprise /D"C:\Bases\Trade" /N"Регламент" /P"Pass123"
rem Ожидание завершения работы обработки (например, 60 секунд)
timeout /t 60 /nobreak > nul
rem Принудительное закрытие зависшего процесса платформы
taskkill /F /IM 1cv7s.exe /T > nul 2>&1
Чтобы операционная система при аварии процесса не выводила модальное окно с выбором отладки, блокирующее запуск, настроим параметры системного реестра для служебной учетной записи:
DontShowUI со значением 1.Auto и установим его в значение 0, чтобы отключить запуск интерактивного отладчика.Если в коде регламентной обработки создаются внешние объекты, проанализируем код выгрузки и деинициализации. Перед завершением работы обязательно освобождаем память от всех созданных COM-соединений:
// Пример корректной очистки переменных перед выходом
ОбъектExcel = 0;
ОбъектАДО = 0;
Также в глобальном модуле перед вызовом процедур подключения сканеров штрихкода и фискальных регистраторов обязательно добавляем условие проверки: Если ИмяПользователя() <> "РегламентныйРобот" Тогда ... КонецЕсли;, чтобы внешние драйверы не пытались загрузиться в фоновом сеансе.