При автоматизации задач в 1С программисты часто используют запуск системы через планировщик задач Windows с помощью BAT-файлов. В таких сценариях ключевым параметром является /Execute, который указывает платформе, какую внешнюю обработку нужно запустить сразу после открытия базы. Однако возникает техническая сложность: стандартный механизм 1С, предоставляющий доступ к параметрам запуска, "видит" только данные после ключа /C, игнорируя содержимое ключа /Execute. В этой статье мы разберем, почему так происходит, и рассмотрим несколько надежных способов "отловить" путь к запускаемой обработке.
Давайте проанализируем, как платформа 1С обрабатывает командную строку. Существует стандартное свойство ПараметрЗапуска, которое доступно как в глобальном контексте, так и в процедуре ПриНачалеРаботыСистемы. Проблема заключается в том, что 1С жестко разделяет системные ключи и пользовательские параметры.
Ключ /Execute является системным. Платформа считывает его, находит файл обработки, загружает его в память и "забывает" о строке пути. В переменную ПараметрЗапуска попадает только то, что передано после ключа /C. Если ваш BAT-файл выглядит так:
"C:\Program Files\1cv8\common\1cv8.exe" ENTERPRISE /F "C:\Bases\Trade" /Execute "C:\Scripts\MyTask.epf" /C "DailyLog"
То внутри 1С значение свойства ПараметрЗапуска будет равно строке "DailyLog", а информация о "C:\Scripts\MyTask.epf" будет полностью утеряна для встроенного языка. Рассмотрим, как это можно обойти.
Разберем самый простой и эффективный метод, который не требует использования сторонних библиотек или сложных системных вызовов. Если мы знаем, что платформа отдает нам только содержимое ключа /C, мы можем просто продублировать там путь к обработке.
Сформируем структуру BAT-файла следующим образом:
SET epf_path="C:\1CBases\scripts\Processing.epf"
SET task_name="ExportData"
"C:\Program Files\1cv8\common\1cv8.exe" ENTERPRISE /F "C:\MyBase" /Execute %epf_path% /C %epf_path%
В этом случае в процедуре ПриНачалеРаботыСистемы (в модуле управляемого приложения) мы сможем легко получить путь:
Процедура ПриНачалеРаботыСистемы()
ПутьКОбработке = ПараметрЗапуска;
Если ЗначениеЗаполнено(ПутьКОбработке) Тогда
// Логика обработки
КонецЕсли;
КонецПроцедуры
Если же вам нужно передавать и путь, и какое-то дополнительное имя задачи, мы рекомендуем использовать разделители. Например, передавайте строку вида "Path=C:\Scripts\My.epf;Task=Export", а затем разбирайте ее функцией СтрРазделить().
Посмотрим на более продвинутый вариант. Если вы не можете изменить структуру BAT-файла или вам нужно получить "сырую" строку запуска по соображениям безопасности и логирования, можно обратиться к инструментарию Windows Management Instrumentation (WMI).
Этот метод позволяет запросить у операционной системы полную командную строку, с которой был запущен текущий процесс 1cv8.exe. Проанализируем пример кода, который реализует этот подход:
Функция ПолучитьПолнуюСтрокуЗапуска() Экспорт
ИмяКомпьютера = ".";
ServiceWMI = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\" + ИмяКомпьютера + "\root\cimv2");
// Получаем ID текущего процесса, чтобы не перепутать с другими запущенными 1С
// В 1С 8.3 для этого можно использовать Win32_Process.ExecutablePath и фильтры
МенеджерПроцессов = ServiceWMI.ExecQuery("SELECT CommandLine FROM Win32_Process WHERE Name = '1cv8.exe'");
Для Каждого Процесс Из МенеджерПроцессов Цикл
СтрокаЗапуска = Процесс.CommandLine;
// Здесь нужно добавить логику поиска ключа /Execute в строке
Если СтрНайти(СтрокаЗапуска, "/Execute") > 0 Тогда
Возврат СтрокаЗапуска;
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции
Важный нюанс: На сервере может быть запущено множество процессов 1cv8.exe. Чтобы найти именно свой процесс, можно использовать сравнение времени запуска процесса или более сложные манипуляции с идентификаторами сессий. Однако для клиентского запуска (через планировщик на рабочей станции) этот метод работает безотказно.
Рассмотрим вариант для тех, кто готов к более низкоуровневой работе. В системной библиотеке kernel32.dll существует функция GetCommandLineW, которая возвращает именно ту строку, которая была передана при создании процесса.
Для реализации этого метода в 1С нам потребуется написать небольшую внешнюю компоненту (на C++ или C#) или использовать средства интеграции, такие как HTMLПриложение (хотя в новых версиях платформы это становится все сложнее из-за ограничений безопасности).
Преимущество этого метода в том, что он работает мгновенно и возвращает данные даже в том случае, если WMI отключен администратором в целях безопасности. Вызов функции через гипотетическую компоненту мог бы выглядеть так:
Компонента = Новый ("AddIn.SystemUtils.WinAPI");
ПолнаяСтрока = Компонента.GetFullCommandLine();
// Далее парсим строку регулярным выражением, чтобы вытащить путь после /Execute
Выясним еще одну стратегию, которая часто применяется в промышленной эксплуатации. Вместо того чтобы пытаться "вытащить" параметры из командной строки, BAT-файл может предварительно записывать настройки во временный файл.
start_params.txt в определенной папке.ПриНачалеРаботыСистемы код 1С проверяет наличие файла, считывает путь и обязательно удаляет файл (чтобы следующий запуск не подхватил старые данные).Этот подход хорош тем, что он не зависит от капризов платформы 1С в плане обработки спецсимволов в путях или ограничений длины командной строки.
Подводя итог, можно сказать, что выбор метода зависит от ваших полномочий в системе. Если у вас есть доступ к изменению BAT-файлов, дублирование параметра в ключе /C — это "золотой стандарт". Оно простое, надежное и не требует прав администратора или вызова внешних объектов.
Проанализируем основные выводы:
ПараметрЗапуска не содержит путь из /Execute.WMI — мощный, но требующий осторожности метод, особенно в многопользовательских средах на сервере.Следуя этим инструкциям, вы сможете гибко управлять запуском регламентных задач и всегда точно знать, какая именно обработка инициировала текущую сессию работы системы.