Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Расширение возможностей 1С за счет других языков программирования. Java

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

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

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

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

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

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

первый вопрос- это именно взаимодействие 1С с Java. да хотя бы простешее hello world или вернуть сумму двух слагаемых переданных из 1с в компоненту.
(41) да
   Garykom
 
43 - 28.10.19 - 13:17
   Uberschall
 
44 - 28.10.19 - 13:18
я видел темы Serginol. у него много чего интересного, но на C#
   palsergeich
 
45 - 28.10.19 - 13:21
Я на жабе нативных компонент не видел
   palsergeich
 
46 - 28.10.19 - 13:22
Хотя гуглинг выдал https://forum.infostart.ru/forum28/topic194485/
   Garykom
 
47 - 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) Откуда возьмется специалист уже умеющий выполнять задачи, если перед этим он не тренировался на клиентах будучи падаваном? :)
   MyNick
 
50 - 29.10.19 - 08:15
Божамой....ява, сишарп, котлин, ком...
При том что в 1С все доступно из коробки.
Такое "взаимодействие двух баз" на примере Hello world делается за несколько минут...
   MyNick
 
51 - 29.10.19 - 08:15
повелители костылей и велосипедов блин
   MyNick
 
52 - 29.10.19 - 08:17
Заголовок особенный... Расширение возможностей 1С за счет других языков...
Кажется надо сначала хотя бы обзорно на своей трубе посмотреть насчет самих возможностей 1С, не?
   MyNick
 
53 - 29.10.19 - 08:18
(10) а ты что на форме со своим веб сервисом собрался делать? Отправлять данные, которые живут на сервере или чо? Или нужно трекинг движения мыши отправлять в другую базу, чет не понял я.
   MyNick
 
54 - 29.10.19 - 08:22
(48) он вроде собрался передавать данные. Зачем ему хттпхмлреквест на клиенте при этом? Что он им будет отправлять. Данные формы?
   Сияющий в темноте
 
55 - 29.10.19 - 08:49
(54) xmlhttprequest асинхронный,в отличие от стандартных методов 1с.
а отправлять можно текстовые строки,т.к.ничего другого ни 1с ни javascript не умеют.
   MyNick
 
56 - 29.10.19 - 08:51
(55) дык пусть отправляет сервере, а форма асинхронно дожидается результата.
   MyNick
 
57 - 29.10.19 - 08:56
вон на худой конец есть всякие кафки и рэббиты, нет надо свой велик погородить )))
   ДенисЧ
 
58 - 29.10.19 - 08:59
(55) xmlhttprequest депрекатед ужо.
   Uberschall
 
59 - 29.10.19 - 09:14
(49) какие падаваны, специалисты? о чем Вы? Увидели слово клиент и понесло куда-то вообще в другую сторону...
(50) ну расскажите как поднять веб/хттп сервер  и миновать серверное взаимодействие. Такое ощущение, что суть задачи хорошо поняли только несколько человек, кто отметился в задаче.
   Garykom
 
60 - 29.10.19 - 09:24
(59) У тебя в любом случае один из клиентов будет сервером, или нужен сторонний сервер
   SSSSS_AAAAA
 
61 - 29.10.19 - 09:33
(59) В общем-то, то, что ты тут описываешь и называешь при этом клиент-сервером без сервера имеет другое название - peer2peer.
   Uberschall
 
62 - 29.10.19 - 09:49
(61) согласен.
(60)с точки зрения сеанса 1с клиент остается клиентом, с точки зрения tcp-взаимодействия, внешняя компонента поднимает сервер, чтобы он принимал сообщения, а не только отправлял.
   trad
 
63 - 29.10.19 - 09:57
(60) как твой ресёрч по поводу нативВК на голэнг?
   Garykom
 
64 - 29.10.19 - 10:07
(63) До готовности не допилил, отложил пока.
У меня не очень красивый вариант с двумя dll вышел, одна на C++ (ВК для 1С) и вторая на Golang (просто C-совместимая dll с экспортными функциями).
   trad
 
65 - 29.10.19 - 10:18
та что "на C++ (ВК для 1С)" -прокладка?
универсальная или под частный интерфейс?
   Garykom
 
66 - 29.10.19 - 10:21
(65) Под частный, я тестово проверил что пашет.
Как универсально это надо думать.
 
 Рекламное место пустует
   Garykom
 
67 - 29.10.19 - 10:23
(66)+ Технически вроде как можно и без прокладки обойтись, точнее встроить ее в код на Go, но это возня с эмулированием C++ объектов на C коде.
   Ник080808
 
68 - 29.10.19 - 10:27
(0) жесть. ветку не читал, но может сразу свою операционку сверстать в которой все это будет взаимодействовать?
а если по задаче. хттп сервис сделай и неделай беременную голову
   Ник080808
 
69 - 29.10.19 - 10:38
(59) ты задачу опиши, что это за клиентское взаимодействие такое минуя сервер)
   MyNick
 
70 - 29.10.19 - 12:21
(69) болталка для тетенек из бухгалтерии без сохранения данных где-либо


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.