Как перенести присоединенные файлы и реквизиты "ПутьКФайлу" и "Том" через КД 2.1?

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

Часто при настройке обмена через Конвертацию Данных 2.1 (например, между конфигурациями 1С:Документооборот и 1С:Бухгалтерия предприятия) разработчики сталкиваются с неожиданным поведением системы. Передаются все свойства справочника присоединенных файлов, однако реквизиты ПутьКФайлу и Том при загрузке в базу-приемник оказываются пустыми. Никакие обработчики перед записью в правилах конвертации не помогают. Разберем по шагам, почему это происходит и как правильно организовать перенос файлов.

Выясним причину очистки реквизитов файла

Если мы проанализируем поведение современных конфигураций 1С, построенных на базе Библиотеки стандартных подсистем (БСП), то увидим, что физическим размещением файлов управляет именно БСП. При записи элемента справочника присоединенных файлов система намеренно игнорирует переданные «снаружи» пути.

Специализированные типовые процедуры, такие как РаботаСФайламиСлужебный.ПоместитьФайлВРеквизитСправочника, срабатывают при сохранении объекта и проверяют текущие настройки базы-приемника. Система обеспечивает целостность файлового хранилища и не доверяет внешним строковым путям. Если в базе-приемнике включено хранение в томах на диске, БСП ожидает получить двоичные данные, чтобы самостоятельно разместить их в актуальном томе и сгенерировать новый, валидный для данной информационной базы ПутьКФайлу. Для быстрого поиска и изучения процедур подсистемы пригодится справочник по методам БСП с примерами кода.

Проанализируем проблему синхронизации томов

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

  1. Тома хранения файлов — это сущности, строго привязанные к физическим маршрутам конкретного сервера.
  2. В одной базе файлы могут лежать в томах, а в другой — непосредственно в информационной базе. Передача путей в этом случае бессмысленна.
  3. Поиск справочника ТомаХраненияФайлов по УИД или наименованию при загрузке может создать в приемнике ссылку на несуществующий сетевой путь. В итоге загруженный файл станет недоступным для открытия.

Рассмотрим правильный паттерн переноса присоединенных файлов

Чтобы успешно синхронизировать файлы, нам необходимо отказаться от прямой передачи путей и томов, и повторить логику обмена, которая заложена в современных правилах Enterprise Data (КД 3). Посмотрим, как это реализовать на практике.

Шаг 1. На стороне источника (ПриВыгрузке)

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

Пример кода, который можно адаптировать в обработчиках выгрузки (по аналогии с КД 3):


// Получаем двоичные данные файла типовыми средствами БСП
ХранимыйФайл = РаботаСФайлами.ДвоичныеДанныеФайла(ДанныеИБ.Ссылка, Ложь);
// Сохраняем в параметры передачи
ДанныеXDTO.Вставить("ХранимыйФайл", ХранимыйФайл);

Шаг 2. На стороне приемника (ПриЗагрузке / ПослеЗагрузки)

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

Пример обработки полученных данных в базе-приемнике:


ДвоичныеДанныеФайла = ДанныеXDTO.ХранимыйФайл;
// Помещаем данные во временное хранилище или хранилище значения
ПолученныеДанные.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанныеФайла);

// Вызываем типовой метод БСП для размещения файла
РаботаСФайламиСлужебный.ПриПолученииДанныхОтГлавного(
    ?(ДанныеИБ = Неопределено, ПолученныеДанные, ДанныеИБ), 
    ПолучениеЭлементаДанных.Авто, 
    Ложь, 
    Неопределено
);

Используя этот подход, мы делегируем физическое создание файлов типовым проверенным алгоритмам 1С.

Оценим производительность обмена

Рассмотрим важный нюанс: перенос самих файлов (их двоичных данных) через XML существенно увеличивает размер файла обмена. База данных преобразует байты в текстовую строку Base64, что утяжеляет сообщение примерно на треть. Для уменьшения объёма передаваемых графических файлов можно использовать инструмент для сжатия изображений в базе на БСП.

Если файлов очень много и они имеют большой объем, выгрузка и загрузка могут сильно замедлиться. В таких проектах разработчики иногда прибегают к гибридным, нетиповым схемам:

  1. Физические файлы копируются с сервера на сервер средствами операционной системы (например, через скрипты синхронизации папок или FTP).
  2. В правилах КД 2.1 передаются лишь относительные пути, при этом программно (через подписки или расширения) обходится защита БСП при записи элемента справочника.

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

← На главную