Имя: Пароль:
1C
1С v8
Расширение возможностей 1С за счет других языков программирования. Java
0 Uberschall
 
28.10.19
12:01
Всем привет. Попалась мне задача: нужно организовать интерактивное взаимодействие между двумя клиентами 1с двух разных баз (базы расположены на разных серверах). Моя идея- сделать веб/хттп сервер на каждом из взаимодействующих клиентов с помощью com-компоненты. И вот вопрос по поводу написание com-компоненты на Java. На C++/C# примеров много, в т.ч. и на этом ресурсе, а по Java так дельного ничего и не смог найти. Может есть у кого-нибудь опыт написания компонент на java для 1с? Чтобы понять куда копать. Не смотря на то, что на C# эту задачу, мне кажется, было бы проще решить, java выбрал еще из-за возможности написания мобильных приложений, которые тоже могли бы взаимодействовать с 1С.
1 quest
 
28.10.19
12:02
JNI - интерфейс для работы с java из С++
2 Uberschall
 
28.10.19
12:03
ну это совсем как-то через ж... т.е. помимо знания java (которое тоже надо подтянуть), надо будет вспомнить/открыть заново C++
3 Garykom
 
гуру
28.10.19
12:06
(0) 1. Есть на ИС
2. Выкинь нафуй эту идею ибо не надо
3.1. Подними апач/iis в одной из базе
3.2. Подними сторонний сервис и две (и более) баз пусть через него обменияваются
4 NorthWind
 
28.10.19
12:06
(0) мне кажется, неправильно выбрали. С/С++ либо .Net.
5 Garikk
 
28.10.19
12:07
com компоненты в 2019 году...при этом на яве....нда
6 quest
 
28.10.19
12:08
(0) не слушай ты их. Грызи этот кактус. Он прикольный :)
7 Uberschall
 
28.10.19
12:10
(4) да, я согласен что с C#/C++ было бы проще, но на java мне кажется больше сфер (за счет мобильной разработки)
(5) варианты?
(3)  можно ссылку на ИС?
веб-сервер я могу поднять, но тогда будет межсерверное взаимодействие, а мне надо чтобы данные сразу передавались между клиентами
8 Garikk
 
28.10.19
12:18
(7) что варианты? вебсервисы уже тыщу лет как завезли в платформу
9 Garikk
 
28.10.19
12:19
также ваш вариант однозначно ставит крест на использовании в линуксовых базах
10 Uberschall
 
28.10.19
12:20
(8) у веб-сервиса своей сеанс. он может обмениваться информацией только с сервером 1с, но никак не с клиентом. т.е. грубо говоря на форме никак не сделать свой веб-сервис.
11 Garikk
 
28.10.19
12:21
(10) зачем на _форме_ веб-сервис?
12 Garikk
 
28.10.19
12:21
надо делать архитектурно-правильно, а не придумывать какуюто дичь
13 Garykom
 
гуру
28.10.19
12:23
(12) Архитектурно правильно это на каждую задачу нанимать специалиста уже умеющего выполнять такие задачи.
А не падавана и пусть сам разбирается как пилить, тренируется на клиентах.
14 Garikk
 
28.10.19
12:25
(13) ну это другой вопрос
но тут учитывая что товарищ хочет заюзать ком и примерно понимает что делает, это явно олдстайл клюшечник живущий лет 15 назад и попавший в будущее... тут или надо направить в сторону изучения нового или в сторону кладбища
15 Asmody
 
28.10.19
12:25
Даже если очень хочется пороть дичь, нужно делать это правильно. Для 1С будет правильно сделать native api ВК
16 Garykom
 
гуру
28.10.19
12:26
(7) >можно ссылку на ИС?
Статья с ИС куда то сделала ноги, там такое бывает
17 Uberschall
 
28.10.19
12:27
(12) ну так поэтому я вкратце и описал задачу-интерактивное взаимодействие (с минимальной задержкой) между двумя клиентскими сеансами (в контексте #Если Клиент) разных 1с минуя их сервера.
(15) действительно, возможно, тут я ошибаюсь и нужно не com, a native.
18 quest
 
28.10.19
12:29
(17) ковыряй инфостарт - там как раз недавно быkа компjнента для взаимодействия через tcp/udp
19 Garykom
 
гуру
28.10.19
12:29
(17) ВК для 1С (Native) проще всего делать на Delphi/Lazarus.
Вот обычные COM можно и C#/.Net.

Делать это на C++ задолбаешься. Короче забей и используй веб-сервисы.
20 Garykom
 
гуру
28.10.19
12:30
Или готовую ВК используй, вроде видел ВК - http сервер на C++
21 Uberschall
 
28.10.19
12:32
я пока оставил как запасной вариант C#- на ИС был очень хороший простой пример написания компоненты. Но пока еще собираю информацию по Java.
22 Garikk
 
28.10.19
12:35
вобщем смысла нет на яве делать нетиповые вещи, несмотря на "распространённость явы" - в ней очень много чего не хватает и ещё больше 'старый язык и есть библиотеки для всего всего' --- 80% такого заброшено лет 10 назад и не поддерживается
23 Garikk
 
28.10.19
12:37
*я вот например пытаюсь через яву с bluetooth работать...это пипец какойто всё для этого умерло от 10 до 3х лет назад

а вы com хотите
24 Uberschall
 
28.10.19
12:39
(22) мне казалось с явы будет проще перейти в тот же kotlin
25 Garikk
 
28.10.19
12:46
(24) тут нет особой разницы, если нет нормальных либ для явы, их не будет и для котлина
26 hockeyist
 
28.10.19
12:52
(0) Берешь код на C и переписываешь на Java. Задача для школьника 3-го класса.
27 bolero
 
28.10.19
12:58
(0) JNI для такой задачи - оверкилл, он предназначен для взаимодействия с оборудованием, а не с некрасивыми программами
ты себя берешь и на ровном месте ограничиваешь местной операционкой и набором библиотек

COM отбрасывай по той же причине - ограничиваешь себя

у меня в похожей ситуации внешняя по отношению к 1с система ходит в базы 1С по OData и для записи, и для чтения, а для получения больших или мудреных объемов данных многие операции переделаны на прямой SQL
28 palsergeich
 
28.10.19
12:59
Гугли Розовый Кролик
29 palsergeich
 
28.10.19
13:00
Чорт я имел ввиду не то что Гугл выдает, а https://github.com/BITERP/PinkRabbitMQ
30 palsergeich
 
28.10.19
13:01
Шина + нативная ВК для 1с
31 Garykom
 
гуру
28.10.19
13:03
(29) (30) Для двух баз избыточное и стороннее проприетарное решение, нафуй.
32 Uberschall
 
28.10.19
13:05
(31) про рэббита уже думал. но по этой же причине отклонил
33 palsergeich
 
28.10.19
13:05
(31) Из условия задачи читается что должны оповещатьсяиклиенты 2 х баз, а это не равно общение 2х баз
34 palsergeich
 
28.10.19
13:06
(32) На ИС была компонента с исходниками - tcp сервер который дёргает через внешнее событие клиента
35 palsergeich
 
28.10.19
13:07
Сквозной пример как раз чатик между базами
36 Uberschall
 
28.10.19
13:07
(27) "у меня в похожей ситуации внешняя по отношению к 1с система ходит в базы 1С по OData и для записи, и для чтения, а для получения больших или мудреных объемов данных многие операции переделаны на прямой SQL" это взаимодействие с сервером. Odata не дает доступа к клиентскому сеансу
(34) вот это очень близко
37 Garykom
 
гуру
28.10.19
13:09
(36) Блин подними апач с простейшим скриптом на чем угодно и обе базы по http смогут обмениваться
38 palsergeich
 
28.10.19
13:10
(37) да, но это сервер<=>сервер, если надо клиент клиент то не очень
39 Uberschall
 
28.10.19
13:11
(37) не правильно это будет! веб/http сервер не имеет доступа к клиентскому сеансу. выше я писал что по условию необходимо интерактивное взаимодействие клиентских сеансов минуя сервера
40 Garykom
 
гуру
28.10.19
13:13
(38) Это как раз клиент-клиент через сервер
клиент (1С) <=> сервер (апач или что угодно) <=> клиент (1С)

Моя вот такую хрень на Go наваял для обмена файликами между МП 1С и базой 1С:


package main

import (
    //    "database/sql"
    "encoding/json"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/gorilla/mux"
    //"github.com/jmoiron/sqlx"
    "log"
    //"math/rand"
    "net/http"
    //b "rest/entities"
    //"strconv"
    "bufio"
    "github.com/sethvargo/go-password/password"
    "io/ioutil"
    "os"
    "path/filepath"
)

type ID struct {
    ID string `db:"id"`
}

func getSolt(long, digits, symbols int, noUpper, allowRepeat bool) string {
    // Generate a password that is 64 characters long with 10 digits, 10 symbols,
    // allowing upper and lower case letters, disallowing repeat characters.
    result, err := password.Generate(long, digits, symbols, noUpper, allowRepeat)
    if err != nil {
        fmt.Println(err)
    }
    return result
}

// readLines reads a whole file into memory
// and returns a slice of its lines.
func ReadLines(path string) ([]string, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    var lines []string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        lines = append(lines, scanner.Text())
    }
    return lines, scanner.Err()
}

// writeLines writes the lines to the given file.
func WriteLines(lines []string, path string) error {
    file, err := os.Create(path)
    if err != nil {
        return err
    }
    defer file.Close()

    w := bufio.NewWriter(file)
    for _, line := range lines {
        fmt.Fprintln(w, line)
    }
    return w.Flush()
}

func getDir() string {
    ex, err := os.Executable()
    if err != nil {
        fmt.Println(err)
    }
    exPath := filepath.Dir(ex)
    //fmt.Println(exPath)
    return exPath
}

func getNewID(w http.ResponseWriter, r *http.Request) {
    var id ID
    id.ID = getSolt(10, 5, 0, true, true)
    fmt.Println("NewID: " + id.ID)

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(id)
}

func setFile(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    id := params["id"]
    fileType := params["file"]

    dirname := getDir()
    filename := dirname + "/" + id + "_" + fileType
    fmt.Println("Set file: " + filename)
    var lines []string

    bData, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Println(err)
    }

    jsonData := string(bData)
    //fmt.Println("jsonData:")
    //fmt.Println(jsonData)

    lines = append(lines, string(jsonData))
    err = WriteLines(lines, filename)
    if err != nil {
        fmt.Println(err)
    }

}

func getFile(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    id := params["id"]
    fileType := params["file"]

    dirname := getDir()
    filename := dirname + "/" + id + "_" + fileType
    fmt.Println("Get file: " + filename)

    lines, err := ReadLines(filename)
    if err != nil {
        fmt.Println(err)
    }

    w.Header().Set("Content-Type", "application/json")
    for _, value := range lines {
        w.Write([]byte(value))
    }
}

func main() {
    r := mux.NewRouter()

    r.HandleFunc("/getnewid", getNewID).Methods("GET")
    r.HandleFunc("/users/{id}/files/{file}", setFile).Methods("POST")
    r.HandleFunc("/users/{id}/files/{file}", getFile).Methods("GET")

    log.Fatal(http.ListenAndServe(":1717", r))
}
41 Garykom
 
гуру
28.10.19
13:15
(39) Эээ ты хочешь чтобы один клиентский сеанс отправлял оповещения в другой клиентский сеанс и тот их получал/обрабатывал в ОбработкаВнешнегоСобытия ?
42 Uberschall
 
28.10.19
13:16
как именно сделать клиент-серверное взаимодействие на другом языке тут не самый главный вопрос. много где это разбирается

первый вопрос- это именно взаимодействие 1С с Java. да хотя бы простешее hello world или вернуть сумму двух слагаемых переданных из 1с в компоненту.
(41) да
43 Garykom
 
гуру
28.10.19
13:17
44 Uberschall
 
28.10.19
13:18
я видел темы Serginol. у него много чего интересного, но на C#
45 palsergeich
 
28.10.19
13:21
Я на жабе нативных компонент не видел
46 palsergeich
 
28.10.19
13:22
Хотя гуглинг выдал https://forum.infostart.ru/forum28/topic194485/
47 Garykom
 
гуру
28.10.19
13:27
java
http://catalog.mista.ru/public/850716/

tcp/ip
http://catalog.mista.ru/public/561080/
http://catalog.mista.ru/public/19355/
http://catalog.mista.ru/public/165023/

ВК на С++ которая HTTP-сервер не могу найти, помню была
48 Сияющий в темноте
 
28.10.19
23:08
в принципе,java,как и .Net,это специальные машины для выполнения байт-кода,и напрямую в них из-вне не так просто зайти.
тем более с клиента 1с,который мало чего умеет.
да в перечислениях вариантов внешних компонент есть упоминание о java,но кроме этого упоминания нет ничего.
не забываем,что связь между двумя клиентами может быть и вообще невозможной,если на обеих клиентских машинах включен firewall,то с них можно только устанавливать соединение наружу,а не принимать входящее.

поэтому,без промежуточного сервера не обойтись,а раз он есть,оо поле html-документа и httpxmlrequest в этом поле.
и никаких компонент и программирования-все просто и быстро,да и кроссплатформенно.
49 Пузан
 
29.10.19
05:33
(13) Откуда возьмется специалист уже умеющий выполнять задачи, если перед этим он не тренировался на клиентах будучи падаваном? :)
50 MyNick
 
29.10.19
08:15
Божамой....ява, сишарп, котлин, ком...
При том что в 1С все доступно из коробки.
Такое "взаимодействие двух баз" на примере Hello world делается за несколько минут...
51 MyNick
 
29.10.19
08:15
повелители костылей и велосипедов блин
52 MyNick
 
29.10.19
08:17
Заголовок особенный... Расширение возможностей 1С за счет других языков...
Кажется надо сначала хотя бы обзорно на своей трубе посмотреть насчет самих возможностей 1С, не?
53 MyNick
 
29.10.19
08:18
(10) а ты что на форме со своим веб сервисом собрался делать? Отправлять данные, которые живут на сервере или чо? Или нужно трекинг движения мыши отправлять в другую базу, чет не понял я.
54 MyNick
 
29.10.19
08:22
(48) он вроде собрался передавать данные. Зачем ему хттпхмлреквест на клиенте при этом? Что он им будет отправлять. Данные формы?
55 Сияющий в темноте
 
29.10.19
08:49
(54) xmlhttprequest асинхронный,в отличие от стандартных методов 1с.
а отправлять можно текстовые строки,т.к.ничего другого ни 1с ни javascript не умеют.
56 MyNick
 
29.10.19
08:51
(55) дык пусть отправляет сервере, а форма асинхронно дожидается результата.
57 MyNick
 
29.10.19
08:56
вон на худой конец есть всякие кафки и рэббиты, нет надо свой велик погородить )))
58 ДенисЧ
 
29.10.19
08:59
(55) xmlhttprequest депрекатед ужо.
59 Uberschall
 
29.10.19
09:14
(49) какие падаваны, специалисты? о чем Вы? Увидели слово клиент и понесло куда-то вообще в другую сторону...
(50) ну расскажите как поднять веб/хттп сервер  и миновать серверное взаимодействие. Такое ощущение, что суть задачи хорошо поняли только несколько человек, кто отметился в задаче.
60 Garykom
 
гуру
29.10.19
09:24
(59) У тебя в любом случае один из клиентов будет сервером, или нужен сторонний сервер
61 SSSSS_AAAAA
 
29.10.19
09:33
(59) В общем-то, то, что ты тут описываешь и называешь при этом клиент-сервером без сервера имеет другое название - peer2peer.
62 Uberschall
 
29.10.19
09:49
(61) согласен.
(60)с точки зрения сеанса 1с клиент остается клиентом, с точки зрения tcp-взаимодействия, внешняя компонента поднимает сервер, чтобы он принимал сообщения, а не только отправлял.
63 trad
 
29.10.19
09:57
(60) как твой ресёрч по поводу нативВК на голэнг?
64 Garykom
 
гуру
29.10.19
10:07
(63) До готовности не допилил, отложил пока.
У меня не очень красивый вариант с двумя dll вышел, одна на C++ (ВК для 1С) и вторая на Golang (просто C-совместимая dll с экспортными функциями).
65 trad
 
29.10.19
10:18
та что "на C++ (ВК для 1С)" -прокладка?
универсальная или под частный интерфейс?
66 Garykom
 
гуру
29.10.19
10:21
(65) Под частный, я тестово проверил что пашет.
Как универсально это надо думать.
67 Garykom
 
гуру
29.10.19
10:23
(66)+ Технически вроде как можно и без прокладки обойтись, точнее встроить ее в код на Go, но это возня с эмулированием C++ объектов на C коде.
68 Ник080808
 
29.10.19
10:27
(0) жесть. ветку не читал, но может сразу свою операционку сверстать в которой все это будет взаимодействовать?
а если по задаче. хттп сервис сделай и неделай беременную голову
69 Ник080808
 
29.10.19
10:38
(59) ты задачу опиши, что это за клиентское взаимодействие такое минуя сервер)
70 MyNick
 
29.10.19
12:21
(69) болталка для тетенек из бухгалтерии без сохранения данных где-либо
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.