Присоединенные файлы в 1С ЭДО

1. TopZlodey 13 02.04.19 11:12 Сейчас в теме
Здравствуйте, пытаюсь получить данные передаваемые по ЭДО (между УТ 10.3 и БП). Смог дойти только до того что полученный файл сохраняется в справочник ЭДПрисоединенныеФайлы. Вопрос, а как получить данные которые там хранятся?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
17. D_e_X_T_e_R 573 02.04.19 13:53 Сейчас в теме +0.53 $m
В общем отследил как он сохраняет файл, на примере ERP, справочник номенклатура. Файл можно достать так:

Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ 
		|	ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла
		|ИЗ
		|	РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
		|ГДЕ
		|	ДвоичныеДанныеФайлов.Файл.ВладелецФайла = &ВладелецФайла";
	
	Запрос.УстановитьПараметр("ВладелецФайла", Справочники.Номенклатура.НайтиПоКоду("00-00000293"));
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Файл = ВыборкаДетальныеЗаписи.ДвоичныеДанныеФайла.Получить();
		Файл.Записать("C:\Users\shtennikov\Desktop\1111.jpg");
	КонецЦикла;
Показать
40. SedovSU@mail.ru 297 03.04.19 06:11 Сейчас в теме
(39) для сериализации можно так сделать

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("D:\Home\mpiskunov\Desktop\скрины и доки\тестоваяпапка\1.xml");
ФабрикаXDTOФайлаXML = Новый ФабрикаXDTO;
ОбъектXDTO = ФабрикаXDTOФайлаXML.ПрочитатьXML(ЧтениеXML);


Переменная ОбъектXDTO содержит структуру вашего xml файла с которой очень удобно работать. Далее обращаетесь к элементам XDTO читаете нужные данные
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. D_e_X_T_e_R 573 02.04.19 11:34 Сейчас в теме
А получить куда? Справочник содержит адреса файлов во временном хранилище.
Обращайся по адресу к хранилищу значения и вытаскивай.
3. D_e_X_T_e_R 573 02.04.19 11:36 Сейчас в теме
Вот простой пример сохранения файла из справочника.

&НаКлиенте
Процедура СохранитьФайл(Команда)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок = "Выбрать каталог для сохранения";
	Диалог.Фильтр = "Изобрадение(*.jpg)|*.jpg";
	Диалог.Показать(Новый ОписаниеОповещения("ЗакончитьСохранениеФайла", ЭтотОбъект, Новый Структура("Диалог", Диалог)));
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакончитьСохранениеФайла(ВыбранныйФайл, ДополнительныеПараметры) Экспорт

	Диалог = ДополнительныеПараметры.Диалог;
	
	Если ВыбранныйФайл = Неопределено Тогда
		Сообщить("Не выбран каталог для сохранения");
	Иначе
		ПутьКФайлу = Диалог.ПолноеИмяФайла;
	КонецЕсли;
	
	Изображение = ПолучитьНаСервере();
	Изображение.Записать(ПутьКФайлу);
	Сообщить("Файл сохранен " + ПутьКФайлу);

КонецПроцедуры

&НаСервере
Функция ПолучитьНаСервере()
	Возврат Объект.Ссылка.ДанныеКартинки.Получить();      //Данные картинки - это реквизит с типом хранилище значения, где хранится сам файл.
КонецФункции
Показать
4. SedovSU@mail.ru 297 02.04.19 11:47 Сейчас в теме
В справочнике с есть реквизит с типом значения ХранилищеЗначений.
Вы его получаете и сохраняете. Только вам нужно знать какой тип сохранять!

Хранилище = ЭДПрисоединенныеФайлы.РеквизитСТипомХранилище.Получить();
Если Хранилище <> Неопределено Тогда
// далее все зависит от типа значений
Если ТипЗнч(Хранилище) = Тип("ДвоичныеДанные") Тогда
Хранилище.Записать(ПутьКФайлу)
Иначе
// другой метод записи в файл в зависимости от типа значения
Конецесли
5. TopZlodey 13 02.04.19 12:19 Сейчас в теме
(4)
(3)
Примерно попробовал ваши варианты, не очень понимаю как это сделать.
Через запросы получил значения и вышло следующее:
Прикрепленные файлы:
6. SedovSU@mail.ru 297 02.04.19 12:25 Сейчас в теме
(5) у вас есть реквизит ФайлХранилище - в нем ваш файл


Хранилище = Выборка.Ссылка.ФайлХранилище.Получить();
Если Хранилище <> Неопределено Тогда
// далее все зависит от типа значений
Если ТипЗнч(Хранилище) = Тип("ДвоичныеДанные") Тогда
Хранилище.Записать(ПутьКФайлу)
Иначе
// другой метод записи в файл в зависимости от типа значения
Конецесли
7. TopZlodey 13 02.04.19 12:26 Сейчас в теме
(6)Понял, сейчас попробую
8. TopZlodey 13 02.04.19 12:35 Сейчас в теме
(6)
Если ТипЗнч(Хранилище) = Тип("ДвоичныеДанные") Тогда
Хранилище.Записать(ПутьКФайлу)


Не определяет тип значения файла да и сам файл неопределен.
9. SedovSU@mail.ru 297 02.04.19 12:42 Сейчас в теме
(8) То есть он возвращает тип НЕОПРЕДЕЛЕНО - следовательно в этом реквизите у вас нету ничего. Тогда если смотреть структуру Выборка.Ссылка есть еще один реквизит ТекстХранилища. Возможно его нужно попробывать

Хранилище = Выборка.Ссылка.ТекстХранилища.Получить(); 
Если Хранилище <> Неопределено Тогда 
// далее все зависит от типа значений 
Если ТипЗнч(Хранилище) = Тип("ДвоичныеДанные") Тогда 
Хранилище.Записать(ПутьКФайлу) 
Иначе 
// другой метод записи в файл в зависимости от типа значения 
Конецесли


Когда сделаете Выборка.Ссылка.ТекстХранилища.Получить() - какой тип вернет?
10. TopZlodey 13 02.04.19 12:44 Сейчас в теме
(9)Пустая строка
Прикрепленные файлы:
11. SedovSU@mail.ru 297 02.04.19 12:53 Сейчас в теме
(10) Так мы не правильно двигаемся,нужно понять где находится файл. Я думал в реквизите ФайлХранилище но вы говорите что у него тип возвращается не определено следовательно там пусто. Теперь давай те в отладке так же посмотрим на реквизит ВладелецФайла у него тип входящий электронный документ - скорее всего он там храниться. Для этого в отладке вставьте текст

Выборка.Ссылка.ВладелецФайла и вставьте скрин чтоб было видны реквизиты!
12. TopZlodey 13 02.04.19 13:02 Сейчас в теме
(11)Вот
Прикрепленные файлы:
13. SedovSU@mail.ru 297 02.04.19 13:15 Сейчас в теме
(12) блин, по ссылке нету ни чего. а давай те еще прин скрин табличных частей и там все станет ясно. Так не могу сообразить где файл храниться
14. TopZlodey 13 02.04.19 13:16 Сейчас в теме
(13)табличных частей ВладельцаФайла?
15. SedovSU@mail.ru 297 02.04.19 13:33 Сейчас в теме
(14) так давай те вернемся обратно. Вот этот этот код не работает (см ниже)

Хранилище = Выборка.Ссылка.ФайлХранилище.Получить(); 
Если Хранилище <> Неопределено Тогда 
// далее все зависит от типа значений 
Если ТипЗнч(Хранилище) = Тип("ДвоичныеДанные") Тогда 
Хранилище.Записать(ПутьКФайлу) 
Иначе 
// другой метод записи в файл в зависимости от типа значения 
Конецесли


То есть когда Хранилище = Выборка.Ссылка.ФайлХранилище.Получить(); вы получаете тип значения Хранилище - НЕОПРЕДЕЛЕНО. Так ??
16. TopZlodey 13 02.04.19 13:47 Сейчас в теме
(15)Да, значение с типом неопределено
18. SedovSU@mail.ru 297 02.04.19 13:57 Сейчас в теме
(16) вот как пишут в (17) я тоже предполагал что он либо в справочнике файлы или в регистр сведений.
Теперь возьмите открой регистр сведений Двоичные данные и поставьте отбор по тому значению которое храниться у вас в переменной Выборка.Ссылка, если данных нету то возьмите и поставьте отбор по значению в Выборка.Ссылка.ВладелецФайла. Будут данные по какому то отбору??????
19. TopZlodey 13 02.04.19 13:58 Сейчас в теме
20. TopZlodey 13 02.04.19 14:10 Сейчас в теме
(18)
(17)
Получилось достать двоичные данные, но как теперь это перевезти в нормальный вид для использования?
21. SedovSU@mail.ru 297 02.04.19 14:25 Сейчас в теме
(20) вот!!! наконец то мы это получили! Скажите по какому полю получили Выборка.Ссылка?????
22. TopZlodey 13 02.04.19 14:31 Сейчас в теме
(21)нет, тестово пока написал так:
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
| ЭДПрисоединенныеФайлы.Ссылка КАК Ссылка
|ИЗ
| Справочник.ЭДПрисоединенныеФайлы КАК ЭДПрисоединенныеФайлы
|ГДЕ
| ЭДПрисоединенныеФайлы.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",Объект.Реквизит1);
Выборка=Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Хранилище = Выборка.Ссылка.ТекстХранилище.Получить();
Хранилище1 = Выборка.Ссылка.ФайлХранилище.Получить();
Хранилище3 = Выборка.Ссылка.ВладелецФайла;


КонецЦикла;



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

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

Пока ВыборкаРаз.Следующий() Цикл
ПеременнаяОдин=ВыборкаРаз.ДвоичныеДанныеФайла;
Файл = ВыборкаРаз.ДвоичныеДанныеФайла.Получить();

КонецЦикла
23. TopZlodey 13 02.04.19 14:31 Сейчас в теме
(21) Проще говоря Выборка.Ссылка.ВладелецФайла
24. SedovSU@mail.ru 297 02.04.19 14:36 Сейчас в теме
(23) теперь далее вот так

Отбор = Новый Структура("Файл", Выборка.Ссылка.ВладелецФайла);
СтруктураЗаписи = РегистрСведений.ДвоичныеДанныеФайлов.Получить(Отбор);
ДвоичныеДанные = СтруктураЗаписи.ДвоичныеДанныеФайла.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
ДвоичныеДанные.Записать("Тут укажите путь к файлу")
Конецесли


И все должно работать
25. TopZlodey 13 02.04.19 14:41 Сейчас в теме
(24)
Отбор = Новый Структура("Файл", Выборка.Ссылка.ВладелецФайла); СтруктураЗаписи = РегистрСведений.ДвоичныеДанныеФайлов.Получить(Отбор); ДвоичныеДанные = СтруктураЗаписи.ДвоичныеДанныеФайла.Получить(); Если ДвоичныеДанные <> Неопределено Тогда ДвоичныеДанные.Записать("Тут укажите путь к файлу") Конецесли


Не работает, так как не проходит через условие: Если ДвоичныеДанные <> Неопределено Тогда
26. TopZlodey 13 02.04.19 14:44 Сейчас в теме
(24) Мне не нужно сохранять данные файл, мне нужно просто получить данные, чтобы я мог их использовать дальше.
user1480726; +1 Ответить
27. SedovSU@mail.ru 297 02.04.19 14:48 Сейчас в теме
(26) а какие данные то есть если у вас ЭДО - то вы получите файл xml? по другому ни как. Вы какие хотите получить данные?
У вас ДвоичныеДанные = Неопределено или другой какой то тип?
user1480726; +1 Ответить
28. TopZlodey 13 02.04.19 14:50 Сейчас в теме
(27) По факту мне нужна номенклатура из пришедшего документа для заполнения поступления
user1480726; +1 Ответить
29. TopZlodey 13 02.04.19 14:51 Сейчас в теме
(27) Вот что выходит
Прикрепленные файлы:
user1480726; +1 Ответить
30. SedovSU@mail.ru 297 02.04.19 14:54 Сейчас в теме
(29) блин а когда вы вот это сделали

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

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

Пока ВыборкаРаз.Следующий() Цикл 
ПеременнаяОдин=ВыборкаРаз.ДвоичныеДанныеФайла; 
Файл = ВыборкаРаз.ДвоичныеДанныеФайла.Получить(); 
Показать


У вас ведь переменная Файл = ВыборкаРаз.ДвоичныеДанныеФайла.Получить()- не была НЕОПРЕДЕЛЕНО??
user1480726; +1 Ответить
31. TopZlodey 13 02.04.19 14:57 Сейчас в теме
(30)Нет, он ее видит как хранилище значений
user1480726; +1 Ответить
32. TopZlodey 13 02.04.19 15:01 Сейчас в теме
(30) Не правильно сказал, вот как видит
Прикрепленные файлы:
user1480726; +1 Ответить
33. SedovSU@mail.ru 297 02.04.19 15:05 Сейчас в теме
(32) воооооооо оно так и должно выглядеть!!!!! Это тип двоичных данных!!!
Теперь мы его сохраним внешне

Отбор = Новый Структура("Файл", Выборка.Ссылка.ВладелецФайла); 
СтруктураЗаписи = РегистрСведений.ДвоичныеДанныеФайлов.Получить(Отбор); 
ИмяФайла = "C:\1.xml"; // пока временно пут
ДвоичныеДанные = СтруктураЗаписи.ДвоичныеДанныеФайла.Получить(); 
ДвоичныеДанные.Записать(ИмяФайла);


Вот после этого файл получилось создать?? на диске С появился файл?
user1480726; +1 Ответить
34. TopZlodey 13 02.04.19 15:11 Сейчас в теме
(33) Двоичные данные так же неопределено, от того ошибка:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(50)}: Значение не является значением объектного типа (Записать)
ДвоичныеДанные.Записать(ИмяФайла);
35. TopZlodey 13 02.04.19 15:13 Сейчас в теме
(33)у меня получилось записать так:

ПеременнаяОдин=ВыборкаРаз.ДвоичныеДанныеФайла;
Файл = ВыборкаРаз.ДвоичныеДанныеФайла.Получить();
Файл.Записать("D:\Home\mpiskunov\Desktop\скрины и доки\тестоваяпапка\1.xml");
36. TopZlodey 13 02.04.19 15:15 Сейчас в теме
(33) но все остается вопрос: как прочитать эти данные чтобы использовать
38. D_e_X_T_e_R 573 02.04.19 15:24 Сейчас в теме
(36)что-то вроде того:
Функция ДеСериализоватьОбъект(СтрокаXML)
	
	ЧтениеXML = Новый ЧтениеXML();
	ЧтениеXML.УстановитьСтроку(СтрокаXML);
	
	Попытка
		Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);	
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	Возврат Значение;
	
КонецФункции
Показать
37. D_e_X_T_e_R 573 02.04.19 15:21 Сейчас в теме
(24)Выборка.Ссылка.ВладелецФайла - точно попадает нужное значение?
По идее данные попадут в переменную ДвоичныеДанные, но правильно говорят, что там будет скорее всего xml формат, его еще нужно сериализовать будет, чтобы на основании него поступления заполнять.
39. TopZlodey 13 02.04.19 15:38 Сейчас в теме
(37) Да, делаю в запросе условия по нему и получаю двоичные данные, сейчас попробую сериализовать
40. SedovSU@mail.ru 297 03.04.19 06:11 Сейчас в теме
(39) для сериализации можно так сделать

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("D:\Home\mpiskunov\Desktop\скрины и доки\тестоваяпапка\1.xml");
ФабрикаXDTOФайлаXML = Новый ФабрикаXDTO;
ОбъектXDTO = ФабрикаXDTOФайлаXML.ПрочитатьXML(ЧтениеXML);


Переменная ОбъектXDTO содержит структуру вашего xml файла с которой очень удобно работать. Далее обращаетесь к элементам XDTO читаете нужные данные
41. TopZlodey 13 03.04.19 07:21 Сейчас в теме
(40)
ФабрикаXDTOФайлаXML = Новый ФабрикаXDTO; ОбъектXDTO = ФабрикаXDTOФайлаXML.ПрочитатьXML(ЧтениеXML);


Таким образом он у меня достает только вот такие данные:
Прикрепленные файлы:
42. SedovSU@mail.ru 297 03.04.19 07:37 Сейчас в теме
(41) а если открыть сам файл D:\Home\mpiskunov\Desktop\скрины и доки\тестоваяпапка\1.xml вы в нем видите гораздо больше структуры?
43. TopZlodey 13 03.04.19 07:54 Сейчас в теме
(42) Ну да, как и внутри, только тогда не могу понять откуда взять данные номенклатуры, они ведь туда попадают и как раз из этого файла создается ПФ УПД.
44. SedovSU@mail.ru 297 03.04.19 08:54 Сейчас в теме +0.8 $m
(43) тот объект который вы получили это всего лишь файл относящийся к служебным документам: подтверждение получения, извещения о получении. Это не файл структуру самого документа который нужен
45. TopZlodey 13 03.04.19 09:22 Сейчас в теме
(44) Понятно, значит буду искать который нужен)
46. SedovSU@mail.ru 297 03.04.19 10:38 Сейчас в теме
(45) на самомо деле почти все готово, нужно только вот все таки посмотреть где именно тот файл храниться. А лучше всего посмотреть код когда вы открываете электронный документ и тогда станит ясно откуда все берется и как заполняется!
47. TopZlodey 13 03.04.19 10:40 Сейчас в теме
(46) Да, это я понимаю, самое что интересное обращается и тянет он данные из того справочника о котором я говорил. Но как сами знаете файла мы там не нашли. Но еще поищу.
48. SedovSU@mail.ru 297 04.04.19 09:33 Сейчас в теме
(47) ну поскольку у вас все получилось. вот без сохранения файла можно так все прочитать, вот в (38) верно помог в этом

ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные); // тут указываете ваши двоичные данные из регистра
СтрокаXML = ЧтениеДанных.ПрочитатьСимволы(, КодировкаТекста.ANSI);
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(СтрокаXML);

Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Idris1204; +1 Ответить
17. D_e_X_T_e_R 573 02.04.19 13:53 Сейчас в теме +0.53 $m
В общем отследил как он сохраняет файл, на примере ERP, справочник номенклатура. Файл можно достать так:

Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ 
		|	ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла
		|ИЗ
		|	РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
		|ГДЕ
		|	ДвоичныеДанныеФайлов.Файл.ВладелецФайла = &ВладелецФайла";
	
	Запрос.УстановитьПараметр("ВладелецФайла", Справочники.Номенклатура.НайтиПоКоду("00-00000293"));
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Файл = ВыборкаДетальныеЗаписи.ДвоичныеДанныеФайла.Получить();
		Файл.Записать("C:\Users\shtennikov\Desktop\1111.jpg");
	КонецЦикла;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот