Переход с классических правил обмена, созданных в Конвертации данных 2.1, на современное решение 1С:Шина — это не просто смена транспорта, а качественное изменение архитектуры обмена данными. Одной из главных проблем, с которой сталкиваются разработчики при написании правил "с нуля", является обработка объектов ссылочного типа, которые отсутствуют в базе-приемнике. Рассмотрим подробно, как правильно организовать этот процесс, какие инструменты предоставляет платформа и как избежать появления "битых" ссылок.
Прежде всего, проанализируем ситуацию: многие ошибочно полагают, что Шина — это лишь аналог HTTP-сервиса или файлового обмена. На самом деле, 1С:Шина представляет собой полноценную сервисную шину предприятия (ESB), построенную на технологии 1С:Предприятие.Элемент. Она работает на протоколе AMQP (как RabbitMQ) и позволяет не только передавать пакеты данных, но и управлять очередями, трансформировать сообщения и обеспечивать гарантированную доставку.
Выясним причину возникновения проблемы: когда в 1С:Розница приходит объект ФизическиеЛица, в его составе есть реквизит Подразделение. Если это подразделение еще не было создано в приемнике, стандартные механизмы могут оставить поле пустым или создать "объект не найден". Разберем по шагам, как современные стандарты 1С предлагают решать эту задачу.
Если мы переводим обмен на 1С:Шину, наиболее эффективным решением будет отказ от самописных XML-структур в пользу формата EnterpriseData (ED). Рассмотрим, как это работает на уровне платформы:
Подразделение), которого нет в базе, она создает так называемую "битую ссылку" или "заглушку" с тем же UUID, который пришел из источника.Подразделение придет в базу-приемник отдельным пакетом, платформа автоматически "подцепит" его к созданной ранее ссылке, и объект станет полноценным.Этот подход минимизирует количество ошибок при загрузке и позволяет базам работать асинхронно.
Проанализируем стратегию выгрузки данных. В классической архитектуре Нормативно-справочная информация (НСИ) всегда должна иметь более высокий приоритет, чем документы или подчиненные справочники. Разберем последовательность действий:
Организации, Склады, Подразделения.ФизическиеЛица или Номенклатура.В головной системе (в нашем случае 1С:Управление торговлей 11) обычно запрещается создание НСИ на стороне периферийных узлов (Розницы). Это золотое правило интеграции: Master Data Management (MDM) должен быть централизован.
Рассмотрим уникальную возможность 1С:Шины — трансформацию сообщения "на лету". Если база-приемник критически зависит от наличия данных, мы можем настроить скрипт в самой Шине (используя язык, схожий с 1С:Исполнителем).
Проанализируем пример логики скрипта в Шине:
// Пример логики в процессе интеграции (псевдокод)
Метод ПриОбработкеСообщения(Сообщение)
Если Сообщение.Тип = "Справочник.ФизическиеЛица" Тогда
// Проверяем наличие критически важных полей
Если Сообщение.Тело.Подразделение.Пусто() Тогда
// Можно выполнить запрос к источнику или
// присвоить значение по умолчанию "Основное подразделение"
Сообщение.Тело.Подразделение = ПолучитьДефолтноеПодразделение();
КонецЕсли;
КонецЕсли;
КонецМетода
Это позволяет разгрузить конфигурации 1С от лишних проверок, перенося логику трансформации в промежуточный узел.
Посмотрим на более сложный, но надежный сценарий. В 1С:Шине можно реализовать механизм обратной связи. Если при загрузке Физического лица в Розницу обнаруживается отсутствие Подразделения, база-приемник может отправить в Шину асинхронный запрос:
Этот метод исключает появление "битых" ссылок в интерфейсе пользователя, что критично для фронт-офиса розничных точек.
При написании обработчиков в самой 1С (на стороне расширения СервисОбменаДанными или в модулях интеграции), мы рекомендуем использовать типовые методы поиска. Посмотрим на пример кода для обработки входящих данных:
// Обработка загрузки реквизита "Подразделение"
Функция НайтиИлиСоздатьПодразделение(ДанныеОбъекта)
СсылкаНаПодразделение = Справочники.СтруктураПредприятия.НайтиПоРеквизиту("ИдентификаторДляОбмена", ДанныеОбъекта.GUID);
Если СсылкаНаПодразделение.Пустая() Тогда
// Стратегия 1: Создать заглушку
НовыйОбъект = Справочники.СтруктураПредприятия.СоздатьЭлемент();
НовыйОбъект.Наименование = "Временное: " + ДанныеОбъекта.Наименование;
// Устанавливаем UUID, чтобы потом сопоставить
НовыйОбъект.УстановитьСсылкуНового(Справочники.СтруктураПредприятия.ПолучитьСсылку(Новый УникальныйИдентификатор(ДанныеОбъекта.GUID)));
НовыйОбъект.Записать();
Возврат НовыйОбъект.Ссылка;
Иначе
Возврат СсылкаНаПодразделение;
КонецЕсли;
КонецФункции
Важный момент: использование метода УстановитьСсылкуНового позволяет сохранить целостность данных во всей распределенной системе.
Подводя итог нашему анализу, отметим, что при переходе на 1С:Шину следует придерживаться следующих принципов:
EnterpriseData. Платформа сама восстановит связи.1С:Предприятие.Таким образом, переход с КД 2.1 на 1С:Шину — это отличная возможность сделать обмен более отказоустойчивым и быстрым, особенно в связке УТ и Розницы, где скорость транзакций напрямую влияет на лояльность покупателей.