Задача: Нужно из БП 3.0 посредством правил обмена, вместе с документом книга продаж сформировать и перенести XML файл в базу приемник.
В приемнике файл будет храниться в справочнике «Книга Продаж Присоединенные Файлы».
Первым делом, конечно, нужно создать и настроить ПКО для передачи самого документа "Книга продаж в электронном виде", но этого делать не буду, представим, что у Вас это уже настроено.
Приблизительно это выглядит вот так
Заходим в ПКО обработчик события "ПриВыгрузке".
P.S. изначально хотел писать код в "ПередВыгрузкой", но почему то экспортная процедура модуля объекта, не хотела отрабатывать, выдавало ошибку что метод не обнаружен.
Весь код обработчика:
Если Не Отказ И ЗначениеЗаполнено(Источник.ДанныеОтчета) Тогда
ВыгружаемыеДанные = Источник.ВыгрузитьДокумент();
РеквизитыФайла = Новый Структура("ВладелецФайла, Наименование, ФайлХранилище, Расширение, Автор, ДатаСоздания, Размер");
РеквизитыФайла.ВладелецФайла = Источник.Ссылка;
РеквизитыФайла.ДатаСоздания = ТекущаяДата();
Для Каждого ФайлВыгрузки Из ВыгружаемыеДанные Цикл
ИмяФайлаВыгрузки = СтрРазделить(ФайлВыгрузки.ИмяФайлаВыгрузки,".");
РеквизитыФайла.Наименование = ИмяФайлаВыгрузки[0];
РеквизитыФайла.Расширение = ИмяФайлаВыгрузки[1];
РеквизитыФайла.Автор = Строка(Пользователи.ТекущийПользователь());
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ФайлВыгрузки.АдресФайлаВыгрузки);
РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();
РеквизитыФайла.ФайлХранилище =
Новый ХранилищеЗначения(ДвоичныеДанныеФайла);
ВыгрузитьПоПравилу(РеквизитыФайла,,,,"КнигаПродажПрисоединенныеФайлы");
КонецЦикла;
КонецЕсли
В моём случае, Источник это выгружаемый Документ Объект, а значит у него доступны экспортные процедуры и функции модуля объекта.
В модуле объекта есть функция, которая формирует файл XML и возвращает массив структур, где содержится имя файла, и адрес временного хранилища.
ВыгружаемыеДанные = Источник.ВыгрузитьДокумент();
Далее мы создаем структуру "РеквизитыФайла", которая нам понадобится в ПКО для передачи в источник элемента справочника присоединенных файлов, и заполняем ее данными.
Структуру мы составляем по реквизитам Вашего справочника присоединенных файлов в базе приемнике.
РеквизитыФайла = Новый Структура("ВладелецФайла, Наименование, ФайлХранилище, Расширение, Автор, ДатаСоздания, Размер");
РеквизитыФайла.ВладелецФайла = Источник.Ссылка;
РеквизитыФайла.ДатаСоздания = ТекущаяДата();
Для Каждого ФайлВыгрузки Из ВыгружаемыеДанные Цикл
ИмяФайлаВыгрузки = СтрРазделить(ФайлВыгрузки.ИмяФайлаВыгрузки,".");
РеквизитыФайла.Наименование = ИмяФайлаВыгрузки[0];
РеквизитыФайла.Расширение = ИмяФайлаВыгрузки[1];
РеквизитыФайла.Автор = Строка(Пользователи.ТекущийПользователь());
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ФайлВыгрузки.АдресФайлаВыгрузки);
РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();
РеквизитыФайла.ФайлХранилище =
Новый ХранилищеЗначения(ДвоичныеДанныеФайла);
ВыгрузитьПоПравилу(РеквизитыФайла,,,,"КнигаПродажПрисоединенныеФайлы");
КонецЦикла;
Тут стоит обратить внимание на строчки
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ФайлВыгрузки.АдресФайлаВыгрузки);
РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();
РеквизитыФайла.ФайлХранилище =
Новый ХранилищеЗначения(ДвоичныеДанныеФайла);
Где мы получаем из временного хранилища двоичные данные, что бы получить размер, а потом записываем их в хранилище значений, уже непосредственно для передачи в справочник присоединенных файлов.
Последней строкой кода мы вызываем ПКО для передачи элемента справочника присоединенных файлов и передаем туда наши реквизиты файла
ВыгрузитьПоПравилу(РеквизитыФайла,,,,"КнигаПродажПрисоединенныеФайлы");
Само ПКО выглядит так. Источника нет, обработчики ничего не содержат.
Список ПКС в ПКО создаем вручную, так же без источника, по ранее созданной структуре, ну и если нужны еще реквизиты то добавляем их, главное что бы мы эти данные могли получить.
А в ПКС каждого, в обработчике "ПередВыгрузкой" мы прописываем алгоритмы значений этих свойств, берем их из переданной структуры, а это Источник
У меня в конечной базе есть реквизит "ФайлХранилище" с типом Хранилище значений, в него мы передаем значение из структуры так же с типом хранилище значений, которое мы создавали программно выше.
На этом мой пример окончен.
В этой статье описан частный случай, но главное понять и подчеркнуть для себя, что Вам нужно для того что бы перенести файлы в Вашем случае.
Это:
1. Экспортная процедура по созданию файла.
2. Ссылка на временное хранилище файла в базе источнике или его двоичные данные.
3. Наименование файла.
Этого достаточно, чтобы у Вас все получилось.
Если у кого будут замечания и предложение, как это сделать быстрее, проще или оптимальнее, пишите в комментариях, статью буду редактировать.
(0)
А тут нет противоречия? Перенос вроде бы всегда идет из базы источника в базу приемник.
(0)
Очень странно. Если говорить о обработке УниверсальныйОбменДаннымиXML, то оба обработчика вызываются в пределах одной процедуры ВыгрузитьПоПравилу().
Спасибо за статью.
(1)
Вы наверное не совсем поняли смысл: в источнике файл выгрузки XML не хранится, а формируется динамически в момент выгрузки, затем передается в приемник.
Да, это странно, но почему то у меня отработало именно так.
(2)
Ну вот Вы же сами написали «в приемник». А в тексте написано «в источник».
(3)
Еханый бабай)) теперь вкурил!) Спасибо, это опечатка, буду исправлять.
Спасибо за статью, все подробно и понятно.
Еще наверное надо поправить в аннотации
источникеприемнике файл будет храниться в справочнике «Книга Продаж Присоединенные Файлы».(5)
Спасибо, замечание исправил.