Сервисы интеграции 1С — это объект метаданных платформы (с версии 8.3.17), через который информационная база обменивается сообщениями с 1С:Шиной. Чтобы подключить базу, нужно создать сервис интеграции (лучше в расширении), загрузить в него каналы по API-ключам информационной системы из шины, написать обработчик получения и код отправки сообщений, активировать сервис в режиме предприятия и включить регламентное задание, которое вызывает СервисыИнтеграции.ВыполнитьОбработку().

Ниже — порядок действий, который я использую, когда подключаю к шине несколько баз: типовые БП, УТ или ERP и самописные конфигурации. Главная идея — держать всю интеграционную логику в одном расширении с правилами, а не размазывать её по модулям каждой конфигурации.

Что такое 1С:Шина и где здесь сервисы интеграции

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

Со стороны 1С участник подключается через сервис интеграции. В нём есть:

ЭлементНазначение
Сервис интеграцииПодключение к внешнему сервису: адрес приложения шины, ключ и секрет
Канал отправкиОчередь исходящих сообщений базы
Канал полученияОчередь входящих сообщений и обработчик, который их разбирает
Обработчик полученияПроцедура в общем модуле, вызывается платформой для каждого входящего сообщения
Регламентное заданиеПериодически запускает обмен с шиной

Сообщение состоит из тела (двоичный поток — JSON, XML, что угодно) и параметров (небольшие пары «ключ — значение», удобные для маршрутизации).

Сервисы интеграции 1С: базы обмениваются сообщениями через центральную шину по каналам
Сервисы интеграции 1С: базы обмениваются сообщениями через центральную шину по каналам

Подготовка на стороне 1С:Шины

Перед работой в конфигураторе в панели управления шины должно быть готово следующее:

  1. Создано приложение, в нём опубликован процесс интеграции — схема движения данных между участниками.
  2. Заведены информационные системы — по одной на каждую базу-участника.
  3. Для каждой информационной системы сгенерированы API-ключи: идентификатор ключа и секрет клиента.
  4. Системы включены в нужные группы участников процесса, процесс запущен.

Частая ошибка — один набор ключей на две базы. Шина различает отправителя именно по ключу, и при общих ключах сообщения начинают ходить «сами к себе».

Создаём сервис интеграции в расширении

Подключать типовую конфигурацию к шине через изменение основной конфигурации я не рекомендую: это снятие с поддержки и лишняя работа при каждом обновлении. Всё нужное помещается в расширение конфигурации.

  1. Создайте расширение с назначением «Адаптация», снимите флаг безопасного режима, если обработчикам нужен полный доступ к данным.
  2. В ветке «Общие → Сервисы интеграции» добавьте сервис, например ОбменСШиной.
  3. Нажмите «Загрузить каналы» и укажите адрес приложения шины, идентификатор ключа как пользователя и секрет как пароль. Платформа покажет каналы, доступные этой информационной системе.
  4. Оставьте только каналы этой базы: обычно один на отправку и один или несколько на получение.
  5. Для каждого канала получения задайте обработчик — процедуру в серверном общем модуле расширения.

Поле адреса внешнего сервиса в свойствах сервиса в конфигураторе лучше оставить пустым: реальные адреса для каждой базы задаются в режиме предприятия. Иначе тестовая копия базы может начать отправлять сообщения в боевую шину.

Обработчик получения сообщения

Обработчик держу тонким: только чтение тела и вызов общей логики загрузки. Если установить Отказ = Истина, сообщение не считается обработанным и придёт повторно.

1С
// Обработчик канала получения сервиса интеграции «ОбменСШиной».
Процедура ПриПолученииСообщенияИзШины(Сообщение, Отказ) Экспорт

	Попытка
		ТекстСообщения = ПрочитатьТелоСообщения(Сообщение);
		ОбменСШинойСервер.ЗагрузитьДанныеСообщения(ТекстСообщения, Сообщение.Параметры);
	Исключение
		Отказ = Истина;
		ЗаписьЖурналаРегистрации("ОбменСШиной.Получение", УровеньЖурналаРегистрации.Ошибка, , ,
			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;

КонецПроцедуры

// Читает тело сообщения сервиса интеграции в строку UTF-8.
Функция ПрочитатьТелоСообщения(Сообщение)

	Поток = Сообщение.ПолучитьТелоКакПоток();
	ЧтениеДанных = Новый ЧтениеДанных(Поток);
	Результат = ЧтениеДанных.Прочитать();
	ЧтениеДанных.Закрыть();

	Возврат ПолучитьСтрокуИзДвоичныхДанных(Результат.ПолучитьДвоичныеДанные(), КодировкаТекста.UTF8);

КонецФункции

Учтите режим транзакции канала получения. Если он включён, ошибка на одном сообщении останавливает очередь, пока сообщение не обработается. Для справочников НСИ это часто правильно (порядок важен), для независимых документов — лучше выключить и разбирать ошибки по одной.

Отправка сообщений в шину

Отправку удобно повесить на подписку на событие ПриЗаписи нужных объектов. Сначала — проверки: не отправляем при загрузке из обмена и при выключенном сервисе, иначе платформа выдаст ошибку «Сервис интеграции не активен» и запись объекта упадёт.

1С
// Подписка на событие ПриЗаписи справочника «Номенклатура».
Процедура ОтправитьНоменклатуруВШинуПриЗаписи(Источник, Отказ) Экспорт

	Если Источник.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	Если Не СервисыИнтеграции.ОбменСШиной.ПолучитьАктивность() Тогда
		Возврат;
	КонецЕсли;

	Данные = Новый Структура;
	Данные.Вставить("guid", Строка(Источник.Ссылка.УникальныйИдентификатор()));
	Данные.Вставить("code", Источник.Код);
	Данные.Вставить("name", Источник.Наименование);
	Данные.Вставить("deleted", Источник.ПометкаУдаления);

	ОбменСШинойСервер.ОтправитьСообщение("Номенклатура", Данные);

КонецПроцедуры

Сама отправка — в общем модуле: сериализуем данные в JSON, создаём сообщение в канале отправки и пишем тело в поток.

1С
// Создаёт сообщение в канале отправки сервиса интеграции.
Процедура ОтправитьСообщение(ТипДанных, Данные) Экспорт

	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Данные);
	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8);

	Канал = СервисыИнтеграции.ОбменСШиной.ОтправкаДанных;
	Сообщение = Канал.СоздатьСообщение();
	Сообщение.Параметры.Вставить("ТипДанных", ТипДанных);

	Поток = Сообщение.ПолучитьТелоКакПоток();
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	ЗаписьДанных.Записать(ДвоичныеДанные);
	ЗаписьДанных.Закрыть();

	Канал.ОтправитьСообщение(Сообщение);

КонецПроцедуры

Имена методов работы с телом и отправки сверяйте с синтакс-помощником вашей версии платформы: API сервисов интеграции дорабатывался от релиза к релизу. В параметр ТипДанных кладу признак, по которому получатель выбирает правило загрузки, — так один канал обслуживает много видов объектов.

Активация в режиме предприятия и регламентное задание

После обновления конфигурации базы данных:

  1. Откройте стандартную обработку настройки сервисов интеграции (в БСП-конфигурациях она доступна из раздела администрирования; в остальных — через «Все функции»).
  2. Укажите адрес приложения шины, идентификатор ключа и секрет для этой базы.
  3. Включите активность сервиса.

То же можно сделать кодом через НастройкиСервисаИнтеграции и УстановитьАктивность(Истина) — удобно при массовом развёртывании.

Обмен с шиной запускается вызовом СервисыИнтеграции.ВыполнитьОбработку(). Он стартует фоновые задания обработки на ограниченное время, поэтому вызывать его нужно регулярно — регламентным заданием раз в пару минут, под пользователем с административными правами.

1С
// Обработчик регламентного задания «Обмен с 1С:Шиной».
Процедура ОбменСШинойРегламент() Экспорт

	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбменСШиной);
	СервисыИнтеграции.ВыполнитьОбработку();

КонецПроцедуры

Строку с ПриНачалеВыполненияРегламентногоЗадания оставьте, только если в конфигурации есть БСП.

Правила выгрузки и загрузки вместо кода в каждой подписке

Когда к шине подключается больше двух баз, код «под каждый объект» быстро превращается в кашу. Я выношу логику в справочник правил внутри расширения:

  • Правило выгрузки: тип объекта, условие (например, «не помечен на удаление»), способ формирования тела и активность.
  • Правило загрузки: значение параметра ТипДанных, способ поиска существующего объекта (по GUID, коду, ИНН) и алгоритм заполнения.

Способов сформировать тело сообщения несколько, и выбирать стоит по задаче:

СпособКогда подходит
Скрипт на встроенном языке, JSONНестандартный формат, максимальная гибкость
EnterpriseData через БСПОбе базы типовые с современной БСП, формат уже согласован
Правила Конвертации данных 2В компании уже есть отлаженные правила КД
Схема компоновки данныхНужна выборка с отборами и вычислениями без кода
Правила загрузки сервиса интеграции 1С: входящее сообщение проходит проверку и попадает в базу
Правила загрузки сервиса интеграции 1С: входящее сообщение проходит проверку и попадает в базу

Типичные ошибки при подключении к 1С:Шине

  • Нет регламентного задания. Сообщения создаются, но лежат в очереди и никуда не уходят.
  • Отправка без проверки активности. Выключили сервис — перестали записываться документы.
  • Бесконечный пинг-понг. База получила элемент, записала его, подписка снова отправила его в шину. Ставьте ОбменДанными.Загрузка = Истина при записи загруженных объектов.
  • Поиск по наименованию. Дубли и перезаписи чужих элементов. Ищите по GUID источника, сохранённому в регистре соответствий.
  • Тяжёлая загрузка в обработчике. Проведение документов прямо в обработчике тормозит очередь. Принимайте данные, а проведение выполняйте отдельным заданием.
  • Отсутствие журнала. Без записей в журнал регистрации и регистра ошибок поддержка интеграции превращается в угадывание.
Шина берёт на себя доставку и маршрутизацию, но не знает, как правильно загрузить документ в вашу базу. Эта часть — правила загрузки — и определяет качество интеграции.

Если нужно спроектировать обмен между несколькими базами через шину или перевести на неё старые обмены, это задача интеграционной шины 1С; для двух-трёх баз иногда проще классический обмен между базами 1С.

Итог

  • Сервисы интеграции — штатный механизм платформы для работы с 1С:Шиной; размещайте их в расширении.
  • У каждой базы свои API-ключи и свои каналы, адреса задаются в режиме предприятия.
  • Обработчик получения держите тонким, ошибки — через Отказ и журнал регистрации.
  • Без регламентного задания с СервисыИнтеграции.ВыполнитьОбработку() обмен не идёт.
  • Правила выгрузки и загрузки в справочниках избавляют от кода под каждый объект.