При организации совместной работы конфигураций 1С:Управление торговлей 11 (УТ 11) и 1С:Бухгалтерия предприятия 3.0 (БП 3.0) пользователи часто сталкиваются с необходимостью передачи не только стандартных реквизитов документов, но и пользовательских данных. Механизм "Дополнительные реквизиты и сведения", предоставляемый Библиотекой стандартных подсистем (БСП), позволяет легко добавлять новые поля без изменения конфигурации. Однако при стандартной синхронизации эти данные часто "теряются".
В этой статье мы подробно разберем, почему типовой обмен игнорирует дополнительные реквизиты документов, и рассмотрим два практических способа решения этой задачи в современных реалиях платформы 1С:Предприятие 8.3 (используя формат EnterpriseData).
Давайте проанализируем, как работает выгрузка данных в модуле МенеджерОбменаЧерезУниверсальныйФормат. В типовых правилах разработчики 1С предусмотрели функцию выгрузки свойств:
ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO);
По умолчанию эта функция вызывается только для выгрузки дополнительных сведений. Четвертый параметр этой функции — ЕстьДопРеквизиты — по умолчанию имеет значение Ложь. Из-за этого табличная часть дополнительных реквизитов документа просто игнорируется при формировании XML-пакета.
Это ограничение связано с архитектурной сложностью сопоставления метаданных: дополнительные реквизиты привязаны к плану видов характеристик (ПВХ) ДополнительныеРеквизитыИСведения. Чтобы реквизит корректно перенесся "из коробки", элементы этого ПВХ в обеих базах должны иметь абсолютно идентичные уникальные идентификаторы (UUID). Если реквизиты создавались вручную в УТ и БП независимо друг от друга, их UUID гарантированно будут разными, что приведет к появлению дублей или ошибкам загрузки.
Ниже мы рассмотрим два способа решения этой проблемы.
---
Если ваши базы синхронизируются через стандартный механизм КД 3.0 (EnterpriseData) и вы готовы сопоставить GUID элементов ПВХ, мы можем скорректировать правила выгрузки.
Для этого в обработчике выгрузки соответствующего документа (например, "Приобретение товаров и услуг" в УТ 11) необходимо изменить вызов стандартной функции, принудительно установив признак выгрузки реквизитов в значение Истина:
ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO, Истина);
Важное условие для работы данного метода: перед началом обмена вам необходимо перенести сам элемент ПВХ ДополнительныеРеквизитыИСведения из базы-источника в базу-приемник с сохранением его UUID (например, с помощью обработки "Выгрузка и загрузка данных XML"). Также на стороне БП 3.0 должна быть обязательно включена функциональная опция "Дополнительные реквизиты и сведения".
---
Если мы не хотим привязываться к уникальным идентификаторам (UUID) и стремимся избежать дублирования элементов ПВХ при случайных изменениях, оптимальным решением будет передача значений через специальное свойство формата EnterpriseData — AdditionalInfo. Это свойство представляет собой структуру для передачи произвольных данных в шапке любого объекта.
Реализуем данный механизм с помощью расширения конфигурации, чтобы не снимать наши базы с поддержки.
В расширении для УТ 11 перехватим процедуру отправки документа "Приобретение товаров и услуг" (обработчик ПКО_Документ_ПриобретениеТоваровУслуг_Отправка_ПриОтправкеДанных) и добавим код для передачи значения дополнительного реквизита:
// Проверяем наличие свойства AdditionalInfo в выгружаемом пакете XDTO
Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
ДопДанные = ДанныеXDTO.AdditionalInfo;
Иначе
ДопДанные = Новый Структура;
КонецЕсли;
// Выполняем запрос для получения значения дополнительного реквизита из документа-источника
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДопРеквизиты.Значение КАК Значение
|ИЗ
| Документ.ПриобретениеТоваровУслуг.ДополнительныеРеквизиты КАК ДопРеквизиты
|ГДЕ
| ДопРеквизиты.Ссылка = &Ссылка
| И ДопРеквизиты.Свойство.Имя = &ИмяСвойстваУТ";
Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка);
// Укажите имя вашего дополнительного реквизита в УТ 11 (из ПВХ)
Запрос.УстановитьПараметр("ИмяСвойстваУТ", "ИмяМоегоРеквизита_УТ");
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ЗначениеДляПередачи = Выборка.Значение;
Иначе
ЗначениеДляПередачи = Неопределено;
КонецЕсли;
// Записываем полученное значение в структуру обмена
ДопДанные.Вставить("ИмяМоегоРеквизита", ЗначениеДляПередачи);
ДанныеXDTO.Вставить("AdditionalInfo", ДопДанные);
Теперь перейдем к стороне приемника. В расширении для БП 3.0 перехватим обработчик после загрузки данных (например, ПКО_Документ_ПоступлениеТоваровУслуг_Получение_ПослеЗагрузкиДанных). Нам нужно извлечь данные из AdditionalInfo и программно записать их в документ на стороне бухгалтерии:
Если ДанныеXDTO.Свойство("AdditionalInfo") И ТипЗнч(ДанныеXDTO.AdditionalInfo) = Тип("Структура") Тогда
Если ДанныеXDTO.AdditionalInfo.Свойство("ИмяМоегоРеквизита") Тогда
ЗначениеПереданное = ДанныеXDTO.AdditionalInfo.ИмяМоегоРеквизита;
// Ищем соответствующее свойство в БП по его системному имени
СвойствоБП = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ИмяМоегоРеквизита_БП");
Если ЗначениеЗаполнено(СвойствоБП) Тогда
// Создаем таблицу значений для передачи в стандартный метод БСП
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаСвойств.Колонки.Добавить("Значение");
НоваяСтрока = ТаблицаСвойств.Добавить();
НоваяСтрока.Свойство = СвойствоБП;
НоваяСтрока.Значение = ЗначениеПереданное;
// Используем стандартный метод Библиотеки Стандартных Подсистем для безопасной записи
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ПолученныеДанные, ТаблицаСвойств);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Применяя данный метод передачи дополнительных реквизитов, мы получаем ряд существенных преимуществ:
AdditionalInfo наглядно отображается при просмотре выгруженных файлов обмена.Таким образом, мы детально разобрали особенности синхронизации дополнительных реквизитов и настроили надежный обмен, исключающий появление дублирующихся данных.