Заметки КД 2.1: Как передать файл, динамически создаваемый в источнике, в справочник присоединенных файлов приемника

Обмен - Перенос данных из 1C8 в 1C8

Конвертация данных передача XML файла

23
В БП 3.0 есть документ "Книга Продаж Для Передачи В ЭлектронномВиде" из которого выгружается XML файл. Задача: Нужно из БП 3.0 посредством правил обмена, вместе с документом книга продаж сформировать и перенести XML файл в базу приемник. В приемнике файл будет храниться в справочнике "Книга Продаж Присоединенные Файлы".

Первым делом, конечно, нужно создать и настроить ПКО для передачи самого документа "Книга продаж в электронном виде", но этого делать не буду, представим, что у Вас это уже настроено.

Приблизительно это выглядит вот так

Заходим в ПКО обработчик события "ПриВыгрузке".

P.S. изначально хотел писать код в "ПередВыгрузкой", но почему то экспортная процедура модуля объекта, не хотела отрабатывать, выдавало ошибку что метод не обнаружен.

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

Если Не Отказ И ЗначениеЗаполнено(Источник.ДанныеОтчета) Тогда
	
	ВыгружаемыеДанные = Источник.ВыгрузитьДокумент();
	
	РеквизитыФайла = Новый Структура("ВладелецФайла, Наименование, ФайлХранилище, Расширение, Автор, ДатаСоздания, Размер");
	РеквизитыФайла.ВладелецФайла = Источник.Ссылка;
	РеквизитыФайла.ДатаСоздания = ТекущаяДата();
	
	Для Каждого ФайлВыгрузки Из ВыгружаемыеДанные Цикл
		
		ИмяФайлаВыгрузки = СтрРазделить(ФайлВыгрузки.ИмяФайлаВыгрузки,".");
		РеквизитыФайла.Наименование = ИмяФайлаВыгрузки[0];
		РеквизитыФайла.Расширение = ИмяФайлаВыгрузки[1];
		РеквизитыФайла.Автор = Строка(Пользователи.ТекущийПользователь());
		
		ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ФайлВыгрузки.АдресФайлаВыгрузки);
		
		РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();
		
		РеквизитыФайла.ФайлХранилище = 
			Новый ХранилищеЗначения(ДвоичныеДанныеФайла);	
		
		ВыгрузитьПоПравилу(РеквизитыФайла,,,,"КнигаПродажПрисоединенныеФайлы");
		
	КонецЦикла;
	
КонецЕсли

В моём случае, Источник это выгружаемый Документ Объект, а значит у него доступны экспортные процедуры и функции модуля объекта.

В модуле объекта есть функция, которая формирует файл XML и возвращает массив структур, где содержится имя файла, и адрес временного хранилища.

ВыгружаемыеДанные = Источник.ВыгрузитьДокумент();

Далее мы создаем структуру "РеквизитыФайла", которая нам понадобится в ПКО для передачи в источник элемента справочника присоединенных файлов, и заполняем ее данными.

Структуру мы составляем по реквизитам Вашего справочника присоединенных файлов в базе приемнике.

РеквизитыФайла = Новый Структура("ВладелецФайла, Наименование, ФайлХранилище, Расширение, Автор, ДатаСоздания, Размер");
РеквизитыФайла.ВладелецФайла = Источник.Ссылка;
РеквизитыФайла.ДатаСоздания = ТекущаяДата();
	
Для Каждого ФайлВыгрузки Из ВыгружаемыеДанные Цикл
		
	ИмяФайлаВыгрузки = СтрРазделить(ФайлВыгрузки.ИмяФайлаВыгрузки,".");
	РеквизитыФайла.Наименование = ИмяФайлаВыгрузки[0];
	РеквизитыФайла.Расширение = ИмяФайлаВыгрузки[1];
	РеквизитыФайла.Автор = Строка(Пользователи.ТекущийПользователь());
		
	ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ФайлВыгрузки.АдресФайлаВыгрузки);
		
	РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();
		
	РеквизитыФайла.ФайлХранилище = 
		Новый ХранилищеЗначения(ДвоичныеДанныеФайла);	
	
	ВыгрузитьПоПравилу(РеквизитыФайла,,,,"КнигаПродажПрисоединенныеФайлы");
		
КонецЦикла;

Тут стоит обратить внимание на строчки

ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ФайлВыгрузки.АдресФайлаВыгрузки);
		
РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();
		
РеквизитыФайла.ФайлХранилище = 
	Новый ХранилищеЗначения(ДвоичныеДанныеФайла);

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

Последней строкой кода мы вызываем ПКО для передачи элемента справочника присоединенных файлов и передаем туда наши реквизиты файла

ВыгрузитьПоПравилу(РеквизитыФайла,,,,"КнигаПродажПрисоединенныеФайлы");

Само ПКО выглядит так. Источника нет, обработчики ничего не содержат.

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

А в ПКС каждого, в обработчике "ПередВыгрузкой" мы прописываем алгоритмы значений этих свойств, берем их из переданной структуры, а это Источник

У меня в конечной базе есть реквизит "ФайлХранилище" с типом Хранилище значений, в него мы передаем значение из структуры так же с типом хранилище значений, которое мы создавали программно выше.

На этом мой пример окончен.

 

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

Это:

1. Экспортная процедура по созданию файла.

2. Ссылка на временное хранилище файла в базе источнике или его двоичные данные.

3. Наименование файла.

Этого достаточно, чтобы у Вас все получилось.

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

23

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. PerlAmutor 30 10.10.18 13:04 Сейчас в теме
(0)
Нужно из БП 3.0 посредством правил обмена, вместе с документом книга продаж сформировать и перенести XML файл в базу источник


А тут нет противоречия? Перенос вроде бы всегда идет из базы источника в базу приемник.

(0)
P.S. изначально хотел писать код в "ПередВыгрузкой", но почему то экспортная процедура модуля объекта, не хотела отрабатывать, выдавало ошибку что метод не обнаружен.

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

Спасибо за статью.
2. TEENAGER1984 74 10.10.18 13:24 Сейчас в теме
(1)
А тут нет противоречия? Перенос вроде бы всегда идет из базы источника в базу приемник.

Вы наверное не совсем поняли смысл: в источнике файл выгрузки XML не хранится, а формируется динамически в момент выгрузки, затем передается в приемник.

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

Да, это странно, но почему то у меня отработало именно так.
3. PerlAmutor 30 10.10.18 13:46 Сейчас в теме
(2)
Вы наверное не совсем поняли смысл: в источнике файл выгрузки XML не хранится, а формируется динамически в момент выгрузки, затем передается в приемник.


Ну вот Вы же сами написали "в приемник". А в тексте написано "в источник".
4. TEENAGER1984 74 10.10.18 13:48 Сейчас в теме
(3)
Ну вот Вы же сами написали "в приемник". А в тексте написано "в источник".

Еханый бабай)) теперь вкурил!) Спасибо, это опечатка, буду исправлять.
5. fancy 11.10.18 07:38 Сейчас в теме
Спасибо за статью, все подробно и понятно.
Еще наверное надо поправить в аннотации
В источнике приемнике файл будет храниться в справочнике "Книга Продаж Присоединенные Файлы".
6. TEENAGER1984 74 12.10.18 14:30 Сейчас в теме
(5)
Спасибо, замечание исправил.
Оставьте свое сообщение