Вход | Регистрация



Передать файл через КД 2

Передать файл через КД 2
Я
   Zombi
 
20.09.18 - 20:38
Нужно передать файл из одной конфигурации в другую. В приемнике фай лежит в СправочникСсылка.ДоговорыКонтрагентовПрисоединенныеФайлы.ФайлХранилище, а в источнике СправочникСсылка.Файлы.ТекущаяВерсия.ФайлХранилище. Текущая версия это подчиненный справочник. Пытаюсь передать вот так(ПВД):

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Файлы.Ссылка
        |ИЗ
        |        Справочник.Файлы КАК Файлы
        |        
        |ГДЕ
        |    Файлы.ВладелецФайла = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока ВыборкаЗапроса.Следующий() Цикл
        
        ИсходящиеДанные = Новый Структура;
        ИсходящиеДанные.Вставить("ФайлХранилище", ВыборкаЗапроса.Ссылка.ТекущаяВерсия.ФайлХранилище);
        
        ВыгрузитьПоПравилу(ВыборкаЗапроса.Ссылка,,ИсходящиеДанные,,"Файлы00001");
        
    КонецЦикла;

В ПКО для всех свойств настроено соответствие, а для свойства "ФайлХранилище" получать из входящих данных стоит. Но в файле обмена ФайлХранилище пусто. Что не так делаю?
 
 
   echo77
 
1 - 20.09.18 - 20:44
(0) ИсходящиеДанные.ФайлХранилище что-нибудь содержит?

p.s. ВыборкаЗапроса.Ссылка.ТекущаяВерсия.ФайлХранилище лучше заменить на получение в запросе Ссылка.ТекущаяВерсия.ФайлХранилище
   MaxS
 
2 - 20.09.18 - 20:45
В КД 3 выгружал таким кодом:
Если ... Тогда
    ХранимыйФайл = Base64Строка(ДанныеИБ.Хранилище.Получить().ПолучитьДвоичныеДанные());
Иначе
    ХранимыйФайл = Base64Строка(ДанныеИБ.Хранилище.Получить());
КонецЕсли;
ДанныеXDTO.Вставить("ХранимыйФайл", ХранимыйФайл);
   Zombi
 
3 - 20.09.18 - 20:46
Или как то проще передать можно?
   MaxS
 
4 - 20.09.18 - 20:48
(2) Это для УТ 10.3
Суть в том, что двоичные данные нужно преобразовать в строку с помощью Base64Строка
   Zombi
 
5 - 20.09.18 - 20:48
(1) А как посмотреть, что во входящих данных в ИсходящиеДанные при выгрузке? Щас попробую в запросе получать хранилище, но поможет ли...
   Zombi
 
6 - 20.09.18 - 20:50
(4) Ну это у тебя в пакете ХДТО наверное просто ХранимыйФайл это строка. Здесь у меня ФайлХранилище это именно хранилище значений и передать туда строку не прокатит.
   MaxS
 
7 - 20.09.18 - 20:53
(6) В XML файле он все равно в виде строки должен выглядеть. Может быть КД2 сама его преобразует, а может быть нужно помочь.
В хдто тип base64Binary
   Zombi
 
8 - 20.09.18 - 20:56
(1) Сделал
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Файлы.Ссылка,
        |    Файлы.ТекущаяВерсия.ФайлХранилище КАК ФайлХранилище
        |ИЗ
        |    Справочник.Файлы КАК Файлы
        |ГДЕ
        |    Файлы.ВладелецФайла = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока ВыборкаЗапроса.Следующий() Цикл
        
        ИсходящиеДанные = Новый Структура;
        ИсходящиеДанные.Вставить("ФайлХранилище", ВыборкаЗапроса.ФайлХранилище);
        
        ВыгрузитьПоПравилу(ВыборкаЗапроса.Ссылка,,ИсходящиеДанные,,"Файлы00001");
        
    КонецЦикла;


Все равно 

</Ссылка>
</Свойство><Свойство Имя="ФайлХранилище" Тип="ХранилищеЗначения">
    <Пусто/>
</Свойство>
   Zombi
 
9 - 20.09.18 - 21:00
(7) Да, преобразует сама. Я сначала передавал напрямую из источника СправочникСсылка.ВерсииФайлов в приемник СправочникСсылка.ВерсииФайлов. Файл нормально переносился и открывался в приемнике. Но к договору не прицеплялся. Оказалось что в приемнике прикрепленные файлы хранятся в СправочникСсылка.ДоговорыКонтрагентовПрисоединенныеФайлы. А в источнике СправочникСсылка.ВерсииФайлов. Вот надо сконвертировать.
   echo77
 
