Почему не отрабатывает КомандаСистемы для управления службами Windows из 1С:Предприятие 7.7?

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

При разработке утилит обслуживания баз данных, работающих на движке Paradox, часто возникает необходимость автоматизации обслуживания службы через КомандаСистемы. Однако на практике программисты 1С часто сталкиваются с тем, что команда, успешно работающая в консоли, не запускается из 1С. Разберем, почему это происходит и как выстроить надежный механизм управления службами.

Анализ проблемы: почему 1С не видит утилиты и не запускает службы

Первая и самая распространенная причина заключается в архитектуре 64-битных операционных систем и 32-битных приложений, таких как платформа 1С 7.7. В Windows существует механизм перенаправления файловой системы: когда 32-битный процесс обращается к системной папке System32, ОС автоматически перенаправляет этот запрос в SysWOW64.

Если ваша утилита (например, PsService.exe) находится в System32, платформа 1С ее там «не видит». Помещение исполняемого файла в SysWOW64 или указание полного пути к файлу решает проблему видимости приложения. Всегда старайтесь прописывать полный путь, чтобы избежать зависимости от системных переменных окружения PATH.

Решение: использование пакетных файлов (.bat)

Наиболее надежным способом управления командами системы из 1С является создание промежуточных пакетных файлов. Это позволяет изолировать логику запуска от кода 1С и тестировать команды напрямую в ОС.

  1. Создайте .bat файл в каталоге базы данных.
  2. Внутри файла пропишите необходимую команду управления, например: NET STOP srvPricechecker или PsService.exe \\ИмяКомпа -u Пользователь -p Пароль stop srvPricechecker.
  3. Вызывайте этот файл из 1С через команду: КомандаСистемы("C:\ПутьКБатнику\script.bat");.

Рассмотрим пример содержимого батника для корректной работы:


@echo off
:: Переходим в каталог, где лежит батник
pushd "%CD%"
:: Выполнение команды остановки службы
PsService.exe \\M-001 -u Manager -p 1978 stop srvPricechecker
:: Пауза для отладки, если нужно увидеть результат выполнения
pause

Проблема прав доступа и UAC

Даже если команда прописана верно, она может не сработать из-за нехватки прав. Управление службами требует прав администратора. Если 1С запущен не от имени администратора, система заблокирует выполнение команд NET START или STOP. Чтобы обойти это ограничение, выполним следующее:

Пример блока для повышения прав внутри .bat файла:


@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
    goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
    echo Set UAC = CreateObject("Shell.Application") > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B
:gotAdmin
:: Далее ваш код команды
PsService.exe \\M-001 -u Manager -p 1978 stop srvPricechecker

Обслуживание баз Paradox: упаковка данных

При работе с базами Paradox периодически требуется переиндексация и сжатие (Pack). Файлы базы могут раздуваться из-за удаленных записей, которые физически остаются на диске. Применение специальных утилит (таких как DTUTIL32) позволяет восстановить структуру индексов и физически удалить неиспользуемые записи.

Важно помнить, что дополнительные индексные файлы (с расширениями типа .PX, .VAL) критически важны для работы службы. Если утилита сжимает базу, убедитесь, что она перестраивает все необходимые индексы, иначе служба может не стартовать или работать нестабильно. Рекомендуется сначала протестировать процесс упаковки на копии базы, контролируя размер файла и количество записей после проведения процедуры.

Рекомендации по автоматизации

В завершение разберем краткий чек-лист по настройке:

  1. Всегда используйте полные пути к утилитам в .bat файлах.
  2. Размещайте сторонние утилиты в SysWOW64, если работаете из 32-битного приложения на 64-битной системе.
  3. Используйте перенаправление вывода в лог-файл (например, команда > log.txt 2>&1), если нужно проанализировать ошибки выполнения внутри батника.
  4. При удаленном управлении службами предпочтительнее использовать WMI или PowerShell, если политика безопасности компании позволяет их использование.
← На главную