Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Загрузка Присоединенного файла методом POST odata Enterprise data

Загрузка Присоединенного файла методом POST odata Enterprise data
Я
   Chainikus
 
12.11.20 - 12:48
Добрый день, господа!
Какой день подряд пытаюсь загрузить присоединенные файлы (справочник СчетНаОплатуПокупателюПрисоединенныеФайлы) в базу данных 1С.

Хранилище на сервере - ВТомахНаДиске

POST запросом я создаю запись, но не знаю, как вложить данные файла. Они могли бы передаваться в "ФайлХранилище_Base64Data". Но это в том случае, когда файл хранится в базе данных, а не в хранилище.

Мой запрос на добавление выглядит так:

{
"Description": "ЗКТУ-TEST-43",
"Расширение": "pdf",
"Описание": "ОписаниеChainikus",
"ВладелецФайла_Key": "8ab01ee2-151e-11eb-80f2-0050569a8809",
"ТипХраненияФайла": "ВТомахНаДиске",
"Том_Key": "3e8c35c2-0c46-11ea-8131-000c29203e0c",
"ПутьКФайлу": "20201112\\TEST-43.pdf",
"ФайлХранилище_Type": "application/octet-stream",
"ФайлХранилище_Base64Data": "cEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZ"
}

(Есть подозрение, что некорректно указан ФайлХранилище_Type)

Пробовал размер, имя файла - передавать/не передавать в случайном порядке. В итоге запись создается, файла в хранилище нет.


Так же Пробовал положить файл в хранилище (до запроса и после запроса) руками.

В итоге, при открытии файла в программе, 1С пишет ошибку: "Ошибка доступа к файлу", хотя файл в appData моих документов сохраняется и его там можно открыть.

Если кто сталкивался - просьба помочь.
   Chainikus
 
1 - 12.11.20 - 12:51
Если приложение прикрепить руками в программе, то "ФайлХранилище_Type": "application/xml+xdto",
Но при передаче такого ключа POST запросом выходит 500 ошибка. Поменял тип на "application/octet-stream"
   arsik
 
2 - 12.11.20 - 13:04
Написано же - прав нет.
   Chainikus
 
3 - 12.11.20 - 13:28
Написано же - прав нет.
1) Права на файл есть. Такие же, как на файл, лежащий рядом, который открывается через 1С (проверил по свойствам). И опять же, я этот файл могу открыть. Какие-то записи в 1с не правильные

2) Это все равно костыль.
Как файл создавать во вложении автоматом, а не подкладывать руками?
   arsik
 
4 - 12.11.20 - 13:49
(3) Когда я вижу "ВладелецФайла_Key" - то сразу предполагаю, что внутри 1С права у пользователей на файлы могут быть разные.
   Chainikus
 
5 - 12.11.20 - 13:54
ВладелецФайла_Key = это ГУИД СчетаНаОплатуПокупателю всего лишь, куда привязывать вложение
   arsik
 
6 - 12.11.20 - 14:12
(5) Тогда сорян.
На инфостарте глянь
http://forum.infostart.ru/forum9/topic141166/message1454266/#message1454266
   Chainikus
 
7 - 12.11.20 - 14:27
Видел эту статью, но регистр сейчас называется "УдалитьПрисоединенныеФайлы"

с той статьи 5 лет прошло.
   hhhh
 
8 - 12.11.20 - 14:52
(7) если файл на диске, зачем вы его внутрь базы хотите закачать? передавайте просто путь к файлу.
   hhhh
 
9 - 12.11.20 - 14:56
(7) и да, у обмена совершенно другой пользователь, не то, "который открывается через 1С", прав у него действительно может не быть.
   Chainikus
 
10 - 12.11.20 - 14:59
1) Файл на диск я кладу руками, для теста. И указываю к нему путь.
Это не корректно. Я просто пытаюсь понять, как оно работает

2) Даже, при условии, что файл есть, и при открытии приложения он скачивается в мою AppData, он все равно не открывается.

Видимо arsik прав и нужно искать, как запихать файл в хранилище

