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






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

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

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

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

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

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

Если Не Отказ И ЗначениеЗаполнено(Источник.ДанныеОтчета) Тогда

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

РеквизитыФайла = Новый Структура("ВладелецФайла, Наименование, ФайлХранилище, Расширение, Автор, ДатаСоздания, Размер");
РеквизитыФайла.ВладелецФайла = Источник.Ссылка;
РеквизитыФайла.ДатаСоздания = ТекущаяДата();

Для Каждого ФайлВыгрузки Из ВыгружаемыеДанные Цикл

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

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

РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();

РеквизитыФайла.ФайлХранилище =
Новый ХранилищеЗначения(ДвоичныеДанныеФайла);

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

КонецЦикла;

КонецЕсли

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

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

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

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

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

РеквизитыФайла = Новый Структура("ВладелецФайла, Наименование, ФайлХранилище, Расширение, Автор, ДатаСоздания, Размер");
РеквизитыФайла.ВладелецФайла = Источник.Ссылка;
РеквизитыФайла.ДатаСоздания = ТекущаяДата();

Для Каждого ФайлВыгрузки Из ВыгружаемыеДанные Цикл

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

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

РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();

РеквизитыФайла.ФайлХранилище =
Новый ХранилищеЗначения(ДвоичныеДанныеФайла);

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

КонецЦикла;

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

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

РеквизитыФайла.Размер = ДвоичныеДанныеФайла.Размер();

РеквизитыФайла.ФайлХранилище =
Новый ХранилищеЗначения(ДвоичныеДанныеФайла);

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

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

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

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

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

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

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

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

 

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

Это:

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

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

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

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

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

6 Comments

  1. PerlAmutor

    (0)

    Нужно из БП 3.0 посредством правил обмена, вместе с документом книга продаж сформировать и перенести XML файл в базу источник

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

    (0)

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

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

    Спасибо за статью.

    Reply
  2. Viktor_Ermakov

    (1)

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

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

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

    Да, это странно, но почему то у меня отработало именно так.

    Reply
  3. PerlAmutor

    (2)

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

    Ну вот Вы же сами написали «в приемник». А в тексте написано «в источник».

    Reply
  4. Viktor_Ermakov

    (3)

    Ну вот Вы же сами написали «в приемник». А в тексте написано «в источник».

    Еханый бабай)) теперь вкурил!) Спасибо, это опечатка, буду исправлять.

    Reply
  5. fancy

    Спасибо за статью, все подробно и понятно.

    Еще наверное надо поправить в аннотации

    В источнике приемнике файл будет храниться в справочнике «Книга Продаж Присоединенные Файлы».
    Reply
  6. Viktor_Ermakov

    (5)

    Спасибо, замечание исправил.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *