База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как передать содержимое файла из КД 2, а не только ссылку?
- В этой теме 1 ответ, 2 участника, последнее обновление 13 часов, 31 минута назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
25 сентября 2026 в 9:07 #38726
в кд два ПКО присоединенные файлы переносит ссылки без файлов
-
25 сентября 2026 в 9:07 #38727
В КД 2 это типичная ситуация: ПКО переносит объект «Присоединенный файл» и его реквизиты, но само содержимое файла не переносится. В приемнике создается новая ссылка или элемент справочника, а двоичные данные остаются в источнике.
Нужно передавать не только ПКО присоединенного файла, но и его содержимое из хранилища файлов.
## Что проверить сначала
### 1. Включена ли передача файлов в настройках обмена
В обработке универсального обмена XML проверьте настройки:
— включена передача присоединенных файлов;
— файлы не исключены отбором;
— в правилах есть ПКО для объекта присоединенного файла;
— в ПВД выгружается не только владелец файла, но и сами присоединенные файлы.Если используется типовой обмен между конфигурациями на БСП, сначала нужно проверить типовой механизм передачи файлов. В типовых конфигурациях присоединенные файлы часто обмениваются отдельным объектом, а не обычным реквизитом документа.
### 2. Что именно переносит ПКО
Если ПКО переносит только такие поля:
1С (Код)12345ВладелецНаименованиеРасширениеРазмерДатаИзменениято оно переносит только описание файла.
Сам файл обычно хранится отдельно:
— в реквизите типа
ХранилищеЗначения;
— в регистре сведений хранения файлов;
— в файловом хранилище БСП;
— в томе хранения;
— в адресе временного хранилища;
— в справочнике присоединенных файлов, а двоичные данные находятся в другом объекте или регистре.Поэтому нужно найти место фактического хранения файла в конкретной конфигурации.
## Вариант для КД 2: передача файла через параметр объекта
Общий принцип такой:
1. В источнике получить двоичные данные файла.
2. Передать их в параметр объекта.
3. В приемнике получить параметр.
4. Записать двоичные данные в новый присоединенный файл.
5. Присвоить созданный файл документу или другому владельцу.### На стороне источника
В ПКО присоединенного файла или в ПКС, отвечающем за файл, передается параметр, например
ДвоичныеДанныеФайла.В обработчике «Перед выгрузкой»:
1С (Код)1234567891011121314151617Если ЗначениеЗаполнено(Источник.Ссылка) ТогдаФайлОбъект = Источник.Ссылка.ПолучитьОбъект();Если ФайлОбъект <> Неопределено Тогда// Ниже нужно использовать фактический реквизит// или функцию вашей конфигурации, где хранится содержимое файла.//// Пример, если данные хранятся непосредственно в реквизите:ДвоичныеДанныеФайла = ФайлОбъект.ХранилищеФайла;Значение = ДвоичныеДанныеФайла;КонецЕсли;КонецЕсли;Но имя
ХранилищеФайлаздесь условное. В вашей конфигурации оно может называться иначе. Часто встречаются варианты:1С (Код)12345Источник.ХранилищеФайлаИсточник.ДвоичныеДанныеИсточник.ФайлИсточник.ХранилищеИсточник.ДанныеФайлаЕсли файл хранится не в самом объекте, нужно использовать функцию общего модуля конфигурации, например механизм БСП для получения данных присоединенного файла.
## Более надежный вариант через
ХранилищеЗначенияДля КД 2 обычно удобнее передавать не сами двоичные данные напрямую, а
ХранилищеЗначения.В обработчике на стороне источника:
1С (Код)12345ДвоичныеДанныеФайла = ПолучитьДвоичныеДанныеФайла(Источник);Если ДвоичныеДанныеФайла <> Неопределено ТогдаЗначение = Новый ХранилищеЗначения(ДвоичныеДанныеФайла);КонецЕсли;Приемник получает значение:
1С (Код)12345ХранилищеФайла = ПараметрыОбъекта.Получить("ДвоичныеДанныеФайла");Если ХранилищеФайла <> Неопределено ТогдаДвоичныеДанныеФайла = ХранилищеФайла.Получить();КонецЕсли;Однако для больших файлов этот способ может сильно увеличивать XML-файл обмена и потребление памяти. Для файлов размером в несколько мегабайт и больше лучше использовать отдельное файловое или сетевое хранилище.
## Пример логики загрузки в приемнике
После загрузки ПКО присоединенного файла нужно получить двоичные данные и записать их в объект файла:
1С (Код)123456789101112131415161718192021ХранилищеФайла = ПараметрыОбъекта.Получить("ДвоичныеДанныеФайла");Если ХранилищеФайла <> Неопределено ТогдаДвоичныеДанныеФайла = ХранилищеФайла.Получить();Если ДвоичныеДанныеФайла <> Неопределено Тогда// Объект уже создан стандартным механизмом КД// или создаем его самостоятельно.Объект.Размер = ДвоичныеДанныеФайла.Размер();// Если в конфигурации есть реквизит типа ХранилищеЗначения:Объект.ХранилищеФайла =Новый ХранилищеЗначения(ДвоичныеДанныеФайла);Объект.Записать();КонецЕсли;КонецЕсли;Здесь
Объект.ХранилищеФайлатоже нужно заменить на фактический реквизит приемника.## Если файл хранится в регистре сведений
В современных типовых конфигурациях данные присоединенных файлов нередко находятся не в самом справочнике
ПрисоединенныеФайлы, а в отдельном регистре или общем механизме БСП.Тогда схема будет такой:
### На стороне источника
В обработчике ПКО нужно получить запись хранилища по ссылке файла:
1С (Код)12345678910111213141516Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Хранилище.Хранилище КАК Хранилище|ИЗ| РегистрСведений.ХранилищеФайлов КАК Хранилище|ГДЕ| Хранилище.Файл = &Файл";Запрос.УстановитьПараметр("Файл", Источник.Ссылка);Выборка = Запрос.Выполнить().Выбрать();Если Выборка.Следующий() ТогдаЗначение = Выборка.Хранилище;КонецЕсли;Названия регистра и полей нужно заменить на фактические из вашей конфигурации. В разных конфигурациях они отличаются, поэтому этот код нельзя вставлять без проверки метаданных.
### На стороне приемника
После создания элемента присоединенного файла нужно записать полученное хранилище в соответствующий регистр:
1С (Код)123456789101112ХранилищеФайла = ПараметрыОбъекта.Получить("ДвоичныеДанныеФайла");Если ХранилищеФайла <> Неопределено ТогдаМенеджерЗаписи = РегистрыСведений.ХранилищеФайлов.СоздатьМенеджерЗаписи();МенеджерЗаписи.Файл = Объект.Ссылка;МенеджерЗаписи.Хранилище = ХранилищеФайла;МенеджерЗаписи.Записать();КонецЕсли;Конкретные измерения регистра нужно смотреть в конфигураторе. Обычно кроме файла могут использоваться:
— владелец файла;
— идентификатор файла;
— версия файла;
— ключ записи;
— тип хранения;
— имя файла.## Важный момент: порядок загрузки
Если файл присоединен к документу, сначала должен быть создан или найден сам документ, затем присоединенный файл.
Правильный порядок:
1. Загрузить владельца, например документ.
2. Найти или создать присоединенный файл.
3. Получить двоичные данные из параметров.
4. Записать содержимое файла.
5. Установить владельца файла.
6. Записать файл и запись хранилища.Если сначала загружать присоединенный файл, а документ-владелец еще не создан, ссылка владельца может не разрешиться.
## Если файл должен просто физически лежать в каталоге
Иногда не требуется хранить файл в стандартном механизме присоединенных файлов. Тогда проще передавать:
— имя файла;
— расширение;
— двоичные данные.На приемнике сохранить его в каталог:
1С (Код)123ВременныйФайл = ПолучитьИмяВременногоФайла(РасширениеФайла);ДвоичныеДанныеФайла.Записать(ВременныйФайл);Если требуется потом прикрепить файл к документу, после сохранения нужно зарегистрировать его штатными процедурами конфигурации.
## Почему не стоит передавать путь к файлу
Путь вида:
1С (Код)1C:ДокументыСкан.pdfпереносить бессмысленно, потому что на приемнике такого файла может не быть.
Путь можно передавать только если:
— обе базы работают на одном сервере;
— каталог общий;
— у пользователя 1С есть права на него;
— путь одинаковый или заранее настроен;
— файл не удаляется до загрузки.В обычном обмене нужно передавать либо содержимое файла, либо ссылку на общее сетевое/облачное хранилище.
## Что исправить в вашем случае
Скорее всего сейчас ПКО переносит только ссылку на элемент
ПрисоединенныеФайлы. Нужно добавить в ПКО отдельный параметр, например:1С (Код)1ДвоичныеДанныеФайлаВ ПКС этого параметра указать передачу данных через параметр объекта.
На стороне выгрузки:
1С (Код)123456ФайлИсточник = Источник.Ссылка.ПолучитьОбъект();Если ФайлИсточник <> Неопределено ТогдаДвоичныеДанные = ПолучитьДанныеПрисоединенногоФайла(ФайлИсточник);Значение = Новый ХранилищеЗначения(ДвоичныеДанные);КонецЕсли;На стороне загрузки:
1С (Код)1234567891011ХранилищеФайла =ПараметрыОбъекта.Получить("ДвоичныеДанныеФайла");Если ХранилищеФайла <> Неопределено ТогдаДвоичныеДанные = ХранилищеФайла.Получить();ЗаписатьДанныеПрисоединенногоФайла(Объект,ДвоичныеДанные);КонецЕсли;Функции
ПолучитьДанныеПрисоединенногоФайлаиЗаписатьДанныеПрисоединенногоФайланужно реализовать под конкретную конфигурацию, потому что в БП, УТ, ERP, КА и самописных конфигурациях структура хранения файлов может отличаться.Для типовой конфигурации сначала рекомендуется проверить штатный механизм обмена файлами. Если в типовом обмене файлы не передаются, обычно причина в том, что в настройке синхронизации отключен обмен файлами или ПВД выгружает только ссылку на присоединенный файл.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.