Как предотвратить запуск нескольких копий 1С в BAT-файле при выполнении регламентных заданий

Системный администратор 1С v8.3 (Обычные формы) 1С:Управление торговлей
← На главную

При автоматизации регламентных заданий в 1С:Предприятие 8 через планировщик задач Windows часто возникает проблема «размножения» сеансов. Если предыдущее задание еще не завершило свою работу (например, из-за большого объема данных или зависания), планировщик по расписанию запускает новую копию. В итоге на сервере образуется множество запущенных процессов 1cv8.exe, которые блокируют друг друга и потребляют ресурсы сервера. Рассмотрим подробно, как решить эту проблему с помощью различных механизмов контроля запуска.

Способ 1. Использование встроенных средств планировщика задач Windows

Прежде чем приступать к написанию сложных скриптов, разберем наиболее правильный с точки зрения системного администрирования метод. В планировщике задач Windows есть встроенный механизм контроля очередей. Однако, чтобы он работал корректно с 1С, нужно соблюсти несколько условий. Проанализируем настройки:

  1. Откройте свойства вашей задачи в планировщике и перейдите на вкладку «Параметры».
  2. В нижней части окна найдите пункт «При наличии уже выполняющейся задачи». Выберите вариант «Не запускать новый экземпляр».
  3. Важный нюанс: Планировщик считает задачу «выполняющейся» только до тех пор, пока работает запущенный им процесс. Если ваш BAT-файл просто запускает 1С и тут же закрывается, планировщик решит, что задача завершена, хотя 1С продолжит работать в фоне.
  4. Чтобы этого избежать, в BAT-файле обязательно нужно использовать ключ /wait. В этом случае командный интерпретатор будет ждать закрытия 1С, и планировщик будет видеть реальное состояние процесса.

Способ 2. Контроль через файл-флаг (Lock-файл)

Если настройки планировщика по какой-то причине не помогают (например, при запуске из разных источников), можно реализовать проверку «вручную» внутри самого BAT-файла. Метод заключается в создании временного файла, который служит индикатором того, что процесс уже запущен.

Разберем алгоритм работы скрипта по шагам:

  1. Скрипт проверяет, существует ли файл lock.txt в определенной папке.
  2. Если файл существует, скрипт немедленно завершает свою работу.
  3. Если файла нет, скрипт создает его и запускает 1С.
  4. После закрытия 1С скрипт удаляет файл, освобождая путь для следующего запуска.

Рассмотрим пример кода с учетом особенностей обработки путей с пробелами и кириллицей:


@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С может быть интерпретирован неверно.

Способ 3. Проверка через TaskList (поиск процесса в памяти)

Этот способ более технологичен, так как не оставляет «мусорных» файлов в случае аварийного завершения сервера. Мы просим систему предоставить список запущенных процессов и ищем среди них 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 заставит консоль ждать завершения процесса, если это предусмотрено конфигурацией запуска.

Способ 4. Проблема кодировки в BAT-файлах

Часто администраторы сталкиваются с тем, что скрипт «мелькает и закрывается», не запуская 1С. Разберем ситуацию: это происходит из-за того, что пути к базе или папкам содержат кириллицу (русские буквы). По умолчанию Windows сохраняет текстовые файлы в кодировке ANSI (Windows-1251), в то время как командная строка (CMD) ожидает OEM (CP866).

Чтобы избежать проблем с русскими названиями папок, воспользуемся одним из решений:

  1. Сохраните BAT-файл в кодировке OEM 866 (это можно сделать в продвинутых редакторах типа Notepad++).
  2. Либо добавьте команду переключения кодировки в начало скрипта: chcp 65001 (переход на UTF-8). В этом случае сам файл должен быть сохранен в UTF-8 без BOM.

Способ 5. Атомарная блокировка через создание папки

Существует еще один хитрый и надежный способ — попытка создания папки. Операция 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"

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

Рассмотрим несколько советов, которые помогут сделать работу стабильнее:

  1. Завершение по таймауту: В планировщике задач на вкладке «Параметры» установите галочку «Останавливать задачу, выполняемую дольше» (например, 2 или 4 часа). Это поможет автоматически «убивать» зависшие сеансы 1С, которые мешают следующему запуску.
  2. Логирование: Добавляйте вывод логов в текстовый файл, чтобы понимать, почему скрипт не запустился. Используйте конструкцию >> log.txt 2>&1.
  3. Разделение пользователей: Всегда заводите для регламентных заданий отдельного пользователя в 1С (например, «Robot» или «Reglament») с минимально необходимыми правами. Это позволит легко фильтровать процессы в диспетчере задач.

Выяснив все технические детали, мы видим, что наиболее надежным методом для RDP-сервера является комбинация настроек планировщика (запуск напрямую 1cv8.exe с параметрами) и использование скрипта с проверкой процессов через tasklist с фильтром по пользователю.

← На главную