При автоматизации регулярных процедур (выгрузка данных, обмен с сайтом, проведение тяжелых документов) часто возникает задача запускать внешнюю обработку по расписанию. В клиент-серверном варианте базы данных для этого обычно применяются стандартные регламентные и фоновые задания платформы, которые исполняются кластером серверов без вывода пользовательского интерфейса. Однако в файловых базах платформа требует активного сеанса пользователя для выполнения таких процедур, из-за чего всплывающие окна программы могут мешать пользователям или блокировать интерактивную работу.
Разберем основные практические методы, которые позволяют запустить 1С без вывода графического интерфейса на рабочий стол текущего пользователя либо полностью скрыть процесс выполнения задачи.
Проанализируем самый надежный и простой метод для файловых баз — настройку запуска задачи через встроенный Планировщик задач Windows (Task Scheduler) от имени отдельной учетной записи операционной системы.
Когда служба планировщика запускает приложение от имени служебного пользователя, Windows изолирует графический интерфейс в нулевой сессии (Session 0). В результате запущенный экземпляр 1С физически не может отобразить окно на экране текущего пользователя.
Разберем по шагам последовательность настройки:
Robot1C) с правами на доступ к каталогу информационной базы..bat или .cmd со следующей строкой запуска платформы:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"C:\Bases\MyBase" /N"Robot" /P"Pass123" /Execute"C:\Scripts\Task.epf" /NoSplash /DisableStartupMessages
Обратим внимание на параметры командной строки:
/NoSplash — подавляет отображение стартовой заставки 1С./DisableStartupMessages — отключает появление модальных предупреждений и системных сообщений при старте сеанса./Execute <ПутьКФайлу> — запускает внешнюю обработку сразу после инициализации конфигурации.В коде модуля формы или объекта обработки в самом конце обязательно вызываем метод ЗавершитьРаботуСистемы(Ложь), чтобы запущенный процесс 1С автоматически освобождал лицензию и ресурсы после завершения алгоритма.
Посмотрим на пример скрытия окна через запуск сценария VBScript или объектную модель WScript.Shell. При использовании метода Run передача второго параметра со значением 0 указывает операционной системе запустить процесс в полностью скрытом окне.
Создадим файл скрипта RunHidden.vbs со следующим кодом:
Dim WshShell, Command
Set WshShell = CreateObject("WScript.Shell")
Command = """C:\Program Files\1cv8\common\1cestart.exe"" ENTERPRISE /F""C:\Bases\MyBase"" /N""Robot"" /P""Pass123"" /Execute""C:\Scripts\Task.epf"" /NoSplash /DisableStartupMessages"
WshShell.Run Command, 0, False
Set WshShell = Nothing
Разберем параметры вызова метода Run:
0 — режим скрытого окна (SW_HIDE).False — указывает скрипту не ожидать завершения процесса 1С, возвращая управление сразу.Если требуется выполнить выгрузку, расчет или обработку данных без открытия клиентского приложения, наиболее чистым техническим решением является использование COM-соединения через объект V83.COMConnector.
Объект V83.COMConnector принципиально не создает графических окон платформы и исполняет серверный код 1С внутри отдельного процесса, не создавая нагрузки на пользовательский интерфейс.
Рассмотрим пример VBScript для подключения и вызова экспортной процедуры общего модуля:
Dim Connector, Connection
Set Connector = CreateObject("V83.COMConnector")
Set Connection = Connector.Connect("File=""C:\Bases\MyBase"";Usr=""Robot"";Pwd=""Pass123"";")
' Вызываем экспортную процедуру из общего модуля конфигурации
Connection.РегламентныеПроцедуры.ВыполнитьРегламентныйОбмен()
Set Connection = Nothing
Set Connector = Nothing
Если обработка требует функционала толстого или тонкого клиента, но окно нужно скрыть программно, воспользуемся Automation-клиентом V83.Application со свойством Visible = False.
Посмотрим на пример кода внешнего сценария:
Dim App
Set App = CreateObject("V83.Application")
App.Connect("File=""C:\Bases\MyBase"";Usr=""Robot"";Pwd=""Pass123"";")
App.Visible = False
' Выполняем открытие и обработку файла
App.ExternalDataProcessors.Create("C:\Scripts\Task.epf").ВыполнитьДействие()
App.Exit(False)
Set App = Nothing
Выясним ситуацию, когда запуск служебного сеанса выполняется при старте системы от определенного имени пользователя или при наличии роли. В модуле управляемого приложения (или обычного приложения) в процедуре ПриНачалеРаботыСистемы можно перехватить старт служебного сеанса и запланировать фоновое исполнение:
Процедура ПриНачалеРаботыСистемы()
Если ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(Метаданные.Роли.ВыполнениеЗаданий) Тогда
ПодключитьОбработчикОжидания("ВыполнитьФоновоеДействие", 60, Истина);
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьФоновоеДействие() Экспорт
// Исполнение целевого алгоритма
ОбработкаОбъект = ВнешниеОбработки.Создать("C:\Scripts\Task.epf");
ОбработкаОбъект.Запустить();
// Завершение работы без интерактивных вопросов
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Еще одним эффективным решением для файловых баз является публикация информационной базы на веб-сервере (IIS или Apache). При обращении к опубликованной базе фоновые и регламентные задания могут отрабатывать в контексте пула веб-сервера без необходимости интерактивного входа пользователей, что исключает появление окон на пользовательских рабочих местах.