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