Почему после обновления на 1С 8.3.21 перестало работать COM-соединение в фоновых заданиях

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Переход на новые релизы платформы 1С, особенно в ветке 8.3.21, часто сопровождается неожиданными сбоями в механизмах, которые годами работали стабильно. Одной из наиболее острых проблем является отказ фоновых заданий, использующих V83.COMConnector для интеграции между базами (например, в конфигурации УПП 1.3). При этом часто наблюдается странный симптом: код, запущенный через внешнюю обработку интерактивно, работает идеально, но то же самое действие в фоновом задании выдает ошибку «Объект не обнаружен».

В этой статье мы подробно разберем, почему так происходит, проанализируем типичные ошибки в коде и изучим технические настройки сервера, необходимые для стабильной работы COM в современных реалиях платформы 1С.

Анализ программного кода: конфликт имен переменных

Рассмотрим ситуацию, с которой столкнулся автор темы. Проанализируем фрагмент кода, который использовался для подключения:


Соединение = Новый COMОбъект("V83.COMConnector");
ПараметрыДоступа = "Srvr=""" + ПутьКБазе + """;Ref="""+База+""";Usr="""+ Пользователь + """;Pwd=""" + ПарольПользователя + """;";
Попытка
    База = Соединение.Connect(ПараметрыДоступа);
Исключение
    // Обработка ошибки
КонецПопытки;
Обработка = База.Обработки.УниверсальныйОбменДаннымиXML.Создать;

Выясним причину ошибки, на которую указали участники обсуждения. Обратите внимание на переменную База. В начале формирования строки ПараметрыДоступа переменная База, очевидно, содержит строковое значение (имя базы на сервере). Однако далее результат метода Соединение.Connect() записывается в ту же самую переменную База.

В контексте фонового задания, особенно при выполнении на серверной стороне, такая двойная инициализация или «затирание» типа переменной может приводить к непредсказуемому поведению. Если на этапе Соединение.Connect произошла ошибка, которая была подавлена пустым блоком Исключение, переменная База останется строкой или примет неопределенное значение. В итоге при обращении к База.Обработки система закономерно сообщит, что объект или свойство не обнаружены.

Решение в коде: Всегда используйте разные, осмысленные имена переменных. Например, ИмяБазыНаСервере для строки и comСоединениеОбъект для результата подключения. Это исключит путаницу при отладке и выполнении.

Особенности фоновых заданий в 1С 8.3.21

Проанализируем ситуацию глубже. Почему во внешней обработке (на клиенте) всё работает, а в фоновом задании (на сервере) — нет? Это ключевой вопрос, ответ на который кроется в разнице окружений. Рассмотрим основные причины:

  1. Разрядность процессов. Клиентское приложение часто запускается как 32-битное, в то время как сервер 1С (особенно в новых версиях) практически всегда является 64-битным. Библиотека comcntr.dll должна быть корректно зарегистрирована и доступна именно для 64-битного окружения.
  2. Контекст безопасности. Внешняя обработка выполняется от имени текущего пользователя Windows. Фоновое задание выполняется от имени технической учетной записи службы 1С (обычно USR1CV8). У этой записи может не быть прав на инициализацию COM-объектов или на доступ к веткам реестра.

Настройка компоненты COM+ для стабильной работы

Если после исправления кода проблема сохраняется, значит, причина носит системный характер. Для платформы 8.3.21 и выше рекомендуется использовать механизм приложения COM+. Это позволяет изолировать работу V83.COMConnector в отдельном процессе dllhost.exe, что решает проблемы разрядности и прав доступа.

Разберем по шагам процесс настройки приложения COM+:

  1. Откройте «Панель управления» -> «Администрирование» -> «Службы компонентов».
  2. Разверните узел «Компьютеры» -> «Мой компьютер» -> «Приложения COM+».
  3. Создайте новое приложение (правой кнопкой мыши -> Создать -> Приложение). В мастере выберите «Создать новое приложение», укажите имя (например, 1C_COM_Connector) и выберите тип «Серверное приложение».
  4. На вкладке «Учетная запись» укажите данные пользователя USR1CV8 или другого системного администратора, от имени которого будет работать шлюз.
  5. В созданном приложении откройте папку «Компоненты» и добавьте новую компоненту. Выберите файл comcntr.dll из папки bin именно той версии платформы (в данном случае 8.3.21.1895), которая установлена на сервере.

Права доступа и системный реестр

Часто после обновления платформы права доступа системного пользователя USR1CV8 «слетают» или требуют пересмотра. Проанализируем, какие области требуют проверки:

Реестр Windows: Проверьте ветку HKEY_CLASSES_ROOT\CLSID для GUID, соответствующего V83.COMConnector. Убедитесь, что у пользователя, под которым работает сервер 1С, есть права на чтение этой ветки. Также критично, чтобы путь InprocServer32 вел к актуальному файлу comcntr.dll в папке новой платформы.

Доступ к папке bin: Убедитесь, что пользователь службы 1С имеет полные права (включая «Выполнение») на каталог C:\Program Files\1cv8\8.3.21.1895\bin. При установке нового релиза система создает новую папку, и права на нее могут не унаследоваться автоматически.

Профили безопасности и серверный кэш

В новых версиях платформы 1С (начиная с 8.3.18+) усилен контроль безопасности. Если в кластере 1С настроены Профили безопасности, работа с внешними объектами (к которым относится COM) может быть заблокирована.

Разберем, что нужно проверить в консоли администрирования кластера:

  1. Зайдите в свойства используемого профиля безопасности.
  2. Убедитесь, что флаг «Использование COM-объектов» установлен в положение «Разрешено».
  3. Если профиль используется, добавьте V83.COMConnector в список разрешенных COM-классов.

Также не стоит забывать про очистку серверного кэша. После обновления платформы в каталоге srvinfo могут остаться временные файлы метаданных, которые мешают корректному сопоставлению объектов при COM-соединении. Выполните остановку службы 1С и очистите содержимое папок snccntxt и reg_1541 (кроме файлов конфигурации кластера).

Резюме и рекомендации

Подводя итог, если у вас перестало работать фоновое задание с COM-соединением после обновления на 8.3.21.1895, придерживайтесь следующего алгоритма:

  1. Проверьте код на предмет дублирования имен переменных и корректной обработки исключений. Попробуйте явно указать версию объекта: Новый COMОбъект("V83.COMConnector.1").
  2. Проверьте регистрацию comcntr.dll в реестре и убедитесь, что путь ведет к актуальному релизу.
  3. Настройте приложение COM+, чтобы исключить конфликты разрядности и прав пользователя USR1CV8.
  4. Убедитесь, что профили безопасности кластера не блокируют соединение.

Такой комплексный подход позволит восстановить работоспособность обменов в УПП 1.3 и обеспечить стабильную работу системы на новой платформе.

← На главную