В справке написано правда, что
● Свойство <Имя свойства>_Base64Data хранит данные, которые могут быть получены с помощью навигационного свойства, только закодированные в Base64. Редактировать данные реквизита типа ХранилищеЗначения можно только с помощью этого свойства.

https://its.1c.ru/db/v8318doc#bookmark:dev:TI000001361
   arsik
 
11 - 12.11.20 - 15:05
(10) Я так и не понял. Что нужно сделать и что не получается.
Ты не можешь передать или получить?
   Chainikus
 
12 - 12.11.20 - 15:10
ни передать, не получить.
Могу только создать запись в справочнике СчетНаОплатуПокупателюПрисоединенныеФайлы.
   arsik
 
13 - 12.11.20 - 15:15
(12) Ну вот. Запись ты создал. Теперь к этой записи присоедини файл. (6) Сейчас может этот регистр называется просто по другому. Посмотри в базе, куда пишутся присоединенные файлы.
   Kassern
 
14 - 12.11.20 - 16:07
(0) что то я совсем не пойму, есть всего 2 способа хранения картинки для присоединенных файлов
1) в томах на диске
2) в реквизите ФайлХранилище с типом ХранилищеЗначения
А у тебя в коде выбран вариант хранения в томах и зачем то ты пихаешь данные в ФайлХранилище...
Если хочешь чтобы картинка хранилась в базе, то тогда тип хранения = ВИнформационнойБазе путь до файла указывать не нужно.
В ФайлХранилище попробуй запихать Base64Строка(Новый ДвоичныеДанные(ПутьДоФайла))
   arsik
 
15 - 12.11.20 - 16:24
(14) Он пытается через odata по стандартам Enterprise data передать серверу файл, что бы тот положил его в свое хранилище (не важно - файловое оно или внутри базы, это уже приемник будет решать).
   acht
 
16 - 12.11.20 - 17:03
(15) Ну вот применик и решает, что если переданы противоречивые данные, то надо выбрать что-то одно. А так как явно указано хранение на диске, то двоичные данные просто выкидываются.

Или ты ождаешь, что "по стандартам Enterprise data" БСП почему-то должна тебе еще и данные в сетевой каталог записать?
   Chainikus
 
17 - 12.11.20 - 19:34
//Или ты ождаешь, что "по стандартам Enterprise data" БСП почему-то должна тебе еще и данные в сетевой каталог записать?

Не скрою - была надежда

я попробую запихать строку адреса в Base64Строка. Отпишусь

Наковырял еще интересный регистр СведенияОФайлах.
Не совсем понимаю его смысл, но попробую с ним поиграть
   arsik
 
18 - 12.11.20 - 23:19
(16) В парадигме Enterprise data - клиент не должен решать, где будет хранить файл сервер. Сервер опирается на свои хранилища.
   acht
 
19 - 13.11.20 - 08:52
(18) > В парадигме Enterprise data
Какая превосходная, восхитительная смесь уверенности, фантазии, глубоких знаний протокола и формата данных. Порекомендуй, пожалуйста, дилера!
   Chainikus
 
20 - 13.11.20 - 15:03
Мальчики, не ссорьтесь.

Если передать адрес файла, закодированного в Base64 в объект "ФайлХранилище_Base64Data", то этот 65ричный код просто сохранится в хранилище.

Регистр.СведенияОФайлах заполняется сам при создании записи СчетНаОплатуПокупателюПрисоединенныеФайлы

Если передаю весь файл, закодированным в Base64 в объект "ФайлХранилище_Base64Data", то набор байт сохраняется в базе.

Передать файл до сих пор не смог никаким образом
   Chainikus
 
21 - 13.11.20 - 15:04
64ричный код*
   arsik
 
22 - 13.11.20 - 15:22
(20) Через odata не получится.
Можно конечно извернутся и в модуле объекта СчетНаОплатуПокупателюПрисоединенныеФайлы в "приЗаписи" сделать типа:

Если данные сеанс одата и ФайлХранилище_Base64Data заполнено тогда положим в том на диске данные из ФайлХранилище_Base64Data, а ФайлХранилище_Base64Data очистим.


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