Имя: Пароль:
1C
1С v8
Самый быстрый способ обмена данными с программой .exe?
0 manking
 
14.11.15
08:25
Добрый день.
Есть exe программа, из 1С сервер туда нужно передать 200mb данных, там посчитать и вернуть в 1с. Какой самый быстрый способ это сделать?
1 Горогуля
 
14.11.15
08:27
Новый ИнтернетПочта
2 Провинциальный 1сник
 
14.11.15
08:27
Зависит от этой exe-программы, что она может. Очевидно.
3 ДенисЧ
 
14.11.15
08:29
Тот, который поддерживает эта программа.
4 manking
 
14.11.15
08:57
Ну так я и хочу узнать какой способ самый быстрый и надежный.

1) Запустить exe с параметрами через ЗапуститьПриложение(), дождаться завершения, получить правильный код и прочитать файл data.txt который она запишет.
2) Сделать exe в виде службы или сервера и общаться с ней через сокеты или как то так
https://ru.wikipedia.org/wiki/Межпроцессное_взаимодействие
Но непонятно что поддерживает из этого 1С.
3) 1C и exe пишут и читают данные в-из сторонней субд.

Например есть ли ограничения на размер-длину параметров cmd и функции ЗапуститьПриложение()?
При межпроцессорном обмене гарантия 100%, что не будет сбоя, или там нет гарантии доставки как и в udp протоколе?
5 spectre1978
 
14.11.15
08:57
(0) а вам с какой целью? Программа EXE существует "как данность" или она разрабатывается и вы хотите дать разработчику техзадание на экспорт-импорт?
6 Mikeware
 
14.11.15
08:59
Азбука морзе...
7 Горогуля
 
14.11.15
09:03
(5) серьёзно? человек, так ставящий вопрос собирается давать техзадание?
8 spectre1978
 
14.11.15
09:03
(4) Если нужен разовый обмен - пихнул данные, получил ответ - то я бы рассмотрел обмен на файлах TXT, XML, DBF или через стороннюю СУБД (в случае если данные сложные и сильно структурированные). Если нужно обмениваться постоянно, прерывать и начинать заново - тогда сокеты.
9 spectre1978
 
14.11.15
09:04
(7) судя по (4), похоже что да.
10 ДенисЧ
 
14.11.15
09:35
(9) Пропал Калабуховский дом...
11 manking
 
14.11.15
09:35
(8) Программа уже есть на с++. Там есть std::vector, std::map данные, которые нужно передать.

Допустим самый простой способ это периодически смотреть на статус обновления файла data_in.txt и data_out.txt, если время поменялось то можно прочитать и записывать.

А как быть с сериализацией? Например std::vector соответствует по функциональности Массив, std::map - типу Соответствие.
Как это сделать? Писать самописный парсер или есть четкий стандарт такого обмена?
12 ДенисЧ
 
14.11.15
09:36
(11) Стандарты-то есть...
Но тебе же нужен самый быстрый?
Так вот... Все совместимые стандарты - медленные.
13 manking
 
14.11.15
09:48
(12) Оптимальный по соотношению скорость-надежность-удобство.
А какие стандарты? Где про это почитать?
14 ДенисЧ
 
14.11.15
09:54
(13) Почитать - в интернете )))
Всякие json, xml и прочие дьявольские изобретения.
15 manking
 
14.11.15
10:13
(14) Хорошо, спасибо.
Json кажется самый оптимальный вариант с записью и чтением из файла.
16 H A D G E H O G s
 
14.11.15
11:39
Самый быстрый транспорт - именованный канал. Тут все будет упираться в сериализацию
17 Serginio1
 
14.11.15
11:40
18 Serginio1
 
14.11.15
11:42
(15) Есть еще более компактный и быстрый формат ProtoBuf
http://habrahabr.ru/post/119503/
19 Garykom
 
гуру
14.11.15
11:52
тема на день опоздала, очень пятничная

http://habrahabr.ru/post/191014/
20 Garykom
 
гуру
14.11.15
11:52
21 Serginio1
 
14.11.15
12:06
22 ДенисЧ
 
14.11.15
12:08
(18) (21) дот.нет не нужен. От слова совсем.
23 Кирпич
 
14.11.15
12:17
Тупо через файл. Вы чо мудрите? :) пайпы, .net :)) вы чо пьяные чтоли
24 Jump
 
14.11.15
12:22
(0) Вы сначала огласите список возможных, а потом уже выбирайте самый быстрый.
Какие способы взаимодействия поддерживает ваша программа?

Вполне возможно что самый быстрый это набрать данные на клавиатуре, и потом прочитать их с видеопамяти.
25 Serginio1
 
14.11.15
12:34
(23) Кстати именованные каналы и есть файлы
https://ru.wikipedia.org/wiki/Именованный_канал

