Как передать содержимое файла из КД 2, а не только ссылку?

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как передать содержимое файла из КД 2, а не только ссылку?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38726
      Фото аватараOdineski
      Участник

        в кд два ПКО присоединенные файлы переносит ссылки без файлов

      • #38727
        bot_avaOdin — Одинэсник
        Участник

          В КД 2 это типичная ситуация: ПКО переносит объект «Присоединенный файл» и его реквизиты, но само содержимое файла не переносится. В приемнике создается новая ссылка или элемент справочника, а двоичные данные остаются в источнике.

          Нужно передавать не только ПКО присоединенного файла, но и его содержимое из хранилища файлов.

          ## Что проверить сначала

          ### 1. Включена ли передача файлов в настройках обмена

          В обработке универсального обмена XML проверьте настройки:

          — включена передача присоединенных файлов;
          — файлы не исключены отбором;
          — в правилах есть ПКО для объекта присоединенного файла;
          — в ПВД выгружается не только владелец файла, но и сами присоединенные файлы.

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

          ### 2. Что именно переносит ПКО

          Если ПКО переносит только такие поля:

          то оно переносит только описание файла.

          Сам файл обычно хранится отдельно:

          — в реквизите типа ХранилищеЗначения;
          — в регистре сведений хранения файлов;
          — в файловом хранилище БСП;
          — в томе хранения;
          — в адресе временного хранилища;
          — в справочнике присоединенных файлов, а двоичные данные находятся в другом объекте или регистре.

          Поэтому нужно найти место фактического хранения файла в конкретной конфигурации.

          ## Вариант для КД 2: передача файла через параметр объекта

          Общий принцип такой:

          1. В источнике получить двоичные данные файла.
          2. Передать их в параметр объекта.
          3. В приемнике получить параметр.
          4. Записать двоичные данные в новый присоединенный файл.
          5. Присвоить созданный файл документу или другому владельцу.

          ### На стороне источника

          В ПКО присоединенного файла или в ПКС, отвечающем за файл, передается параметр, например ДвоичныеДанныеФайла.

          В обработчике «Перед выгрузкой»:

          Но имя ХранилищеФайла здесь условное. В вашей конфигурации оно может называться иначе. Часто встречаются варианты:

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

          ## Более надежный вариант через ХранилищеЗначения

          Для КД 2 обычно удобнее передавать не сами двоичные данные напрямую, а ХранилищеЗначения.

          В обработчике на стороне источника:

          Приемник получает значение:

          Однако для больших файлов этот способ может сильно увеличивать XML-файл обмена и потребление памяти. Для файлов размером в несколько мегабайт и больше лучше использовать отдельное файловое или сетевое хранилище.

          ## Пример логики загрузки в приемнике

          После загрузки ПКО присоединенного файла нужно получить двоичные данные и записать их в объект файла:

          Здесь Объект.ХранилищеФайла тоже нужно заменить на фактический реквизит приемника.

          ## Если файл хранится в регистре сведений

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

          Тогда схема будет такой:

          ### На стороне источника

          В обработчике ПКО нужно получить запись хранилища по ссылке файла:

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

          ### На стороне приемника

          После создания элемента присоединенного файла нужно записать полученное хранилище в соответствующий регистр:

          Конкретные измерения регистра нужно смотреть в конфигураторе. Обычно кроме файла могут использоваться:

          — владелец файла;
          — идентификатор файла;
          — версия файла;
          — ключ записи;
          — тип хранения;
          — имя файла.

          ## Важный момент: порядок загрузки

          Если файл присоединен к документу, сначала должен быть создан или найден сам документ, затем присоединенный файл.

          Правильный порядок:

          1. Загрузить владельца, например документ.
          2. Найти или создать присоединенный файл.
          3. Получить двоичные данные из параметров.
          4. Записать содержимое файла.
          5. Установить владельца файла.
          6. Записать файл и запись хранилища.

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

          ## Если файл должен просто физически лежать в каталоге

          Иногда не требуется хранить файл в стандартном механизме присоединенных файлов. Тогда проще передавать:

          — имя файла;
          — расширение;
          — двоичные данные.

          На приемнике сохранить его в каталог:

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

          ## Почему не стоит передавать путь к файлу

          Путь вида:

          переносить бессмысленно, потому что на приемнике такого файла может не быть.

          Путь можно передавать только если:

          — обе базы работают на одном сервере;
          — каталог общий;
          — у пользователя 1С есть права на него;
          — путь одинаковый или заранее настроен;
          — файл не удаляется до загрузки.

          В обычном обмене нужно передавать либо содержимое файла, либо ссылку на общее сетевое/облачное хранилище.

          ## Что исправить в вашем случае

          Скорее всего сейчас ПКО переносит только ссылку на элемент ПрисоединенныеФайлы. Нужно добавить в ПКО отдельный параметр, например:

          В ПКС этого параметра указать передачу данных через параметр объекта.

          На стороне выгрузки:

          На стороне загрузки:

          Функции ПолучитьДанныеПрисоединенногоФайла и ЗаписатьДанныеПрисоединенногоФайла нужно реализовать под конкретную конфигурацию, потому что в БП, УТ, ERP, КА и самописных конфигурациях структура хранения файлов может отличаться.

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С