10 - 20.09.18 - 21:02
(0) Я тоже сделал https://yadi.sk/i/ueWzRJKMM9z1PA
(9) Вы правы, КД2 преобразует двоичные данные в Base64 сама
 
 Рекламное место пустует
   echo77
 
11 - 20.09.18 - 21:05
(0) Делал так:
ПВД Перед выгрузкой:

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    Ссылка,
|    Объект,
|    Хранилище
|ИЗ
|    Справочник.ХранилищеДополнительнойИнформации КАК ХранилищеДополнительнойИнформации
|ГДЕ
|    ХранилищеДополнительнойИнформации.Объект = &Объект";
// Устанавливаем параметры

Запрос.УстановитьПараметр("Объект", Объект.Ссылка);

Выборка=Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    
    ВыгрузитьПоПравилу(Выборка,,,, "ХранилищеДополнительнойИнформации");
    
КонецЦикла;

Само ПКО: https://yadi.sk/i/BySqsRgHsE2TWg
   Zombi
 
12 - 20.09.18 - 21:09
(11) Может тоже попытаться обойтись без исходящих данных...
   Zombi
 
13 - 20.09.18 - 21:34
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Файлы.Автор,
        |    Файлы.ВладелецФайла,
        |    Файлы.ДатаСоздания,
        |    Файлы.Зашифрован,
        |    Файлы.ИндексКартинки,
        |    Файлы.Описание,
        |    Файлы.ПодписанЭП,
        |    Файлы.Редактирует,
        |    Файлы.ТекстХранилище,
        |    Файлы.Наименование,
        |    Файлы.ПометкаУдаления,
        |    Файлы.ТекущаяВерсияДатаМодификацииФайла КАК ДатаМодификацииУниверсальная,
        |    Файлы.ТекущаяВерсияАвтор КАК Изменил,
        |    Файлы.ТекущаяВерсияПутьКФайлу КАК ПутьКФайлу,
        |    Файлы.ТекущаяВерсияРазмер КАК Размер,
        |    Файлы.ТекущаяВерсияРасширение КАК Расширение,
        |    Файлы.ТекущаяВерсияТом КАК Том,
        |    Файлы.ТекущаяВерсия.ФайлХранилище КАК ФайлХранилище
        |ИЗ
        |    Справочник.Файлы КАК Файлы
        |ГДЕ
        |    Файлы.ВладелецФайла = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока ВыборкаЗапроса.Следующий() Цикл
        
        ВыгрузитьПоПравилу(ВыборкаЗапроса,,,,"Файлы00001");
        
    КонецЦикла;


Тоже не помогло. Пусто.
   Zombi
 
14 - 20.09.18 - 21:36
Скриншот ПКО:

https://yadi.sk/i/t7M_Tzr2nBQKiQ
   echo77
 
15 - 21.09.18 - 14:47
(14) А в ФайлХранилище точно что-то есть?
Пока ВыборкаЗапроса.Следующий() Цикл
   
  Сообщить(ВыборкаЗапроса.ФайлХранилище.Получить());     
   
       ВыгрузитьПоПравилу(ВыборкаЗапроса,,,,"Файлы00001");
        
КонецЦикла;
   Zombi
 
16 - 21.09.18 - 15:19
(15) Да, вчера не отписался. Оказалось в версиях в хранилище нет файла, он в томах хранится. Получилось выгрузить вот так:

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Файлы.Ссылка,
        |    Файлы.ТекущаяВерсия КАК ВерсияСсылка,
        |    СведенияОФайлах.ЯвляетсяОригиналом
        |ИЗ
        |    РегистрСведений.СведенияОФайлах КАК СведенияОФайлах
        |        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Файлы КАК Файлы
        |        ПО СведенияОФайлах.Файл = Файлы.Ссылка
        |ГДЕ
        |    Файлы.ВладелецФайла = &Ссылка
        |    И СведенияОФайлах.ЯвляетсяОригиналом";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока ВыборкаЗапроса.Следующий() Цикл
        
        ВерсияСсылка = ВыборкаЗапроса.ВерсияСсылка;
        ХранилищеКПередаче = "";
        
        Если НЕ ВерсияСсылка.Том.Пустая() И ХранилищеКПередаче = "" Тогда
            ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; 
            Попытка
                ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть);
                ХранилищеКПередаче = Новый ХранилищеЗначения(ДвоичныеДанные);
            Исключение
                
                Продолжить;
                
            КонецПопытки;
    
        Иначе 
    
            Продолжить;
    
        КонецЕсли;
        
        ИсходящиеДанные = Новый Структура;
        ИсходящиеДанные.Вставить("ФайлХранилище", ХранилищеКПередаче);
        
        ВыгрузитьПоПравилу(ВыборкаЗапроса.Ссылка,,ИсходящиеДанные,,"Файлы00001");
        
    КонецЦикла;
   Zombi
 
