Автоматизация обслуживания баз данных — одна из приоритетных задач системного администратора и разработчика 1С. Часто возникает ситуация, когда необходимо запустить выгрузку информационной базы в файл .dt программно, используя при этом права конкретного пользователя Windows (например, администратора домена или локального администратора с расширенными привилегиями). Однако использование стандартной команды runas в связке с методом ЗапуститьПриложение часто преподносит неприятные сюрпризы: код выполняется без ошибок, но результат (файл выгрузки) не появляется.
В этой статье мы подробно разберем, почему «тихий» запуск может не работать, проанализируем типичные ошибки в синтаксисе и рассмотрим надежные альтернативные способы решения задачи.
Рассмотрим исходную ситуацию. Пользователь пытается запустить командный файл через конструкцию:
Команда = "runas /savecred /user:PC\Дмитрий c:\1.cmd";
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Первое, на что стоит обратить внимание — это содержимое самого .cmd файла. В процессе обсуждения выяснилось, что даже небольшая опечатка в пути к базе данных может привести к остановке процесса. Например, путь C:Avalon без обратного слеша (правильно: C:\Avalon) делает команду некорректной. Проанализируем пример содержимого батника:
"C:\Program Files (x86)\1cv8\8.3.13.1644\BIN\1CV8.EXE" DESIGNER /F "C:\Avalon" /DumpIB "c:\1\58.dt"
Обратите внимание, что использование кавычек для путей с пробелами — обязательное условие. Если путь к исполняемому файлу 1С содержит пробелы (как в Program Files), вся строка должна быть заключена в кавычки.
Ключевая проблема при использовании runas из 1С заключается в контексте выполнения. Проанализируем, как работает флаг /savecred. Эта опция позволяет использовать сохраненные учетные данные, чтобы система не запрашивала пароль интерактивно. Однако здесь кроется ловушка:
runas первый раз вручную и ввел пароль. Если 1С запущена под другим пользователем (или под технической учетной записью службы USR1CV8), она не увидит «чужих» сохраненных паролей.runas по своей природе рассчитана на консольный ввод. Даже если пароль сохранен, при определенных условиях (например, если пароль просрочен) система может попытаться вывести запрос в невидимое окно, что приведет к вечному зависанию процесса ЗапуститьПриложение.Если код выполняется на стороне сервера 1С, необходимо учитывать, что службы Windows работают в так называемой «Сессии 0». В этой сессии нет графического интерфейса и рабочего стола. Любая попытка запустить приложение, которое требует взаимодействия с пользователем (а runas или Конфигуратор 1С иногда могут выдавать невидимые диалоговые окна), будет блокирована операционной системой из соображений безопасности.
Выясним причину, по которой выгрузка не идет: часто это отсутствие прав доступа у пользователя, под которым запускается runas, к папке назначения или к папке с установленной платформой 1С. Процесс запускается, но мгновенно закрывается с ошибкой «Отказано в доступе», которую мы не видим в 1С.
Чтобы перестать гадать, почему выгрузка не происходит, необходимо внедрить систему логирования. Разберем, как это сделать правильно. В командном файле или непосредственно в строке запуска следует перенаправить потоки ошибок и вывода в текстовый файл.
Рассмотрим пример модернизированной команды запуска:
Команда = "cmd /c ""runas /savecred /user:PC\Дмитрий ""c:\1\1.cmd"" >> c:\1\log.txt 2>&1""";
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Здесь 2>&1 означает, что ошибки (поток 2) будут направлены туда же, куда и обычный вывод (поток 1). После выполнения команды мы сможем открыть файл log.txt и увидеть реальную причину неудачи.
Также крайне важно добавить ключ логирования для самого Конфигуратора 1С внутри батника:
"C:\Program Files (x86)\1cv8\8.3.13.1644\BIN\1CV8.EXE" DESIGNER /F "C:\Avalon" /DumpIB "c:\1\58.dt" /Out "c:\1\1c_log.txt"
Это позволит увидеть специфические ошибки 1С, такие как «База заблокирована» или «Недостаточно прав доступа для выгрузки».
Проанализировав все сложности с runas, многие эксперты приходят к выводу, что использование Планировщика задач Windows (Task Scheduler) является гораздо более стабильным методом. Разберем по шагам, как это реализовать:
Backup_1C.c:\1.cmd.Код в 1С для запуска задачи будет выглядеть следующим образом:
ИмяЗадачи = "Backup_1C";
Команда = "schtasks /run /tn """ + ИмяЗадачи + """";
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Преимущества этого метода: - Нет проблем с передачей паролей через код. - Задача выполняется в своем собственном окружении с гарантированными правами. - Легко отслеживать историю запусков в журнале планировщика.
При вызове системных команд всегда рекомендуется оборачивать их в запуск командного интерпретатора cmd /c. Это позволяет операционной системе правильно обработать переменные окружения и системные пути.
Посмотрим на пример правильной структуры вызова:
ПутьКБатнику = "c:\scripts\dump.bat";
Пользователь = "WORK-PC\Admin";
// Важно экранировать кавычки, если в путях есть пробелы
Команда = "cmd /c ""runas /savecred /user:" + Пользователь + " " + ПутьКБатнику + """";
ЗапуститьПриложение(Команда, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
Сообщить("Команда завершилась с ошибкой. Код: " + КодВозврата);
КонецЕсли;
Важный момент: если вы используете 64-битную версию сервера 1С, а батник обращается к 32-битным исполняемым файлам в Program Files (x86), убедитесь, что пути указаны абсолютно точно, так как механизм перенаправления системных папок (Wow64) может вести себя по-разному при запуске из 1С и из консоли проводника.
Подводя итог, можно сказать: если прямой запуск через runas не удается наладить за несколько итераций, лучшим решением будет переход на использование schtasks. Это сэкономит время на отладку прав доступа и обеспечит стабильную работу автоматической выгрузки.