Как перенести присоединенные файлы из регистра двоичных данных в регистр хранили

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как перенести присоединенные файлы из регистра двоичных данных в регистр хранили

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

        КД перенос присоединенных файлов из регистра двочиные данные файлов в регистр хранилище файлов

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

          Для переноса присоединенных файлов между информационными базами через КД нужно переносить не ссылку на ХранилищеЗначения, а сами двоичные данные файла.

          Обычная схема такая:

          Названия ресурсов могут отличаться в конкретной конфигурации. Например, в приемнике ресурс может называться ДвоичныеДанныеФайла, ХранилищеФайла или ДанныеФайла.

          ## Важный момент

          Значение типа ХранилищеЗначения нельзя корректно переносить как обычное значение регистра. В источнике нужно:

          1. получить значение из ХранилищеЗначения;
          2. преобразовать его в ДвоичныеДанные;
          3. передать двоичные данные через КД;
          4. в приемнике снова создать ХранилищеЗначения.

          ## Вариант через обработчик объекта источника

          В правиле конвертации объекта для регистра ДвоичныеДанныеФайлов в обработчике перед выгрузкой можно получить двоичные данные следующим образом:

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

          ## Рекомендуемый вариант через значение ПКС

          Создайте в правилах конвертации реквизита ДвоичныеДанныеФайла обработчик значения.

          В источнике:

          В приемнике для реквизита типа ХранилищеЗначения:

          Если в вашей версии КД в обработчике приемника доступна переменная Источник, а результат записывается в Значение, код будет выглядеть так:

          Здесь Источник должен содержать именно ДвоичныеДанные, а не объект ХранилищеЗначения.

          ## Более надежный вариант через временный файл

          Для больших файлов лучше не передавать ХранилищеЗначения напрямую. Получите двоичные данные, запишите их во временный файл, а затем загрузите в приемнике.

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

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

          ## Настройка правил конвертации

          ### 1. Сначала перенесите владельцев файлов

          В регистре обычно хранится ссылка на присоединенный файл или элемент справочника ПрисоединенныеФайлы.

          Поэтому сначала должны быть перенесены:

          — документы;
          — справочники;
          — элементы справочника присоединенных файлов;
          — владельцы присоединенных файлов.

          И только потом регистр с двоичными данными.

          Иначе запись регистра в приемнике не сможет определить значение измерения Файл.

          ### 2. Создайте правило для регистра-источника

          В КД настройте:

          В качестве объекта-приемника укажите:

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

          ### 3. Сопоставьте измерения

          Например:

          Если в приемнике измерение называется иначе:

          Для ссылок нужно настроить правила конвертации объектов, а не передавать ссылку напрямую. Ссылка из одной базы не является ссылкой на объект в другой базе.

          ### 4. Сопоставьте ресурс с двоичными данными

          В источнике:

          В приемнике:

          Для источника установите обработчик:

          Для приемника:

          ## Если регистр приемника записывается вручную

          Иногда КД не позволяет удобно передать большой ресурс регистра. Тогда в обработчике загрузки можно создать запись регистра вручную.

          Пример:

          Названия Файл, ХранилищеФайла, СсылкаНаФайл нужно заменить на фактические имена измерения и ресурса.

          Если регистр периодический, дополнительно заполните период:

          Если у регистра есть регистратор, нужно заполнить и его:

          ## Если исходный ресурс уже содержит не ХранилищеЗначения

          В некоторых конфигурациях ресурс регистра имеет тип:

          Тогда используется:

          Если ресурс уже имеет тип:

          то .Получить() вызывать не нужно:

          Универсальная проверка:

          ## Проверка типа ресурса

          Для диагностики в обработчик можно временно добавить:

          Ожидаемый результат обычно такой:

          или:

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

          После загрузки проверьте регистр запросом:

          |ВЫБРАТЬ
          | ХранилищеФайлов.Файл,
          | ХранилищеФайлов.ХранилищеФайла
          |ИЗ
          | РегистрСведений.ХранилищеФайлов КАК ХранилищеФайлов

          Для проверки размера файла ресурс нужно получить программно:

          ## Что чаще всего является причиной ошибки

          1. В источник передается ХранилищеЗначения, а не его содержимое.
          2. В приемник записывается ДвоичныеДанные, хотя ресурс имеет тип ХранилищеЗначения.
          3. Не создано соответствие для элемента ПрисоединенныеФайлы.
          4. В регистр приемника не попадает измерение Файл.
          5. Регистр загружается раньше, чем справочник присоединенных файлов.
          6. Используется неправильное имя ресурса.
          7. Файл нулевого размера или значение ресурса равно Неопределено.
          8. У пользователя нет права на чтение исходного регистра.
          9. Механизм КД ограничивает размер передаваемого сообщения.
          10. В обработчике используется Источник.Склад или другое поле объекта, а фактически нужное значение находится в регистре.

          Практически для КД настройка должна выглядеть так:

          Обработчик источника:

          Обработчик приемника:

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