Имя: Пароль:
1C
 
Обмен данными между 1С и java
0 Garykom
 
гуру
18.12.15
19:02
Нужно передавать двумерные массивы (в строках ячейки).

Каким образом это лучше сделать и было относительно быстро?

Под любые платформы 1С начиная с 7.7 и в т.ч. 8.3 под linux (ComSafeArray отпадает).

Еще как то минимизировать затраты на сериализацию/десериализацию.
1 Garykom
 
гуру
18.12.15
19:05
(0) *Нужно передавать двумерные массивы (в ячейках строки)
2 trdm
 
18.12.15
19:07
А данные то какого типа?
Может через файл? SQLite с транзакцией?
3 Garykom
 
гуру
18.12.15
19:09
(2) данные типа "лист ексель" с разными строками/числовыми/даты в ячейках
строки до 300 символов, в среднем 50-100
4 Garykom
 
гуру
18.12.15
19:09
(3)+ количество строк возможно до 10-20к, количество колонок до 100
5 Necessitudo
 
18.12.15
19:12
Ну web-сервис конечно
6 Garykom
 
гуру
18.12.15
19:12
(2) да через файл простейшее, но "не красиво"

использовать любую внешнюю БД (к которой имеет доступ и 1С и java) можно, но затраты на сериализацию
7 mehfk
 
18.12.15
19:13
json
8 Garykom
 
гуру
18.12.15
19:13
(5) советую попробовать из 1С 7.7 послать на веб сервис "большую табличку"
9 trdm
 
18.12.15
19:13
(6) Тогда только сетевые технологии. Сокеты к примеру.
Даже в 7-ке была компонента.
10 Garykom
 
гуру
18.12.15
19:14
(7) это как бы формат, как в этот формат туды/сюды и потом обернуть (во что) и тоже туды/сюды?
11 Garykom
 
гуру
18.12.15
19:14
(9) да думал, даже делал 1С 7.7 - C#
через netainet или как то так, но сериализация будь она неладна
12 Garykom
 
гуру
18.12.15
19:16
т.е. если бы как то массив/таблицу значений 1С можно было очень шустро в строку длинную сконвертить и потом назад
13 trdm
 
18.12.15
19:16
Разделяемая память :))))
https://ru.wikipedia.org/wiki/Разделяемая_память

http://doc.qt.io/qt-4.8/qsharedmemory.html

На винде можно в актив-ха завернуть и пользоваться ))))))
14 Garykom
 
гуру
18.12.15
19:17
(13) проблема в java ((

какую то промежутку на чем то?
15 Garykom
 
гуру
18.12.15
19:23
ладно сначала попробую поиграться с ЗначениеВСтрокуВнутр(Массив) и посмотрю
16 Garykom
 
гуру
18.12.15
19:34
Кинуть кто нибудь на разбор/описание внутреннего формата псоле ЗначениеВСтрокуВнутр(ТаблицаЗначений) ссылку может?
17 Лефмихалыч
 
18.12.15
19:58
xml или json
зачем изобретать велосипеды?
18 EvgeniuXP
 
18.12.15
20:28
7.7 не может длинные xml строку передать/принять - там ограничение самой переменной Знач Строка...
19 EvgeniuXP
 
18.12.15
20:29
Мобильные приложения (Гилев) смотри там ТЗ кидают в хмл - аналогично делать можно и на 7.7, или вручную - шаблон будет можно и вручную - не помню уже, давно делал.
20 EvgeniuXP
 
18.12.15
20:30
в бесплатных было рассказано подробно.
21 Garykom
 
гуру
18.12.15
21:11
(18) да про это в курсе, ну значит будем медленно и печально ))
22 Serginio1
 
18.12.15
21:21
(8) Сожми зипом. Я в своих обменах сжимаю данные. И 1С при обменах тоже использует ХранилищеЗначения со сжатием
23 Serginio1
 
18.12.15
21:25
Кстати если на одной машине то пайпы самое то. Тоже использовал. Удобно NetNamedPipeBinding
http://dotnetmentors.com/wcf-by-example-on-netnamedpipebinding.aspx
24 Garykom
 
гуру
18.12.15
21:28
(22) проблема не zip'ах а в сериализации долгой, этож циклы по колонкам/строкам
25 Garykom
 
гуру
18.12.15
21:30
(24)+ хотелось бы просто отдать куда указатель на область памяти )) с длиной, и пусть там оно само читает и разбирает

ну или какой то быстрый способ преобразовать ТЗ в файл к примеру
26 Serginio1
 
18.12.15
21:40
Если на компилируемом языке то все быстро.
Просто ты хочешь универсальности, а она всегда будет уступать специализации. Кстати а на 7.7 какой нафиг линукс.
Линукс это ССЗБ.
27 Garykom
 
гуру
18.12.15
21:49
(26) для 7.7 можно без linux ))
28 Serginio1
 
18.12.15
21:59
Ну тогда ВК или Automation объект (IDispatch).
На семерке в параметрах Com объекта 1С овские объекты не передать. Но можно использовать ВК обертку http://catalog.mista.ru/public/345658/

Кроме того можно использовать диспинтерфейсы 1С объектов. DispId у них не меняются.
Ну сериализуешь в то, что удобнее. Например protobuf
http://habrahabr.ru/post/119503/
29 Garykom
 
гуру
18.12.15
22:02
(28) разные ВК придется делать под разные платформы
30 Serginio1
 
18.12.15
22:46
(29) Ну и ТаблицыЗначений разные. Еще раз необязательно ВК делать. Достаточно Automation объект
31 EugeniaK
 
18.12.15
23:51
(0) JSON или XML
Строкой или файлом в зависимости от объема.
32 trdm
 
19.12.15
19:06
может стоит выдергуть из 2С алгоритмы сериализации/десериализации?
33 Garykom
 
гуру
19.12.15
19:27
(32) оно уже давно того и даже ссылки не пашут

да и не факт что в 8.Х тоже самое
35 trdm
 
19.12.15
20:03
(33) Все на месте.
void CValue::SaveToString(CString &Str)
{
    switch(nType)
    {
        case TYPE_NUMBER:
            {
                NUMBER f=GetNumber();
                if(f==int(f))
                    Str.Format("{1/%d}",int(f));
                else
                    Str.Format("{1/%f}",f);
                return;
            }
        case TYPE_STRING:

            Str=GetString();

            ReplaceBySave(Str);

            Str=CString("{2/")+Str+"}";

            return;
        case TYPE_DATE:
            Str.Format("{3/%d}",GetDate());
            return;
        case TYPE_REFFER:
            pRef->SaveToString(Str);
            return;
        break;
    };
    Str="{0/0}";
}
void CValue::LoadFromString(CString &Str)
{
    Reset();

    if(Str.GetLength()==0)
        return;
    if(Str.GetAt(0)!='{')
        return;

    int nIndex1=Str.Find("/");
    if(nIndex1>1)
    {
        CString csType=Str.Mid(1,nIndex1-1);
        int nDataType=atoi(csType);
        if(nDataType==0&&nIndex1>2)
        {
            CValue::CreateObject(csType);
            pRef->LoadFromString(Str);
            return;
        }
        nType=nDataType;

        int nIndex2=Str.Find("}");
        CString csValue=Str.Mid(nIndex1+1,nIndex2-nIndex1-1);
        switch(nType)
        {
            case TYPE_NUMBER:
                fData=atof(csValue);
                return;
            case TYPE_STRING:
                sData=csValue;
                ReplaceByLoad(sData);
                return;
            case TYPE_DATE:
                dData=atoi(csValue);
                return;
            case TYPE_ARRAY:
                {
                    CValue::CreateObject("Массив");
                    pRef->LoadFromString(Str);
                    return;
                }
            default:
                nType=TYPE_EMPTY;
        };
    }
}
36 trdm
 
19.12.15
20:09
37 mikeA
 
19.12.15
21:16
(0) как там в 7.7 хз, в 8.3 можно попробовать вместо таблицы значений использовать массив структур и его целиком сериализовать через ЗаписьJSON

тз= Новый Массив;

тз.Добавить(Новый Структура("х,хх", 1, "2"));

ЗаписьJSON= Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, тз);

Сообщить(ЗаписьJSON.Закрыть());
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.