Почему не переносятся реквизиты присоединенных файлов в КД 2 и как это исправить?

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

При настройке обмена данными в Конвертации данных 2.0 часто возникают сложности с переносом специфических объектов, таких как присоединенные файлы. Особенно остро проблема стоит, когда файлы хранятся в томах на диске, а не в информационной базе. В этой статье мы разберем, почему реквизиты (например, ПутьКФайлу) могут не переноситься или затираться в процессе обмена, и как реализовать надежное решение этой задачи.

Анализ проблемы: почему данные «теряются»?

Основная причина кроется в механизме работы Библиотеки стандартных подсистем (БСП). При обмене данными система стремится обеспечить целостность объектов. Если файл в базе-источнике хранится в томах на диске, стандартные механизмы могут принудительно преобразовывать его в двоичные данные (тип ХранилищеЗначения) для передачи «внутри» XML-файла обмена.

В этот момент происходит следующее:

  1. Система меняет способ хранения файла с «На диске» на «В информационной базе».
  2. Реквизит ПутьКФайлу, который ссылается на физическое расположение в исходной базе, становится неактуальным для базы-приемника.
  3. Стандартные процедуры обработки записи объекта в приемнике очищают этот реквизит, считая его «мусорным» или невалидным при смене способа хранения.

В итоге, даже если вы настроили Правла конвертации свойств (ПКС) для поля ПутьКФайлу, в базе-приемнике вы обнаружите пустое значение.

Решение проблемы: использование Входящих данных

Чтобы гарантированно передать нужные реквизиты, не полагаясь на автоматику БСП, которая может искажать логику хранения, рекомендуем использовать механизм ВходящиеДанные. Рассмотрим по шагам, как это реализовать.

Шаг 1: Подготовка данных в правилах выгрузки

В правилах конвертации объекта (ПКО) справочника, отвечающего за файлы, в обработчике ПередВыгрузкой необходимо получить актуальные данные непосредственно из базы-источника. Мы не должны доверяться тому, что придет из стандартного вызова, так как на этом этапе данные уже могут быть изменены логикой БСП.


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

Шаг 2: Передача данных в ПКС

После того как мы подготовили ИсходящиеДанные, мы должны в Правилах конвертации свойств (ПКС) для реквизита ПутьКФайлу указать, что значение нужно брать не из объекта, а именно из нашего подготовленного контейнера.

В коде ПКС для этого реквизита используем следующий подход:


// В коде ПКС (Перед выгрузкой)
Значение = ВходящиеДанные.ПутьКФайлу;

Шаг 3: Корректная обработка в приемнике

При загрузке в базу-приемник важно предотвратить перезатирание нашего поля стандартными методами. Если значение продолжает «пропадать», используйте обработчик ПослеЗагрузки или ПередЗаписью в правилах для объекта. В этот момент вы можете принудительно установить значение реквизита, которое было передано через ВходящиеДанные.

Важное замечание: Если вы принудительно выставляете путь, убедитесь, что в базе-приемнике настроены соответствующие тома. Если пути к томам отличаются, вам может потребоваться дополнительная логика по сопоставлению Том или ПутьКФайлу, чтобы файл стал доступен для чтения.

Почему не стоит полагаться на «жесткое» прописывание?

Мы настоятельно не рекомендуем «зашивать» строки или жесткие пути в коде правил. Конфигурации постоянно развиваются, и настройки хранения могут измениться (например, администратор перенесет файлы с сервера на облачное хранилище). Использование подхода с ВходящиеДанные делает ваш обмен гибким: система каждый раз запрашивает актуальный путь из базы-источника и передает его в приемник, независимо от того, какие настройки БСП действуют в данный момент.

Резюме

Для успешного переноса реквизитов неограниченной длины или путей к файлам при обмене через КД 2:

  1. Проверяйте значения запросом к базе, а не через форму.
  2. Используйте ИсходящиеДанные для передачи специфических параметров, которые могут затираться типовым обменом.
  3. При необходимости управляйте способом хранения файлов, чтобы избежать нежелательной конвертации в двоичный вид (тип ХранилищеЗначения).

Данный подход является наиболее профессиональным и стабильным для типовых и нетиповых конфигураций на базе 1С.

← На главную