При автоматизации рутинных задач в среде 1С:Предприятие часто возникает необходимость запускать внешние обработки по расписанию, в нерабочее время или при возникновении определенных событий в операционной системе. При этом крайне важно, чтобы процесс выполнялся абсолютно незаметно для конечного пользователя — без вывода на экран заставок, диалоговых окон и интерфейса самой программы.
В этой статье мы подробно разберем, как правильно реализовать запуск обработок в фоновом режиме с помощью сценариев VBScript, проанализируем разницу между технологиями OLE Automation и COM-соединением, а также рассмотрим типичные системные ошибки разрядности и методы их устранения.
Первоначальный вариант сценария, предложенный автором темы, базировался на создании объекта V83.Application. Этот подход инициализирует полноценное OLE-приложение. Запуск 1С в таком режиме сопровождается открытием полноценного сеанса (хоть и скрытого в некоторых случаях), расходованием значительного объема оперативной памяти и ресурсов процессора.
Для решения задачи фонового выполнения гораздо эффективнее использовать легковесный COM-соединитель — V83.COMConnector. Основное его преимущество заключается в том, что он физически не имеет графического интерфейса. При его вызове не создается окно программы, не запускаются клиентские модули отображения, а работа происходит напрямую с базой данных на уровне сервера или файлового хранилища.
Рассмотрим по шагам, как переписать скрипт на использование технологии COM-соединения. Нам потребуется создать объект соединения, подключиться к информационной базе и вызвать необходимый метод. Обратите внимание, что методы внешней обработки при работе через COM-соединение должны вызываться из общего модуля или быть доступными на сервере.
Посмотрим на пример реализации VBS-скрипта с использованием V83.COMConnector:
Set Connector = CreateObject("V83.ComConnector")
ConnectionString = "Srvr=""1.1.1.1"";Ref=""Test"";Usr=""Test"";pwd=""Test"";"
' Устанавливаем соединение с информационной базой
Set Connection = Connector.Connect(ConnectionString)
' Загружаем внешнюю обработку из файла
Set ExternalProcessing = Connection.ExternalDataProcessors.Create("D:\tmp\Test.epf", False)
' Вызываем экспортный метод обработки
ExternalProcessing.Test()
' Очищаем объекты для освобождения лицензии и памяти
Set ExternalProcessing = Nothing
Set Connection = Nothing
Set Connector = Nothing
При использовании этого кода выполнение процедуры Test() произойдет полностью в фоновом режиме. Пользователь не увидит никаких окон запуска, а потребление ресурсов системы окажется минимальным.
Часто при попытке выполнить скрипт через командную строку администраторы сталкиваются с системной ошибкой: "Невозможно создание объекта контейнером ActiveX: 'V83.ComConnector'". Выясним причину этой неполадки.
Проанализируем ситуацию: на современных серверах под управлением 64-разрядных версий Windows сосуществуют два интерпретатора командной строки и скриптов:
C:\Windows\System32\cscript.exe.C:\Windows\SysWOW64\cscript.exe.Если на сервере установлена только 64-битная версия платформы 1С:Предприятие, то в реестре операционной системы зарегистрирована только 64-битная библиотека COM-соединения. При попытке запустить сценарий через 32-битный cscript.exe из папки SysWOW64, система физически не сможет сопоставить запрос 32-битного процесса с 64-битной библиотекой 1С. Это и приводит к ошибке инициализации ActiveX.
Чтобы решить эту проблему, выполните одно из следующих действий:
C:\Windows\System32\cscript.exe "C:\tmp\your_script.vbs"
Даже при правильном выборе интерпретатора скрипт может выдавать ошибку отсутствия класса, если сама библиотека COM-соединения не зарегистрирована в реестре операционной системы. Это регулярно происходит после обновления платформы 1С.
Для исправления ситуации выполните ручную регистрацию библиотеки comcntr.dll. Разберем этот процесс по шагам:
Для регистрации 64-битной библиотеки выполните:
regsvr32 "C:\Program Files\1cv8\8.3.XX.YYYY\bin\comcntr.dll"
Для регистрации 32-битной библиотеки введите:
regsvr32 "C:\Program Files (x86)\1cv8\8.3.XX.YYYY\bin\comcntr.dll"
*Примечание: вместо 8.3.XX.YYYY укажите точный номер релиза вашей установленной платформы 1С.
Бывают ситуации, когда вызывающее внешнее приложение жестко ограничено 32-битной архитектурой, а серверная часть 1С работает исключительно в 64-битном режиме. В таком случае прямой вызов V83.ComConnector не удастся осуществить стандартными методами. На помощь приходит создание специального приложения-обертки в Службах компонентов Windows (COM+).
Рассмотрим подробнее алгоритм настройки COM+ приложения:
Win + R, введите команду comexp.msc и нажмите Enter для открытия консоли "Службы компонентов".1C_COM_Connector) и обязательно установите способ активации как "Серверное приложение".comcntr.dll нужной вам разрядности (из каталога установленной платформы 1С).Благодаря этой настройке операционная система Windows возьмет на себя роль моста между разноразрядными процессами, автоматически транслируя вызовы к COM-объекту.
Если алгоритм вашей обработки завязан на интерактивные действия, которые невозможно воспроизвести в рамках COM-соединения (например, используются методы, доступные исключительно в контексте клиентского приложения), вам придется использовать объект V83.Application или V83C.Application (для тонкого клиента).
Чтобы минимизировать видимость процесса 1С при таком подходе, необходимо соблюдать следующие правила:
Visible инициализируется как False. Однако во время выполнения метода Connect на экране пользователя на короткое время может возникнуть заставка начала работы платформы. Повлиять на показ стартовой заставки средствами VBScript невозможно, но можно ускорить процесс подключения за счет указания параметров авторизации в строке подключения.
"C:\Program Files\1cv8\8.3.XX.YYYY\bin\1cv8.exe" /RegServer
Применяя данные подходы, вы сможете гибко настроить стабильное, безопасное и незаметное для пользователей фоновое выполнение внешних обработок в любых ландшафтах операционных систем семейства Windows.