Как настроить синхронизацию дополнительных реквизитов между 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0?

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

При организации совместной работы конфигураций 1С:Управление торговлей 11 (УТ 11) и 1С:Бухгалтерия предприятия 3.0 (БП 3.0) пользователи часто сталкиваются с необходимостью передачи не только стандартных реквизитов документов, но и пользовательских данных. Механизм "Дополнительные реквизиты и сведения", предоставляемый Библиотекой стандартных подсистем (БСП), позволяет легко добавлять новые поля без изменения конфигурации. Однако при стандартной синхронизации эти данные часто "теряются".

В этой статье мы подробно разберем, почему типовой обмен игнорирует дополнительные реквизиты документов, и рассмотрим два практических способа решения этой задачи в современных реалиях платформы 1С:Предприятие 8.3 (используя формат EnterpriseData).

Почему типовой обмен не переносит дополнительные реквизиты по умолчанию

Давайте проанализируем, как работает выгрузка данных в модуле МенеджерОбменаЧерезУниверсальныйФормат. В типовых правилах разработчики 1С предусмотрели функцию выгрузки свойств:


ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO);

По умолчанию эта функция вызывается только для выгрузки дополнительных сведений. Четвертый параметр этой функции — ЕстьДопРеквизиты — по умолчанию имеет значение Ложь. Из-за этого табличная часть дополнительных реквизитов документа просто игнорируется при формировании XML-пакета.

Это ограничение связано с архитектурной сложностью сопоставления метаданных: дополнительные реквизиты привязаны к плану видов характеристик (ПВХ) ДополнительныеРеквизитыИСведения. Чтобы реквизит корректно перенесся "из коробки", элементы этого ПВХ в обеих базах должны иметь абсолютно идентичные уникальные идентификаторы (UUID). Если реквизиты создавались вручную в УТ и БП независимо друг от друга, их UUID гарантированно будут разными, что приведет к появлению дублей или ошибкам загрузки.

Ниже мы рассмотрим два способа решения этой проблемы.

---

Способ 1. Изменение параметров типового обмена (КД 3.0)

Если ваши базы синхронизируются через стандартный механизм КД 3.0 (EnterpriseData) и вы готовы сопоставить GUID элементов ПВХ, мы можем скорректировать правила выгрузки.

Для этого в обработчике выгрузки соответствующего документа (например, "Приобретение товаров и услуг" в УТ 11) необходимо изменить вызов стандартной функции, принудительно установив признак выгрузки реквизитов в значение Истина:


ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO, Истина);

Важное условие для работы данного метода: перед началом обмена вам необходимо перенести сам элемент ПВХ ДополнительныеРеквизитыИСведения из базы-источника в базу-приемник с сохранением его UUID (например, с помощью обработки "Выгрузка и загрузка данных XML"). Также на стороне БП 3.0 должна быть обязательно включена функциональная опция "Дополнительные реквизиты и сведения".

---

Способ 2. Рекомендуемый и наиболее гибкий метод через свойство AdditionalInfo

Если мы не хотим привязываться к уникальным идентификаторам (UUID) и стремимся избежать дублирования элементов ПВХ при случайных изменениях, оптимальным решением будет передача значений через специальное свойство формата EnterpriseData — AdditionalInfo. Это свойство представляет собой структуру для передачи произвольных данных в шапке любого объекта.

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

Шаг 1. Передача значения дополнительного реквизита из УТ 11

В расширении для УТ 11 перехватим процедуру отправки документа "Приобретение товаров и услуг" (обработчик ПКО_Документ_ПриобретениеТоваровУслуг_Отправка_ПриОтправкеДанных) и добавим код для передачи значения дополнительного реквизита:


// Проверяем наличие свойства AdditionalInfo в выгружаемом пакете XDTO
Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
    ДопДанные = ДанныеXDTO.AdditionalInfo;
Иначе
    ДопДанные = Новый Структура;
КонецЕсли;

// Выполняем запрос для получения значения дополнительного реквизита из документа-источника
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДопРеквизиты.Значение КАК Значение
    |ИЗ
    |	Документ.ПриобретениеТоваровУслуг.ДополнительныеРеквизиты КАК ДопРеквизиты
    |ГДЕ
    |	ДопРеквизиты.Ссылка = &Ссылка
    |	И ДопРеквизиты.Свойство.Имя = &ИмяСвойстваУТ";

Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка);
// Укажите имя вашего дополнительного реквизита в УТ 11 (из ПВХ)
Запрос.УстановитьПараметр("ИмяСвойстваУТ", "ИмяМоегоРеквизита_УТ"); 

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    ЗначениеДляПередачи = Выборка.Значение;
Иначе
    ЗначениеДляПередачи = Неопределено;
КонецЕсли;

// Записываем полученное значение в структуру обмена
ДопДанные.Вставить("ИмяМоегоРеквизита", ЗначениеДляПередачи);
ДанныеXDTO.Вставить("AdditionalInfo", ДопДанные);

Шаг 2. Прием и запись значения в БП 3.0

Теперь перейдем к стороне приемника. В расширении для БП 3.0 перехватим обработчик после загрузки данных (например, ПКО_Документ_ПоступлениеТоваровУслуг_Получение_ПослеЗагрузкиДанных). Нам нужно извлечь данные из AdditionalInfo и программно записать их в документ на стороне бухгалтерии:


Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
    
    Если ДанныеXDTO.AdditionalInfo.Свойство("ИмяМоегоРеквизита") Тогда
        ЗначениеПереданное = ДанныеXDTO.AdditionalInfo.ИмяМоегоРеквизита;
        
        // Ищем соответствующее свойство в БП по его системному имени
        СвойствоБП = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ИмяМоегоРеквизита_БП");
        
        Если ЗначениеЗаполнено(СвойствоБП) Тогда
            // Создаем таблицу значений для передачи в стандартный метод БСП
            ТаблицаСвойств = Новый ТаблицаЗначений;
            ТаблицаСвойств.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
            ТаблицаСвойств.Колонки.Добавить("Значение");
            
            НоваяСтрока = ТаблицаСвойств.Добавить();
            НоваяСтрока.Свойство = СвойствоБП;
            НоваяСтрока.Значение = ЗначениеПереданное;
            
            // Используем стандартный метод Библиотеки Стандартных Подсистем для безопасной записи
            УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ПолученныеДанные, ТаблицаСвойств);
        КонецЕсли;
        
    КонецЕсли;
    
КонецЕсли;

Преимущества использования свойства AdditionalInfo

Применяя данный метод передачи дополнительных реквизитов, мы получаем ряд существенных преимуществ:

  1. Независимость от метаданных: Нам больше не нужно следить за тем, чтобы элементы ПВХ имели одинаковые UUID в разных информационных базах. Сопоставление происходит по строковому имени свойства.
  2. Безопасность при обновлениях: Использование расширений конфигурации позволяет сохранить типовые конфигурации на поддержке. При обновлении релизов УТ 11 или БП 3.0 код синхронизации не сотрется.
  3. Простота отладки: Мы можем легко контролировать состав передаваемого пакета XML, так как структура AdditionalInfo наглядно отображается при просмотре выгруженных файлов обмена.

Таким образом, мы детально разобрали особенности синхронизации дополнительных реквизитов и настроили надежный обмен, исключающий появление дублирующихся данных.

← На главную