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

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

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

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

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


Все равно

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

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

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

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

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


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

https://yadi.sk/i/t7M_Tzr2nBQKiQ
15 echo77
 
21.09.18
14:47
(14) А в ФайлХранилище точно что-то есть?

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

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


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

Это в ПКО ПослеЗагрузки я прописал:

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


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

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

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

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

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