|
Передать файл через КД 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
|
||||
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
|
В АТО НАТО, ПВО, МО
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |