При автоматизации регламентных заданий в 1С:Предприятие 8 через планировщик задач Windows часто возникает проблема «размножения» сеансов. Если предыдущее задание еще не завершило свою работу (например, из-за большого объема данных или зависания), планировщик по расписанию запускает новую копию. В итоге на сервере образуется множество запущенных процессов 1cv8.exe, которые блокируют друг друга и потребляют ресурсы сервера. Рассмотрим подробно, как решить эту проблему с помощью различных механизмов контроля запуска.
Прежде чем приступать к написанию сложных скриптов, разберем наиболее правильный с точки зрения системного администрирования метод. В планировщике задач Windows есть встроенный механизм контроля очередей. Однако, чтобы он работал корректно с 1С, нужно соблюсти несколько условий. Проанализируем настройки:
/wait. В этом случае командный интерпретатор будет ждать закрытия 1С, и планировщик будет видеть реальное состояние процесса.Если настройки планировщика по какой-то причине не помогают (например, при запуске из разных источников), можно реализовать проверку «вручную» внутри самого BAT-файла. Метод заключается в создании временного файла, который служит индикатором того, что процесс уже запущен.
Разберем алгоритм работы скрипта по шагам:
lock.txt в определенной папке.Рассмотрим пример кода с учетом особенностей обработки путей с пробелами и кириллицей:
@echo off
set "flagFile=C:\1C_Scripts\reglament.lock"
rem Проверяем наличие флага
if exist "%flagFile%" (
echo Process already running. Exiting...
exit /b
)
rem Создаем флаг
echo %date% %time% > "%flagFile%"
rem Запускаем 1С и ждем завершения
start /wait "" "C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Trade" /N "Robot" /P "Password" /Execute "C:\Scripts\Task.epf"
rem Удаляем флаг после завершения работы 1С
if exist "%flagFile%" del /q "%flagFile%"
Обратите внимание: пустые кавычки "" после команды start /wait необходимы, так как команда start воспринимает первые кавычки как заголовок окна. Если их не поставить, путь к 1С может быть интерпретирован неверно.
Этот способ более технологичен, так как не оставляет «мусорных» файлов в случае аварийного завершения сервера. Мы просим систему предоставить список запущенных процессов и ищем среди них 1cv8.exe. Выясним причину, по которой обычный поиск процесса может не подойти для RDP-сервера: если на сервере работают другие пользователи, у них тоже может быть открыта 1С, и скрипт увидит их процессы.
Чтобы скрипт проверял процессы только того пользователя, под которым он запущен, используем фильтр USERNAME. Проанализируем код:
@echo off
set "procName=1cv8.exe"
rem Ищем процесс именно нашего пользователя
tasklist /FI "IMAGENAME eq %procName%" /FI "USERNAME eq %USERNAME%" | find /I "%procName%" > nul
if %ERRORLEVEL% equ 0 (
echo 1C is already running for user %USERNAME%.
exit /b
)
echo Starting 1C...
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Trade" /N "Robot" /P "Password"
В данном примере мы не используем start /wait, так как сам факт запуска 1С без start заставит консоль ждать завершения процесса, если это предусмотрено конфигурацией запуска.
Часто администраторы сталкиваются с тем, что скрипт «мелькает и закрывается», не запуская 1С. Разберем ситуацию: это происходит из-за того, что пути к базе или папкам содержат кириллицу (русские буквы). По умолчанию Windows сохраняет текстовые файлы в кодировке ANSI (Windows-1251), в то время как командная строка (CMD) ожидает OEM (CP866).
Чтобы избежать проблем с русскими названиями папок, воспользуемся одним из решений:
chcp 65001 (переход на UTF-8). В этом случае сам файл должен быть сохранен в UTF-8 без BOM.Существует еще один хитрый и надежный способ — попытка создания папки. Операция mkdir в Windows является атомарной. Если два экземпляра скрипта запустятся одновременно, только один сможет успешно создать папку, второй получит ошибку.
@echo off
mkdir "C:\1C_Scripts\lock_dir" 2>nul
if errorlevel 1 (
echo Failed to lock. Another instance is running.
exit /b
)
rem Если папка создана, выполняем запуск
start /wait "" "C:\Program Files\1cv8\common\1cestart.exe" /F "D:\Base" ...
rem Убираем за собой
rmdir "C:\1C_Scripts\lock_dir"
Рассмотрим несколько советов, которые помогут сделать работу стабильнее:
>> log.txt 2>&1.Выяснив все технические детали, мы видим, что наиболее надежным методом для RDP-сервера является комбинация настроек планировщика (запуск напрямую 1cv8.exe с параметрами) и использование скрипта с проверкой процессов через tasklist с фильтром по пользователю.