При разработке утилит обслуживания баз данных, работающих на движке Paradox, часто возникает необходимость автоматизации обслуживания службы через КомандаСистемы. Однако на практике программисты 1С часто сталкиваются с тем, что команда, успешно работающая в консоли, не запускается из 1С. Разберем, почему это происходит и как выстроить надежный механизм управления службами.
Первая и самая распространенная причина заключается в архитектуре 64-битных операционных систем и 32-битных приложений, таких как платформа 1С 7.7. В Windows существует механизм перенаправления файловой системы: когда 32-битный процесс обращается к системной папке System32, ОС автоматически перенаправляет этот запрос в SysWOW64.
Если ваша утилита (например, PsService.exe) находится в System32, платформа 1С ее там «не видит». Помещение исполняемого файла в SysWOW64 или указание полного пути к файлу решает проблему видимости приложения. Всегда старайтесь прописывать полный путь, чтобы избежать зависимости от системных переменных окружения PATH.
Наиболее надежным способом управления командами системы из 1С является создание промежуточных пакетных файлов. Это позволяет изолировать логику запуска от кода 1С и тестировать команды напрямую в ОС.
.bat файл в каталоге базы данных.NET STOP srvPricechecker или PsService.exe \\ИмяКомпа -u Пользователь -p Пароль stop srvPricechecker.КомандаСистемы("C:\ПутьКБатнику\script.bat");.Рассмотрим пример содержимого батника для корректной работы:
@echo off
:: Переходим в каталог, где лежит батник
pushd "%CD%"
:: Выполнение команды остановки службы
PsService.exe \\M-001 -u Manager -p 1978 stop srvPricechecker
:: Пауза для отладки, если нужно увидеть результат выполнения
pause
Даже если команда прописана верно, она может не сработать из-за нехватки прав. Управление службами требует прав администратора. Если 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 периодически требуется переиндексация и сжатие (Pack). Файлы базы могут раздуваться из-за удаленных записей, которые физически остаются на диске. Применение специальных утилит (таких как DTUTIL32) позволяет восстановить структуру индексов и физически удалить неиспользуемые записи.
Важно помнить, что дополнительные индексные файлы (с расширениями типа .PX, .VAL) критически важны для работы службы. Если утилита сжимает базу, убедитесь, что она перестраивает все необходимые индексы, иначе служба может не стартовать или работать нестабильно. Рекомендуется сначала протестировать процесс упаковки на копии базы, контролируя размер файла и количество записей после проведения процедуры.
В завершение разберем краткий чек-лист по настройке:
.bat файлах.SysWOW64, если работаете из 32-битного приложения на 64-битной системе.команда > log.txt 2>&1), если нужно проанализировать ошибки выполнения внутри батника.