База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как перенести присоединенные файлы из регистра двоичных данных в регистр хранили
- В этой теме 1 ответ, 2 участника, последнее обновление 9 часов, 54 минуты назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
23 сентября 2026 в 12:34 #38708
КД перенос присоединенных файлов из регистра двочиные данные файлов в регистр хранилище файлов
-
23 сентября 2026 в 12:34 #38709
Для переноса присоединенных файлов между информационными базами через КД нужно переносить не ссылку на
ХранилищеЗначения, а сами двоичные данные файла.Обычная схема такая:
1С (Код)123456789Источник:РегистрСведений.ДвоичныеДанныеФайловФайлДвоичныеДанныеФайлаПриемник:РегистрСведений.ХранилищеФайловФайлХранилищеФайлаНазвания ресурсов могут отличаться в конкретной конфигурации. Например, в приемнике ресурс может называться
ДвоичныеДанныеФайла,ХранилищеФайлаилиДанныеФайла.## Важный момент
Значение типа
ХранилищеЗначениянельзя корректно переносить как обычное значение регистра. В источнике нужно:1. получить значение из
ХранилищеЗначения;
2. преобразовать его вДвоичныеДанные;
3. передать двоичные данные через КД;
4. в приемнике снова создатьХранилищеЗначения.## Вариант через обработчик объекта источника
В правиле конвертации объекта для регистра
ДвоичныеДанныеФайловв обработчике перед выгрузкой можно получить двоичные данные следующим образом:1С (Код)12345678910Если Источник.ДвоичныеДанныеФайла <> Неопределено ТогдаДвоичныеДанныеФайла =Источник.ДвоичныеДанныеФайла.Получить();Если ДвоичныеДанныеФайла <> Неопределено ТогдаИсточник.ДвоичныеДанныеФайла = ДвоичныеДанныеФайла;КонецЕсли;КонецЕсли;Но этот вариант сработает только в том случае, если механизм КД допускает изменение значения источника перед формированием сообщения. В некоторых версиях КД изменять объект
Источникв этом обработчике нельзя или нежелательно. Тогда лучше использовать отдельный реквизит передачи.## Рекомендуемый вариант через значение ПКС
Создайте в правилах конвертации реквизита
ДвоичныеДанныеФайлаобработчик значения.В источнике:
1С (Код)1234567Значение = Неопределено;Если Источник.ДвоичныеДанныеФайла <> Неопределено ТогдаЗначение = Источник.ДвоичныеДанныеФайла.Получить();КонецЕсли;В приемнике для реквизита типа
ХранилищеЗначения:1С (Код)123Если Значение <> Неопределено ТогдаЗначение = Новый ХранилищеЗначения(Значение);КонецЕсли;Если в вашей версии КД в обработчике приемника доступна переменная
Источник, а результат записывается вЗначение, код будет выглядеть так:1С (Код)12345Если Источник <> Неопределено ТогдаЗначение = Новый ХранилищеЗначения(Источник);ИначеЗначение = Неопределено;КонецЕсли;Здесь
Источникдолжен содержать именноДвоичныеДанные, а не объектХранилищеЗначения.## Более надежный вариант через временный файл
Для больших файлов лучше не передавать
ХранилищеЗначениянапрямую. Получите двоичные данные, запишите их во временный файл, а затем загрузите в приемнике.### На стороне источника
1С (Код)1234567891011121314151617181920212223242526272829ДвоичныеДанныеФайла = Неопределено;Если Источник.ДвоичныеДанныеФайла <> Неопределено ТогдаДвоичныеДанныеФайла =Источник.ДвоичныеДанныеФайла.Получить();КонецЕсли;Если ДвоичныеДанныеФайла <> Неопределено ТогдаИмяВременногоФайла = ПолучитьИмяВременногоФайла();ПопыткаДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);Значение = Новый ДвоичныеДанные(ИмяВременногоФайла);НаконецЕсли ЗначениеЗаполнено(ИмяВременногоФайла) ТогдаУдалитьФайлы(ИмяВременногоФайла);КонецЕсли;КонецПопытки;ИначеЗначение = Неопределено;КонецЕсли;Однако для обычной передачи через КД запись во временный файл чаще всего не требуется. Двоичные данные можно передавать напрямую.
## Настройка правил конвертации
### 1. Сначала перенесите владельцев файлов
В регистре обычно хранится ссылка на присоединенный файл или элемент справочника
ПрисоединенныеФайлы.Поэтому сначала должны быть перенесены:
— документы;
— справочники;
— элементы справочника присоединенных файлов;
— владельцы присоединенных файлов.И только потом регистр с двоичными данными.
Иначе запись регистра в приемнике не сможет определить значение измерения
Файл.### 2. Создайте правило для регистра-источника
В КД настройте:
1С (Код)1Регистр сведений ДвоичныеДанныеФайловВ качестве объекта-приемника укажите:
1С (Код)1Регистр сведений ХранилищеФайловЕсли регистр приемника имеет другое имя, выбирайте фактический регистр из конфигурации.
### 3. Сопоставьте измерения
Например:
1С (Код)1Источник.Файл -> Приемник.ФайлЕсли в приемнике измерение называется иначе:
1С (Код)1Источник.Файл -> Приемник.ПрисоединенныйФайлДля ссылок нужно настроить правила конвертации объектов, а не передавать ссылку напрямую. Ссылка из одной базы не является ссылкой на объект в другой базе.
### 4. Сопоставьте ресурс с двоичными данными
В источнике:
1С (Код)1ДвоичныеДанныеФайлаВ приемнике:
1С (Код)1ХранилищеФайлаДля источника установите обработчик:
1С (Код)12345Значение = Неопределено;Если Источник.ДвоичныеДанныеФайла <> Неопределено ТогдаЗначение = Источник.ДвоичныеДанныеФайла.Получить();КонецЕсли;Для приемника:
1С (Код)12345Если Значение <> Неопределено ТогдаЗначение = Новый ХранилищеЗначения(Значение);ИначеЗначение = Неопределено;КонецЕсли;## Если регистр приемника записывается вручную
Иногда КД не позволяет удобно передать большой ресурс регистра. Тогда в обработчике загрузки можно создать запись регистра вручную.
Пример:
1С (Код)123456789101112Если ДвоичныеДанныеФайла = Неопределено ТогдаВозврат;КонецЕсли;МенеджерЗаписи =РегистрыСведений.ХранилищеФайлов.СоздатьМенеджерЗаписи();МенеджерЗаписи.Файл = СсылкаНаФайл;МенеджерЗаписи.ХранилищеФайла =Новый ХранилищеЗначения(ДвоичныеДанныеФайла);МенеджерЗаписи.Записать();Названия
Файл,ХранилищеФайла,СсылкаНаФайлнужно заменить на фактические имена измерения и ресурса.Если регистр периодический, дополнительно заполните период:
1С (Код)1МенеджерЗаписи.Период = ТекущаяДата();Если у регистра есть регистратор, нужно заполнить и его:
1С (Код)1МенеджерЗаписи.Регистратор = ДокументИсточник;## Если исходный ресурс уже содержит не
ХранилищеЗначенияВ некоторых конфигурациях ресурс регистра имеет тип:
1С (Код)1ХранилищеЗначенияТогда используется:
1С (Код)12ДвоичныеДанныеФайла =Источник.ДвоичныеДанныеФайла.Получить();Если ресурс уже имеет тип:
1С (Код)1ДвоичныеДанныето
.Получить()вызывать не нужно:1С (Код)12ДвоичныеДанныеФайла =Источник.ДвоичныеДанныеФайла;Универсальная проверка:
1С (Код)123456789101112131415161718ДвоичныеДанныеФайла = Неопределено;Если Источник.ДвоичныеДанныеФайла <> Неопределено ТогдаЕсли ТипЗнч(Источник.ДвоичныеДанныеФайла) =Тип("ХранилищеЗначения") ТогдаДвоичныеДанныеФайла =Источник.ДвоичныеДанныеФайла.Получить();ИначеДвоичныеДанныеФайла =Источник.ДвоичныеДанныеФайла;КонецЕсли;КонецЕсли;## Проверка типа ресурса
Для диагностики в обработчик можно временно добавить:
1С (Код)1234567891011Если Источник.ДвоичныеДанныеФайла = Неопределено ТогдаСообщить("Двоичные данные отсутствуют");ИначеСообщить("Тип ресурса: "+ Строка(ТипЗнч(Источник.ДвоичныеДанныеФайла)));КонецЕсли;Ожидаемый результат обычно такой:
1С (Код)1Тип ресурса: ХранилищеЗначенияили:
1С (Код)1Тип ресурса: ДвоичныеДанные## Проверка результата в приемнике
После загрузки проверьте регистр запросом:
|ВЫБРАТЬ
| ХранилищеФайлов.Файл,
| ХранилищеФайлов.ХранилищеФайла
|ИЗ
| РегистрСведений.ХранилищеФайлов КАК ХранилищеФайловДля проверки размера файла ресурс нужно получить программно:
1С (Код)123456789101112131415161718Выборка = РегистрыСведений.ХранилищеФайлов.Выбрать();Пока Выборка.Следующий() ЦиклЕсли Выборка.ХранилищеФайла <> Неопределено ТогдаДвоичныеДанныеФайла =Выборка.ХранилищеФайла.Получить();Сообщить("Файл: "+ Строка(Выборка.Файл)+ ", размер: "+ Строка(ДвоичныеДанныеФайла.Размер()));КонецЕсли;КонецЦикла;## Что чаще всего является причиной ошибки
1. В источник передается
ХранилищеЗначения, а не его содержимое.
2. В приемник записываетсяДвоичныеДанные, хотя ресурс имеет типХранилищеЗначения.
3. Не создано соответствие для элементаПрисоединенныеФайлы.
4. В регистр приемника не попадает измерениеФайл.
5. Регистр загружается раньше, чем справочник присоединенных файлов.
6. Используется неправильное имя ресурса.
7. Файл нулевого размера или значение ресурса равноНеопределено.
8. У пользователя нет права на чтение исходного регистра.
9. Механизм КД ограничивает размер передаваемого сообщения.
10. В обработчике используетсяИсточник.Складили другое поле объекта, а фактически нужное значение находится в регистре.Практически для КД настройка должна выглядеть так:
1С (Код)12345РегистрСведений.ДвоичныеДанныеФайлов.Файл-> РегистрСведений.ХранилищеФайлов.ФайлРегистрСведений.ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла-> РегистрСведений.ХранилищеФайлов.ХранилищеФайлаОбработчик источника:
1С (Код)12345Значение = Неопределено;Если Источник.ДвоичныеДанныеФайла <> Неопределено ТогдаЗначение = Источник.ДвоичныеДанныеФайла.Получить();КонецЕсли;Обработчик приемника:
1С (Код)123Если Значение <> Неопределено ТогдаЗначение = Новый ХранилищеЗначения(Значение);КонецЕсли;
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.