Почему зависает внешняя компонента PinkRabbitMQ в 1С 8.3.22 и как это исправить

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

При обновлении платформы 1С:Предприятие до версий 8.3.22 и выше многие разработчики сталкиваются с нестабильной работой внешних компонент, особенно тех, что отвечают за интеграцию с очередями сообщений. Одной из наиболее распространенных проблем является зависание компоненты PinkRabbitMQ (используемой в БИТ.Адаптере) и возникновение «неубиваемых» фоновых заданий в консоли сервера 1С. Рассмотрим подробно причины этой ситуации и пошагово разберем методы решения задачи. При работе с несколькими базами для упрощения технических работ и предварительного архивирования в процессе перехода на новые версии платформы применяется инструмент для автоматического обновления и тестирования 1С.

Анализ проблемы: почему виснут фоновые задания

Проанализируем ситуацию, описанную в теме. После установки новой версии движка 8.3.22.2239 компонента перестает инициализироваться корректно. Основной симптом — выполнение метода ПодключитьВнешнююКомпоненту проходит успешно или вызывает «мертвое» зависание потока. Если поток зависает внутри неуправляемого кода (внутри DLL компоненты), сервер 1С не может принудительно завершить такое фоновое задание. Это происходит потому, что управление не возвращается в среду исполнения 1С, и штатные механизмы прерывания заданий перестают работать.

Выясним причину, по которой это происходит чаще всего. В компоненте PinkRabbitMQ используется метод ПолучитьСообщение() или аналогичные блокирующие вызовы. Если соединение с брокером RabbitMQ разрывается некорректно или возникают проблемы с правами доступа к временным файлам, компонента уходит в бесконечный цикл ожидания или блокировки. В новых версиях платформы (8.3.22+) усилены механизмы изоляции и безопасности, что может приводить к конфликтам при попытке Native-компоненты обратиться к ресурсам системы.

Диагностика ошибки «Тип не определен»

Рассмотрим специфический случай, когда метод ПодключитьВнешнююКомпоненту возвращает Истина, но при попытке создания объекта возникает ошибка Тип не определен (AddIn.BITERP.PinkRabbitMQ). Разберем пример кода, на котором это происходит:


КомпонентаПодключена = ПодключитьВнешнююКомпоненту("Обработка.адаптер_КомпонентаRabbitMQ.Макет.адаптер_PinkRabitMQ", "BITERP", ТипВнешнейКомпоненты.Native);        
Если Не КомпонентаПодключена Тогда
    ВызватьИсключение НСтр("ru = 'Не удалось подключить внешнюю компоненту адаптер_PinkRabbitMQ'");
КонецЕсли;

// Ошибка возникает на следующей строке
Клиент = Новый("AddIn.BITERP.PinkRabbitMQ");

Эта ситуация говорит о том, что библиотека успешно загружена в адресное пространство процесса rphost, но внутренняя инициализация классов компоненты внутри платформы не завершилась. Это часто связано с отсутствием необходимых системных библиотек Visual C++ Redistributable (версий 2015-2022) на сервере 1С. Проверьте, что на проблемном сервере установлены те же версии библиотек, что и на рабочем.

Решение 1: Очистка временных файлов и профиля пользователя

Когда мы используем загрузку компоненты из макета, платформа 1С распаковывает DLL-файл во временный каталог пользователя, под которым запущена служба ragent (обычно это usr1cv8). Посмотрим на алгоритм действий, который часто помогает решить проблему «застрявших» версий:

  1. Остановите службу сервера 1С:Предприятие.
  2. Перейдите в каталог временных файлов пользователя (например, C:\Users\usr1cv8\AppData\Local\Temp).
  3. Полностью очистите содержимое этой папки.
  4. Удалите содержимое кэша сервера 1С (папки snccntx и другие идентификаторы баз в каталоге сервера).
  5. Запустите службу заново.

Это исключит ситуацию, когда платформа пытается использовать старую, несовместимую версию DLL, которая осталась в кэше после обновления движка.

Решение 2: Проверка прав доступа и параметров безопасности 8.3.22

В платформе 8.3.22 разработчики 1С внесли изменения в работу с внешними компонентами в 64-битных процессах. Проанализируем настройки безопасности:

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

Во-вторых, попробуйте зарегистрировать компоненту в системе вручную или разместить её в папке bin платформы 1С. Хотя для Native-компонентов предпочтительна загрузка через УстановитьВнешнююКомпоненту, явное указание пути иногда помогает избежать проблем с инициализацией типа.

Решение 3: Обновление версии БИТ.Адаптера

Как отмечают участники обсуждения, версия 4.1.1.72278 (1.33) является устаревшей. В более новых релизах (начиная с 1.40 и выше) разработчики обновили саму библиотеку PinkRabbitMQ, исправив критические ошибки, связанные с блокировкой потоков. Если вы столкнулись с зависаниями на платформе 8.3.22, настоятельно рекомендуется обновить расширение до актуального состояния. В новых версиях реализованы более корректные механизмы Heartbeat (контрольных сигналов), которые не позволяют фоновому заданию висеть вечно при потере связи с RabbitMQ.

Решение 4: Проблема сетевых протоколов и IPv6

Выясним еще одну скрытую причину зависаний на этапе ПодключитьВнешнююКомпоненту или первого обращения к ней. На современных серверах Windows часто включен протокол IPv6. Если компонента PinkRabbitMQ пытается разрешить имя сервера RabbitMQ и получает IPv6-адрес, к которому не может подключиться, она может ожидать таймаута сокета очень долго (до нескольких минут). В 1С это выглядит как полное зависание системы.

Попробуйте выполнить следующие действия:

Заключение и рекомендации

Подведем итог. Если у вас виснет PinkRabitMQ на новых версиях платформы 1С, выполните следующие шаги в указанном порядке:

  1. Обновите БИТ.Адаптер до последней доступной версии.
  2. Установите актуальные пакеты Visual C++ Redistributable x64 на сервере приложений.
  3. Очистите временные файлы пользователя usr1cv8.
  4. Проверьте, не блокируются ли фоновые задания на уровне сетевых ожиданий (проблема IPv6 или недоступность порта 5672).

Помните, что зависшие фоновые задания, которые не удаляются через консоль, — это прямой признак того, что ошибка происходит внутри кода DLL. Единственный надежный способ прервать такое состояние без перезагрузки всего сервера — это завершение конкретного процесса rphost.exe через диспетчер задач, однако это приведет к отключению всех пользователей, работающих в данном процессе.

← На главную