При работе с программным продуктом 1С:Шина и механизмом Сервисов интеграции разработчики часто сталкиваются с ситуацией, когда сообщения из информационной базы-источника попадают в базу-приемник «магическим» образом, даже если выполнение соответствующего кода не инициировалось вручную, а регламентные задания в базе заблокированы. В рамках данной статьи мы подробно разберем, как устроена внутренняя механика платформы 1С при взаимодействии с шиной, и выясним, как правильно управлять этим процессом.
Рассмотрим типичный сценарий: вы настроили интеграцию между двумя базами через 1С:Шину. Вы ожидаете, что сообщение, отправленное из источника, будет находиться в очереди (канале) шины до тех пор, пока в базе-приемнике не будет вызван метод СервисыИнтеграции.ВыполнитьОбработку(). Однако на практике сообщение пролетает в приемник мгновенно.
Проанализируем ситуацию: многие разработчики полагают, что сервисы интеграции работают исключительно по принципу стандартных регламентных заданий, которые можно просто выключить в консоли администрирования кластера. Но механизм сервисов интеграции в платформе 1С:Предприятие 8.3 (начиная с версии 8.3.18) гораздо сложнее и глубже интегрирован в ядро системы.
Выясним, что на самом деле происходит, когда мы вызываем метод СервисыИнтеграции.ВыполнитьОбработку(). Вопреки распространенному мнению, этот метод не просто «забирает одну порцию данных». Рассмотрим основные принципы его работы:
Посмотрим на пример кода, который обычно используется для запуска обработки в ручном режиме:
// Выполнение обработки для всех активных сервисов интеграции
СервисыИнтеграции.ВыполнитьОбработку();
Проанализируем причину, по которой установка блокировки регламентных заданий в консоли сервера 1С не всегда останавливает получение сообщений из шины. Дело в том, что механизмы 1С:Шины используют системные фоновые задания. В ряде версий платформы эти задания могут классифицироваться как управляющие или технологические, что позволяет им игнорировать общую блокировку пользовательских регламентных заданий.
Кроме того, если процесс получения сообщений уже был инициирован и находится в цикле ожидания (те самые 120 секунд), блокировка новых заданий не прервет уже выполняющееся соединение до тех пор, пока не истечет его внутренний таймаут.
Если перед вами стоит задача сделать так, чтобы сообщения «копились» в 1С:Шине и не попадали в базу-приемник до определенного момента, нужно использовать программное управление активностью сервиса. Рассмотрим, как это сделать правильно.
Для управления активностью используется метод УстановитьАктивность() конкретного сервиса интеграции. Проанализируем пример кода:
// Отключение активности сервиса интеграции
МойСервис = СервисыИнтеграции.ТестовыйОбменСШиной;
МойСервис.УстановитьАктивность(Ложь);
Важные нюансы управления:
УстановитьАктивность(Ложь), платформа перестанет инициировать фоновые задания для этого сервиса, и сообщения будут оставаться в очередях 1С:Шины.УстановитьАктивность(Истина) снова позволит платформе (или вашему коду) забирать данные.Рассмотрим подробнее два важных свойства, которые часто путают:
Проанализируем, как тип базы влияет на поведение сервисов интеграции:
СервисыИнтеграции.ВыполнитьОбработку() в коде (например, в обработчике ожидания или при открытии системы) становится обязательным условием для получения данных.Подводя итог нашему разбору, можно сделать следующие выводы:
Если вы видите, что сообщения приходят в базу сами собой — это не баг, а штатная «фича» платформы, обеспечивающая Real-time интеграцию. Платформа 1С берет на себя управление фоновыми потоками для поддержания связи с шиной.
Для эффективной работы с 1С:Шиной рекомендуем:
УстановитьАктивность(Ложь) для управления очередями со стороны 1С.Таким образом, понимание внутреннего устройства диспетчера сервисов интеграции позволяет гибко настраивать обмен данными и избегать неожиданного поведения системы при проведении тестов или обновлении баз.