К именованному каналу можно обращаться в значительной степени как к файлу. Можно использовать функции Windows API CreateFile, CloseHandle, ReadFile, WriteFile, чтобы открывать и закрывать канал, выполнять чтение и запись. Функции стандартной библиотеки Си, такие, как fopen, fread, fwrite и fclose, тоже можно использовать, в отличие от сокетов Windows (англ.), которые не реализуют использование стандартных файловых операций в сети

Проблема файлов это скорость записи и чтения. Пайпы намного быстрее
http://stackoverflow.com/questions/6977561/pipe-vs-temporary-file
26 Кирпич
 
14.11.15
13:37
(25) я имею ввиду файл на диске. Мне мне пофигу, что там еще называют файлом, пайпы или компорты. В 1с нет пайпов, а файлы есть. Поэтому и файлы.
27 Serginio1
 
14.11.15
14:12
(26) В 1С много чего нет. Но это не значит, что нельзя использовать пайпы. Вопрос самый быстрый обмен ответ named pipes или memory-mapped files
28 Garykom
 
гуру
14.11.15
14:20
(27) гм а каким образом из 1С проще заставить файл сделать/оставить в памяти?
29 Garykom
 
гуру
14.11.15
14:25
(28)+ в смысле можно ли без ВК обойтись?
30 Serginio1
 
14.11.15
14:27
(29) Есть Com объекты.
31 Serginio1
 
14.11.15
14:28
На вэб клиенте есть JavaScript
32 Garykom
 
гуру
14.11.15
14:29
(30) а если и без COM объектов?

просто ЗаписьФайла ? а остальное делает ОС или драйвер/программа в ней?
33 Кирпич
 
14.11.15
14:33
(27) один хрен выгружать из 1с будет полчаса, хоть в пайп хоть не в файл на диске. Так то не важно откуда будет exe читать данные разница в 5 секунд ничего не решает.
34 vde69
 
14.11.15
14:33
самый быстрый способ это публикуемый в память файл, работа из ехе с ним будет по скорости как прямое обращение к памяти.

единственная проблема - это недоступность чужого адресного пространства,

по этому нужно писать ВК и работать непосредственно в памяти 1с, вызовы по факту будут оперировать только адресами данных а не самими данными...

попробуй посмотреть как работают всякие телепаты/снегопаты/защиты в 1с
35 Кирпич
 
14.11.15
14:44
(34) ты 200 мегабайт из 1с сколько времени будешь выгружать в свю ВК? Мне кажется, что вопрос о пайпах, шаремемах и файлах на диске здесь самый последний. Прочитать в exe файл в 200 мегов за 20 секунд или прочитать из шаремем за 5 после выгрузки из 1с длиной в полчаса... Мне вот как то пофиг. Я бы не стал из за этого внешние компоненты городить.
36 Garykom
 
гуру
14.11.15
14:46
(35) нене, он говорит вк отдает адреса в памяти где сама 1С данные хранит
и уже exe читает данные напрямую из памяти из мозгов 1С так сказать ))
37 Кирпич
 
14.11.15
14:49
(36) ну 1с же должна эти данные создать. А их 200 мегабайт. Попробуй в 1с сгенерить какой нибудь xml в 200 мегов. Это же тихий ужас.
38 Garykom
 
гуру
14.11.15
14:49
(36) т.е. к примеру 1С выполнила запрос, его результаты хранятся в ТЗ в памяти
с помощью ВК отдаем адрес где лежит в памяти эта ТЗ и формат хранения в ней данных стороннему exe

дальше exe напрямую читает и разбирает данные
39 Garykom
 
гуру
14.11.15
14:50
(37)+ не путай 200 метров и 200 метров XML'я ))

там проблема то в DOMе
40 Кирпич
 
14.11.15
14:53
(39) ну просто текст пускай будет. Все равно тормоза. А в (38) нафига вобще exe если все сделать сразу в ВК можно.
41 Garykom
 
гуру
14.11.15
14:57
(40) ну можно и в обратную сторону, но один фиг операции с чужим адресным пространством

ВК пулачает адрес куда записать данные в exe )) и берет их их памяти 1С и пишет в память exe

но если exe читает оно сразу может преобразовать в свой формат при чтении, а тут exe еще придется уже в своей памяти снова читать и преобразовывать
хотя и ВК это может делать
42 mistеr
 
14.11.15
15:09
(0) Всем похоже пофиг, а я спрошу. Откуда берутся эти 200 Мб данных (из базы?) и что потом происходит с результатом? И что делает программа.
43 Garykom
 
гуру
14.11.15
15:10
(42) на какое то шифрование похоже ))
или быстрая обработка для чего то
44 Serginio1
 
14.11.15
15:17
45 Кирпич
 
14.11.15
15:31
(44) Ну мы уже давно поняли, что надо все делать через NET.
46 Garykom
 
гуру
14.11.15
15:40
еще бы moonlight не накрылся было бы вообще сдорово
47 Serginio1
 
14.11.15
15:50
(45) Не обязательно. Просто прямой доступ.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс