При переходе на механизмы синхронизации данных через универсальный формат (EnterpriseData) и конфигурацию «Конвертация данных 3.1» разработчики часто сталкиваются с вопросом: как корректно передавать записи регистров сведений? Если для справочников и документов подходы понятны и стандартизированы, то перенос данных регистров (например, Штрихкоды номенклатуры, цен или контактной информации) имеет ряд ключевых архитектурных нюансов.
Разберем детально, как устроен перенос регистров в EnterpriseData, и рассмотрим два основных способа решения этой задачи: использование встроенного свойства AdditionalInfo и реализацию регистра как отдельного объекта обмена.
Проанализируем структуру универсального формата обмена. В схеме XDTO формата EnterpriseData понятие «РегистрСведений» отсутствует как класс. Формат ориентирован на объектную модель, где любой переносимый набор сущностей описывается по объектному принципу с префиксом Справочник..
В типовых решениях аналогичные регистры (например, штрихкоды) либо выгружаются в составе описания номенклатуры, либо описываются как отдельная сущность, состоящая из трех уровней:
Справочник.ШтрихкодыНоменклатуры), содержащий фильтры или ключевые измерения.Перед началом доработки обязательно проверим текущую версию схемы EnterpriseData, используемую в базах. В версиях 1.5 и новее данные штрихкодов часто уже предусмотрены схемой формата (в составе свойств или табличной части номенклатуры). Если же типового типа нет или регистр нетиповой, перейдем к выбору одного из двух подходов реализации.
Рассмотрим вариант, когда нам требуется передавать записи регистра сведений только вместе с основным объектом (например, штрихкоды передаются вместе с номенклатурой), без изменения и расширения схемы пакета XDTO. Для таких целей подходит поле AdditionalInfo, присутствующее практически во всех типах формата.
1. Настройка выгрузки источника:
В общем модуле МенеджерОбменаЧерезУниверсальныйФормат найдем обработчик ПКО для объекта «Номенклатура» (или обработчик ПриОтправкеДанных / ПередКонвертацией). Прочитаем записи регистра и сериализуем их в строку:
// Считываем записи регистра по выгружаемой номенклатуре
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
|ГДЕ
| Штрихкоды.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Источник);
Выборка = Запрос.Выполнить().Выгрузить();
// Сериализуем данные в JSON для записи в AdditionalInfo
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Выборка);
ДанныеСтрокой = ЗаписьJSON.Закрыть();
ОбъектФормата.Вставить("AdditionalInfo", ДанныеСтрокой);
2. Настройка загрузки в приемнике:
В обработчике загрузки номенклатуры (например, ПередЗаписьюПолученныхДанных или ПослеЗагрузкиВсехДанных) извлечем переданную строку, восстановим таблицу и запишем набор записей:
Если СвойстваПолученныхДанных.Свойство("AdditionalInfo") И ЗначениеЗаполнено(СвойстваПолученныхДанных.AdditionalInfo) Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СвойстваПолученныхДанных.AdditionalInfo);
МассивШтрихкодов = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Объект.Ссылка);
Для Каждого Стр Из МассивШтрихкодов Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Номенклатура = Объект.Ссылка;
НоваяЗапись.Штрихкод = Стр.Штрихкод;
КонецЦикла;
НаборЗаписей.Записать(Истина);
КонецЕсли;
Подводные камни этого подхода:
AdditionalInfo не типизировано схемой XDTO, поэтому валидатор формата не сможет отследить корректность структуры данных.ПриЗаписи регистра сведений, которая будет принудительно регистрировать на узле плана обмена связанную номенклатуру через ПланыОбмена.ЗарегистрироватьИзменения().Разберем архитектурно правильный способ, когда регистр передается независимо от справочника при любых изменениях.
Шаг 1. Расширение схемы XDTO:
Прямое редактирование типового пакета EnterpriseData_... снимает конфигурацию с полной поддержки и усложняет обновления. Рекомендуется создать собственное расширение XDTO-пакета в конфигурации и зарегистрировать его в БСП через процедуру ПриПолученииДоступныхРасширенийФормата в модуле ОбменДаннымиПереопределяемый. В пакете создается тип с префиксом Справочник.ШтрихкодыНоменклатуры, где описываются состав ключей и табличная часть набора.
Шаг 2. Настройка состава плана обмена и ПРО:
Включаем регистр сведений в состав используемого плана обмена. Для непериодического регистра без регистратора фиксация изменений платформой происходит по комбинации значений измерений. В правилах регистрации объектов (ПРО) или подписке на события настраиваем условия, при которых записи регистрируются к выгрузке.
Шаг 3. Настройка ПОД и ПКО в КД 3.1:
Поскольку регистр сведений не является ссылочным типом, стандартная выборка платформы для него не подходит. В правилах обработки данных (ПОД) выбираем способ выборки «Произвольный алгоритм»:
// В выборке ПОД для регистра сведений
Выборка = Новый ТаблицаЗначений;
Выборка.Колонки.Добавить("Номенклатура");
// Считываем изменения на узле плана обмена
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
// Заполняем наборы для передачи в ПКО
КонецЦикла;
Далее в модуле МенеджерОбменаЧерезУниверсальныйФормат описываются процедуры ПКО: для формирования данных формата на стороне источника и для записи набора записей регистра на стороне приемника через метод СоздатьНаборЗаписей() с установленным отбором.