При автоматизации межсистемного взаимодействия в среде 1С:Предприятие разработчики часто сталкиваются с использованием механизмов Automation. В частности, для управления системой извне применяются объекты V83C.Application (тонкий клиент) и COMConnector (внешнее соединение). Однако на практике эти инструменты могут преподносить неприятные сюрпризы: от внезапного появления модальных окон авторизации, блокирующих работу фоновых процессов, до катастрофического падения производительности при выполнении простейших операций.
В рамках данной статьи мы подробно проанализируем, почему возникает интерактивное окно ввода пароля при программном подключении, как заставить систему вместо этого генерировать стандартное исключение, а также разберем причины медленной работы COM-соединений и способы их кардинального ускорения.
Рассмотрим стандартный сценарий, с которым часто сталкиваются разработчики. При попытке программного подключения к базе данных через тонкий клиент V83C.Application с заведомо неверными учетными данными (или при их отсутствии) система вместо того, чтобы вернуть ошибку в код, открывает стандартное диалоговое окно авторизации 1С. В этот момент выполнение внешнего скрипта приостанавливается, ожидая действий пользователя. Если код выполняется на сервере в фоновом режиме, это приводит к бесконечному зависанию процесса.
Посмотрим на пример кода, вызывающий данную проблему:
// Создание объекта тонкого клиента Automation
А = Новый COMОбъект("V83C.Application");
// Попытка подключения с заведомо неверным паролем
Попытка
А.Connect("Srvr=""MyServer"";Ref=""MyBase"";Usr=""WrongUser"";Pwd=""WrongPassword""");
А.Visible = Истина;
Исключение
ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Предупреждение, , , "Ошибка подключения!");
КонецПопытки;
В старых релизах платформы (до версии 8.3.19) этот код не приводил к переходу в ветку Исключение. Вместо этого на экране появлялось интерактивное окно с предложением ввести правильный логин и пароль. Выясним, почему так происходит и как с этим бороться.
Многие разработчики пытаются передать в метод Connect() стандартные ключи командной строки, например /NoDlg или /N//P. Однако важно понимать, что метод Connect() принимает строго структурированную строку соединения формата Srvr=...;Ref=...;Usr=...;Pwd=.... Данный метод физически не умеет парсить параметры запуска исполняемого файла тонкого клиента 1С (такие как /NoDlg). Эти параметры предназначены исключительно для прямого запуска исполняемого файла 1cv8c.exe через командную строку операционной системы.
Решение проблемы на уровне платформы:
Единственным надежным способом подавить вывод интерактивного окна авторизации в режиме Automation является обновление платформы «1С:Предприятие 8». Начиная с релизов линейки 8.3.19 и выше, разработчики платформы изменили поведение компонента V83C.Application. Теперь при программном подключении с некорректными учетными данными система автоматически блокирует вывод любых диалоговых окон авторизации и мгновенно инициирует стандартное исключение. Это исключение можно без проблем перехватить в коде:
Попытка
// На современных релизах платформы этот вызов сразу уйдет в Исключение без вывода окон
Соединение = Новый COMОбъект("V83C.Application");
РезультатПодключения = Соединение.Connect("Srvr=""MyServer"";Ref=""MyBase"";Usr=""BadUser"";Pwd=""BadPass""");
Исключение
Сообщить("Подключение не удалось: " + ОписаниеОшибки());
// Здесь мы можем корректно обработать сбой авторизации
КонецПопытки;
Еще одна частая проблема при интеграции через COM-технологии — это длительное время создания и инициализации объекта V83.COMConnector. В некоторых случаях процесс подключения может занимать до 60 секунд, в то время как запуск тонкого клиента происходит практически мгновенно. Разберем основные причины этого поведения и способы их оптимизации.
При инициализации каждого нового COM-соединения платформа 1С по умолчанию пытается обнаружить физический локальный или сетевой ключ защиты (HASP). Для этого она отправляет широковещательные UDP-запросы по всей локальной сети. Если в вашей инфраструктуре используются исключительно программные лицензии или если сетевой ключ находится в другом сегменте сети, процесс опроса будет зависать, дожидаясь окончания таймаута сети (что визуально выглядит как зависание на 20-60 секунд).
Как исправить: Настройте конфигурационный файл сетевого ключа nethasp.ini, который расположен в каталоге установки платформы (по умолчанию C:\Program Files\1cv8\conf\ или в папке конкретной версии bin\conf\). В секции [NH_COMMON] отключите неиспользуемые протоколы передачи данных, оставив только TCP/IP, а в секции [NH_TCPIP] явно укажите IP-адрес вашего менеджера лицензий HASP и полностью отключите широковещательный поиск:
[NH_COMMON]
NH_TCPIP = Enabled
[NH_TCPIP]
NH_SERVER_ADDR = 192.168.1.100 ; Укажите реальный IP-адрес сервера лицензирования
NH_USE_BROADCAST = Disabled
Если на сервере или компьютере используются только программные лицензии, полностью отключите поиск аппаратных ключей, добавив в файл конфигурации запуска 1CEStart.cfg строку:
UseHwLicenses=0
При создании сеанса (в том числе и через COM) платформа 1С производит инициализацию подсистемы печати и опрашивает принтер, установленный в операционной системе по умолчанию. Если в качестве принтера по умолчанию выбран сетевой принтер, который в данный момент выключен, находится в другой подсети или недоступен из-за проблем с авторизацией, операционная система уходит в режим ожидания ответа. Это блокирует инициализацию COM-объекта на время системного таймаута.
Как исправить: Для учетной записи Windows, под которой запускается процесс 1С (особенно для учетной записи службы USR1CV8 на сервере приложений), установите принтером по умолчанию локальный виртуальный принтер, например Microsoft XPS Document Writer или Microsoft Print to PDF. Это полностью исключит сетевые задержки при инициализации печати.
При первом обращении к базе через COM-соединение происходит полное считывание метаданных конфигурации в оперативную память. Для крупных прикладных решений (таких как 1С:ERP, КА или УТ) этот процесс требует значительных вычислительных ресурсов. Чтобы избежать постоянных накладных расходов, категорически не рекомендуется создавать новое COM-соединение для каждой отдельной операции. Вместо этого следует реализовать механизм кэширования (сохранения) однажды созданного COM-объекта в глобальной переменной или использовать пул соединений для повторного использования.
Проанализируем следующую ситуацию: разработчики замечают, что проведение сложного документа в тонком клиенте занимает всего 3 секунды, тогда как аналогичное проведение того же самого документа через COMConnector длится около 40 секунд. Выясним физические причины такого драматического падения скорости.
Ключевое отличие кроется в архитектуре исполнения кода:
rphost). Клиентская машина выполняет лишь функции отображения интерфейса. Все запросы к СУБД происходят локально внутри серверного кластера с минимальными задержками.
Как оптимизировать скорость выполнения кода через COM:
Для того чтобы убрать сетевые задержки, необходимо перенести инициализацию и работу объекта COMConnector с клиентских машин на сервер приложений 1С. Создавайте COM-объект исключительно в серверном коде общего модуля или в контексте фонового задания. В этом случае внешнее соединение будет выполняться локально на сервере приложений, находясь в непосредственной близости к СУБД, что сократит время выполнения тяжелых операций до уровня тонкого клиента.
Технология COM (Component Object Model) является устаревшей наследуемой технологией Microsoft и жестко привязана к операционной системе Windows. В условиях современного кроссплатформенного ландшафта (когда серверная часть 1С все чаще разворачивается на операционных системах семейства Linux) использование COM-соединений создает серьезные проблемы совместимости. Кроме того, на 64-битных серверах Windows часто возникают ошибки регистрации 32-битных библиотек COM.
Рассмотрим современные архитектурные альтернативы, которые работают быстрее, стабильнее и не требуют привязки к ОС Windows:
Создание собственных HTTP-сервисов внутри конфигурации 1С позволяет настроить легкий, быстрый и безопасный обмен данными. При этом внешняя система общается с 1С посредством отправки стандартных запросов (GET, POST, PUT, DELETE), передавая данные в формате JSON или XML.
Преимущества HTTP-сервисов:
Если вам требуется быстро получить прямой доступ к чтению или записи данных в 1С без написания сложного серверного кода, воспользуйтесь встроенным REST-интерфейсом (OData). Этот интерфейс позволяет публиковать любые объекты конфигурации (справочники, документы, регистры) на веб-сервере буквально в несколько кликов мыши.
Для включения OData достаточно запустить конфигуратор, перейти в свойства корневого узла конфигурации и настроить состав публикуемых объектов через стандартный интерфейс или программно с помощью кода:
// Пример программного включения доступа к справочнику Номенклатура через OData
МассивДоступныхОбъектов = Новый Массив;
МассивДоступныхОбъектов.Добавить(Метаданные.Справочники.Номенклатура);
ИспользоватьАдреснуюКнигу = Истина;
УстановитьСоставИспользованияStandardODataInterface(МассивДоступныхОбъектов);
Использование современных веб-технологий позволяет полностью отказаться от использования нестабильных и медленных COM-соединений, обеспечивая высокую масштабируемость и отказоустойчивость ваших интеграционных решений.