17 - 21.09.18 - 15:33
Теперь вот проблема только. Бьюсь второй день с ней. Файл почему то выгружается только со 2 раза. Первый раз получаю ошибку:


Ошибка при загрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1498)}: Ошибка в обработчике события ПослеЗагрузкиОбъекта
    ИмяПКО                 =  Файлы00001
    ТипОбъекта             =  Присоединенные файлы (Договор контрагента)
    Объект                 =  Контр
    Обработчик             =  ПослеЗагрузкиОбъекта
    ОписаниеОшибки         =  Значение не является значением объектного типа (ФайлХранилище)
    ПозицияМодуля          =  (7)
    КодСообщения           =  21

Это в ПКО ПослеЗагрузки я прописал:
    НаборЗаписей = РегистрыСведений.ПрисоединенныеФайлы.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ПрисоединенныйФайл.Установить(Ссылка);
    НаборЗаписей.Прочитать();
    НаборЗаписей.Очистить();
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.ПрисоединенныйФайл = Ссылка;
    НоваяЗапись.ХранимыйФайл = Ссылка.ФайлХранилище;
    НаборЗаписей.Записать();


Без этого не открывается в договоре. 

И вот на строке НоваяЗапись.ХранимыйФайл = Ссылка.ФайлХранилище;

он валится когда первый раз файл загружает. С чем может быть связанно?
   Zombi
 
18 - 21.09.18 - 15:35
Блин, а ПослеЗагрузкиОбъекта файл записан?
   Zombi
 
19 - 21.09.18 - 15:36
Наверное Объект использовать надо?
   Zombi
 
20 - 21.09.18 - 15:40
НаборЗаписей = РегистрыСведений.ПрисоединенныеФайлы.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ПрисоединенныйФайл.Установить(Ссылка);
    НаборЗаписей.Прочитать();
    НаборЗаписей.Очистить();
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.ПрисоединенныйФайл = Ссылка;
    НоваяЗапись.ХранимыйФайл = Объект.ФайлХранилище;
    НаборЗаписей.Записать();

Сделал. А как тогда при загрузке установить
НоваяЗапись.ПрисоединенныйФайл = Ссылка;  ?
   Zombi
 
22 - 21.09.18 - 15:48
Подниму вопрос: Как после загрузки объекта справочника создать запись в РС с ссылкой на этот объект?
   Zombi
 
23 - 21.09.18 - 15:58
Объект.Записать();
    НаборЗаписей = РегистрыСведений.ПрисоединенныеФайлы.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ПрисоединенныйФайл.Установить(Объект.Ссылка);
    НаборЗаписей.Прочитать();
    НаборЗаписей.Очистить();
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.ПрисоединенныйФайл = Объект.Ссылка;
    НоваяЗапись.ХранимыйФайл = Объект.ФайлХранилище;
    НаборЗаписей.Записать();

Вот так сделал, но это костыль. Надо наверное в каком то другом обработчике делать по человечески?
   echo77
 
24 - 22.09.18 - 08:21
(22) Делайте ПКО, в котором сразу выгружаете данные в РС.ПрисоединенныеФайлы
   MaxS
 
25 - 22.09.18 - 17:24
(22) Примерно так, пишу по памяти, синтаксис может быть ошибочным
Если Объект.Новый() Тогда
  СсылкаНаОбъект = Объект.ПолучитьСсылкуНового();
Иначе
   СсылкаНаОбъект = Объект.Ссылка;
КонецЕсли;
   Cyberhawk
 
26 - 22.09.18 - 17:58
(23) Если уж и записываешь объект в БД в обработчиках ПОД, то Отказ не забудь взвести, иначе он у тебя дважды записываться будет. Чтобы получить ссылку объекта БД записывать его точно не требуется.
   Zombi
 
27 - 22.09.18 - 22:14
Толковые советы. Спасибо всем.
   Franchiser
 
28 - 23.09.18 - 10:25
(26) ПОДы это в КД3
   Cyberhawk
 
29 - 23.09.18 - 10:34
(28) Ага, а Лондон - столица Великобритании
   Franchiser
 
30 - 23.09.18 - 10:44
В КД2 ПКО, ПВД, ПКС
   Cyberhawk
 
31 - 23.09.18 - 12:43
В АТО НАТО, ПВО, МО


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует