Имя: Пароль:
1C
1С v8
Передача хранилища значения по веб сервису в стороннюю программу
0 maxipunchik
 
16.04.20
09:04
Как принять данные типа ХранилищеЗначения в другой программе, например, написанной на c#. Передаю xml в хранилище. Возвращает байты и из них не конвертируется в строку. Ромбики с вопросиками выдает.
1 ДенисЧ
 
16.04.20
09:21
А как твоя программа вообще поймёт внутренний формат 1с?
2 fisher
 
16.04.20
09:22
> Передаю xml в хранилище.
https://youtu.be/2RhvJ4VY6Cg
3 Василий Алибабаевич
 
16.04.20
09:38
(0) "Возвращает байты и из них не конвертируется в строку."
Что-то вы как-то не туда...
Сериализованное значение из хранилища и есть строка.
4 dezss
 
16.04.20
09:55
Лучше получить из хранилища и сериализовать в какой-нить json или xml.
5 maxipunchik
 
16.04.20
10:20
(1) Вот в этом и вопрос. 1с пишет, что хранилище сериализуется, может и обработать как-то можно
6 ДенисЧ
 
16.04.20
10:21
(5) А зачем именно ХЗ передать? Может, взять из него значение и уже нормально передать?
7 maxipunchik
 
16.04.20
10:21
(3) ну вот, возвращаемое значение имеет тип byte[]
8 maxipunchik
 
16.04.20
10:22
Скорее всего через зип сжимать придется, но было бы неплохо как-то с хранилищем решить
9 Василий Алибабаевич
 
16.04.20
10:24
(7) "Передаю xml в хранилище."
Не нужно этого делать. Передавай xml как xml. Для уменьшения трафика можно попытаться запаковать. Но уж точно конвертировать xml в хранилище незачем.
10 fisher
 
16.04.20
10:24
(8) Если вопрос со сжатием xml, то через архивирование и надо решать, а не добавлять во внешнюю программу обработку одинэсной сериализации.
11 maxipunchik
 
16.04.20
10:26
(6) через зип можно. Кстати, сама 1с обмен в веб сервисе enterprice реализовала через зип. Просто есть мобильное приложение на 1с, там через хранилище передается. Чтобы 1 веб сервис для разных приложений (1с и не 1с) использовать, появилась потребность через хранилище сделать
12 maxipunchik
 
16.04.20
10:27
(9) это стандартный способ, описанный в желтой книге по моб приложению, поэтому этот метод и используется
13 Василий Алибабаевич
 
16.04.20
10:29
(7) "byte[]" это и есть строка. Не совсем строка правда, а массив байт.
(11) "Сама 1С" при отправке делает так :
Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9));
а на принимающей стороне :
ДанныеОбмена = Имярек.Получить();
Ваша стороння программа на решетках сделает также?
14 fisher
 
16.04.20
10:29
(11) > Чтобы 1 веб сервис для разных приложений (1с и не 1с) использовать, появилась потребность через хранилище сделать
Странная логика. Обычно мыслят в сторону использования средств, стандартных для разных приложений. Я не вкручивать специфику одного из них во все остальные.
15 Fragster
 
гуру
16.04.20
10:31
для сжатия проще настроить на веб сервере прозрачный gzip/deflate, а передавать именно строку
16 fisher
 
16.04.20
10:32
(13) Да ничего сложного, думаю, расковырять это на решетках. Только минусов у такого решения будет гораздо больше, чем плюсов.
17 fisher
 
16.04.20
10:33
(15) А это все клиенты/библиотеки поддерживают? 1С тоже будет прозрачно зиповать при отсылке?
18 Василий Алибабаевич
 
16.04.20
10:46
(16) "ничего сложного, думаю, расковырять это на решетках."
Несколько вопросов
1. Знать как указано что там внутри. Именно как указано (смещение, длина, значение). Хорошо, что у ТС это ИМХО всегда строка. И можно все сделать наосЧупь. Но описания я не встречал.
2. Это придется делать на стороне решеток.
3. ЗаДляНафига это все?
19 Fragster
 
гуру
16.04.20
11:05
(17) зиповать будет веб сервер
20 Fragster
 
гуру
16.04.20
11:07
кстати, если кто не знал - есть офигенный модуль для 1с: https://github.com/vbondarevsky/Connector
почти без проблем :)
21 fisher
 
16.04.20
11:10
(19) Как веб-сервер может зиповать то, что ему ОТПРАВЛЯЮТ?
22 fisher
 
16.04.20
11:12
Это раз. Во вторых, клиент должен уметь понять и прозрачно разархивировать то, что он от веб-сервера получил. Я небольшой спец, но в здравый смысл немного умею. И он мне подсказывает - чтобы это работало, этот режим должны поддерживать обе стороны.
23 Fragster
 
гуру
16.04.20
11:13
(21) отправляет веб сервер - ИИС или апач.
24 Fragster
 
гуру
16.04.20
11:14
(24)+ если же 1с не сервер, а клиент (сама посылает запрос), то зиповать должна она, это умеет (20). Примерно как браузер.
25 maxipunchik
 
16.04.20
11:15
(14) логика проста. Есть решение с хранилищем значения, есть желание узнать а можно ли это хранилище распарсить на C#. Переделывать на zip изначально желания не было. В интернете на итс нет никакой информации по valuestorage. Нет ни одной рекомендации. И вот это вот всё
26 Fragster
 
гуру
16.04.20
11:18
(25) просто кто-то не умеет пользоваться интернетом. вот тут достаточно информации для расковыривания: http://catalog.mista.ru/public/1050764/
27 maxipunchik
 
16.04.20
11:32
(26) нереальный геморрой, еще и так
4) Распаковать ZIP архив, игнорируя ошибки распаковки (так как у нас нет данных о CRC сумме НЕ запакованных данных, а так же об их размере)

// Можно было и в памяти извлекать, но слишком много памяти кушает
Архив = Новый ЧтениеZipФайла(ПутьКФайлуАрхива);
Попытка
    Архив.Извлечь(Архив.Элементы[0], КаталогОбмена);
    //файл извлечется, хотя здесь возникнет исключение из-за некорректных размера файла и контрольной суммы
Исключение
КонецПопытки;


Нужен нормальный метод. Зип в одну строку распаковывается
28 fisher
 
16.04.20
11:44
(24) Я прекрасно понимаю, что паковать должна отправляющая сторона. А принимающая должна распаковывать. Поэтому и задал вопрос. И вопрос этот был - поддерживает ли этот режим одинэсное HTTPСоединение(), например.
Потому что если нет - то совет был мимо.
29 Fragster
 
гуру
16.04.20
12:13
(28) если принимающая сторона - это публикация 1с на веб сервере - то поддерживает, если 1с - это клиент, то надо все самому реализовывать (как и все остальное типа передачи заголовков, формирования мультипарт, обработки перенаправлений и прочего). Ну, или использовать готовое, см. (20)
30 craxx
 
16.04.20
23:35
(0) А сразу xml как строку передавать не судьба?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший