Имя: Пароль:
1C
Мобильный мир
Импорт/экспорт данных между компом/1С и мобильным приложением
, ,
0 Garykom
 
гуру
01.06.19
15:12
Подскажите плиз.

Вот пишу софтину для проведения инвентаризации/ревизий/переучета с помощью мобильных устройств (планшетов/смартфонов).
Чем она отличается от уже кучи другим выходит за рамки темы ;)

Каким способом(ами) лучше всего организовать обмен (импорт/экспорт) с компом и 1С?

С компа из 1С импортируется справочник номенклатуры (с ШК и прочими сведениями нужными о ней) и некие настройки в т.ч. например список магазинов\отделов.
Обратно из мобильного приложения экспортируются файлы-документы инвентаризации, т.е. по каждому магазину/отделу какая номенклатура была отсканирована и сколько.

Вопрос как работать с 1С тоже за рамками темы, как это на мобильном приложении сделать?

Поднимать веб-сервис в 1С на компе конечно можно, как и просто некий сервис в локалке или даже в инете публичный.
Можно и файлами (но не на всех мобильных девайсах) обмениваться через провод или еще что.

Вот пытаюсь решить что в первую очередь делать, чтобы как можно удобнее было.
1 Sapiens_bru
 
01.06.19
16:45
(0) Вспомни заветы Мартина. Отложи решение о конкретном способе транспорта, напиши сначала всю бизнес-логику в виде функций общего назначения.
Потом хоть файлами, хоть ftp , хоть http реализуешь за пару часов.
2 Garykom
 
гуру
01.06.19
17:35
(0) Предлагаешь делать через файлы, а затем уже либо их подсовывать либо передавать как то.
3 rozer76
 
02.06.19
17:32
Структуру данных обмена - пишешь xdto, транспорт-предпочитаю вебсервисы. Смотри книгу Хрусталевой на ИТС- все разжевано только не понятно почему она пишет/читает xml не через xdto
4 Garykom
 
гуру
02.06.19
17:49
(3) Книгу тупая, автор еще тупее.

Какой смысл писать про xml и xdto если это основы давно всем известные и они в книжках по мобильным не нужны, это основы общие платформы.

И не написать ни слова каким образом передавать данные между мобильным и компом?
Куча слов в книжке и ни одного по делу, бесполезная совершенно.

У меня не проблема сериализации или работы с объектами в конфе.
У меня сложность как передать файл например на iOS, если там только через iTunes можно и только в каталог приложения платформа 1С может писать/читать.

С Android таких проблем нет, только некоторые сложности.
5 Garykom
 
гуру
02.06.19
17:56
Все решения что видел там или некий внешний публичный сервис используют типа яндекс диска с его api.
Или поднимают на платформе 1С веб-сервисы.

Поднимать веб-сервисы штатно платформой и апачем/iis это сложно и требует вмешательство в конфу или через стандартный odata.
ODATA не подходит ибо оно разное у разных конф.

Мне нужно чтобы внешняя обработка (своя под каждую типовую конфу, открытая в 1С на компе) банально могла передавать/получать данные на/с мобильное приложение 1С на мобильном устройстве.

Каким образом это проще всего реализовать?
6 Garykom
 
гуру
02.06.19
17:58
Пока кроме своей ВК которая в обработке подключается и поднимает свой сервис, ничего не придумал.
Ну или поднимать внешний сервис не через ВК а чем то иным или использовать некий готовый.
7 Лефмихалыч
 
02.06.19
18:01
(0) (4) выкинь из головы концепцию передачи файлов вообще всю целиком и навсегда. Отправляй из приложения http-запросы и получай на них http-ответы. Все, что надо отдать или принять - пхай в тело запроса хоть в json, хоть xml.
8 Garykom
 
гуру
02.06.19
18:01
(7) Уже пришел к этому.

Вопрос куда запросы отправлять?
9 Лефмихалыч
 
02.06.19
18:03
(5) у тебя телега поперёк лошади. Специфичная для каждой отдельной конфы бизнес-логика должна быть сосредоточена на бэке, а на фронте приложуха должна работать одинаково без понимания, что там за конфа сзади у ней стоит.
Да - для каждой конфы свой вебсервис с единым для всех программным интерфейсом. На войне иногда убивают, чо уж там...
10 Garykom
 
гуру
02.06.19
18:03
Вот есть обычная УТ или УНФ в обычном ларьке, не опубликованная через апач и конфа типовая.

Что использовать для обмена, куда будет http-запросы слать внешняя обработка для УТ/УНФ.
И мобильное приложение скачанное на планшет чтобы провести инвентаризацию.
11 Garykom
 
гуру
02.06.19
18:05
(9) Да приложуха (на мобильных) будет одинаково с бэком работать, бэк в данном случае это свои внешние обработки которые стандартные файлики с данными туды\сюда, а сами переводят в метаданные конфы.
12 Garykom
 
гуру
02.06.19
18:06
(11)+ Но вопрос что использовать в качестве шлюза между фронтом (мобильное приложение) и бэком (внешняя обработка в типовой конфе)?
13 Лефмихалыч
 
02.06.19
18:06
(10) а, ты вон чо хочешь. и небось - чтобы вообще без никаких доработок и конфигурирований на стороне ни бэка, ни фронта?
отличный тост вышел
14 Garykom
 
гуру
02.06.19
18:07
(13) Угадал ))
Могу поднять свой сервер в инете конечно и через него все.
Но бесплатно держать сервер для всех?

Нужен некий публичный бесплатный сервер/сервис или нечто что легко в ларьке поднимается на компе.
15 Лефмихалыч
 
02.06.19
18:08
(12) http-скрвис и json'ы
Чтобы у всех всё и без конфигурирования и доработок - поднимай свой сервер в интернетах, в который обработки из бэка будут выпуливать, из которого приложухи будут читать и обратно в него же результат отправлять для последующего чтения обработками. И попиську к этому сервису и продавай, а приложуха и обработки - на халяву рахдавай
16 Лефмихалыч
 
02.06.19
18:09
(14) "если умеешь что-то, то не вздумай делать это бесплатно" (с) один хороший фильм
17 Garykom
 
гуру
02.06.19
18:09
(15) Скорее всего так и придется
18 Лефмихалыч
 
02.06.19
18:13
не, приложуху - тоже за какие-то деньги. Смысл сервиса в сервере и приложухе: на те, вася, апи и приложуха. Научай свой бэк в апи отдавать нужные данные и будет тебе инвентаризация с блэк джеком и шлюхами. Если у тебя типовые, то вот тебе на шару коннекторы к апи, они бесплатные, а за остальное вот те счёт.
19 Garykom
 
гуру
02.06.19
18:16
(18) Если приложение намертво приколотить к своему серверу/сервису то можно и бесплатно.
Пусть скачают и попробуют на демо периоде, дальше платите.
20 Garykom
 
гуру
02.06.19
18:19
Готовые подобные (причем на 1С) уже нашел, но для моей задачи текущей не подходят, нельзя свои реквизиты номенклатуры добавлять.
Причем по которым (если не нашлось по ШК) чтобы можно было при инвентаризации находить и ШК прописывать.
21 pavig
 
02.06.19
21:33
(0) Товарищ, поройся в области FireBase (гугл) и тому подобным базам в облаках.
Мы на одном проекте очень успешно это сделали для одного мобильного приложения.
Прямо очень сильно понравилось и теперь всем рекомендую.
Подходит конечно не всегда но поизучать того стоит.
22 pavig
 
02.06.19
21:36
(5)
Ну дык расширения уже давно умеют в hs...
Или что не так?
23 pavig
 
02.06.19
21:38
(10)
FireBase точно почитай
24 Garykom
 
гуру
02.06.19
21:41
(21) FireBase не подходит или надо автоматизировать получение там учеток новых.
На одной учетке при большом кол-ве данных оно платно.

Мне проще свой сервер поднять и так уже и решил сделать.
25 DGorgoN
 
02.06.19
21:42
(0) Для нормального процесса только online данные. Так что я тоже за http сервисы. У высоконагруженного склада этот процесс должен быть постоянным и ненавязчивым.
Ну как вариант для мелочи:
1) предусмотреть обмен через свой сервис.
2) предусмотреть обычные классические текстовые файлы (для экзотики и 7.7)
26 DGorgoN
 
02.06.19
21:42
(24) Плюсую за свой сервак. В край можно и в облаке развернуть если что.
27 pavig
 
02.06.19
21:43
(24)
В деньгах копейки получаются, дешевле чем свой сервер делать. Там оно уже всё сделано и надежно)
28 Garykom
 
гуру
02.06.19
21:52
(27) Свой сервер от 90 рублей в месяц пофиг сколько данных.
У меня сча чуть получше за 199р в месяц, там 1 гиг ram и 30 гиг hdd.

И не ограничен готовым API от FireBase, можно свое что угодно ваять.

Мне просто влом ваять свое, думал может что есть готовое для подобного дела, что давно все используют а я просто не в курсе.
29 Garykom
 
гуру
02.06.19
21:53
(28)+ В смысле не пофиг сколько данных, но 10гиг под данные это дохрена.
30 pavig
 
02.06.19
21:58
(28)
API на чем писать будешь?
Я бы в первое время точно не стал писать свою балалайку, а адаптировался бы под то что уже есть и работает.
Если проект начнет давать обороты, то дальнейшие версии можно уже перенести на свой API, если вкладываться в это обновление экономически выгодно.
:-)
31 DGorgoN
 
02.06.19
22:00
(30) Пфф, эти апи можно и самому быстро наваять так то. Иной раз быстрее чем в чужих разобраться.
32 Garykom
 
гуру
02.06.19
22:03
(30) На Golang же, там очень просто совсем
33 pavig
 
02.06.19
22:05
(31)
ну-ну, конечно) можно вообще всё самому сделать.
Но зачем, если есть готовое?))
34 Garykom
 
гуру
02.06.19
22:06
(33) Вот это же сделал https://1cvpn.ru/ сам
35 Garykom
 
гуру
02.06.19
22:08
Нету готового.

Мне по сути нужен аля файловый обменник, где можно получателя указывать.
А получатель может скачать в любой момент файл и только он, другие нет.
36 DGorgoN
 
02.06.19
22:11
(35) Я тоже об этом думал, мне кажется проще простого, особенно с линем, делать сервис по заведению фтп + юзера да и файл в этот фтп ложить. Имхается самое простое и быстрое.
Наваял сервис на 1с-ке (мне привычнее, в край можно на 1с скрипт перевести), вот теперь думаю отсыл смс сделать для авторизации + после авторизации заведение фтп + пользователь к нему.
37 Garykom
 
гуру
02.06.19
22:12
Уже придумал в принципе как сделать.

Мобильное приложение и внешняя обработка стучатся на сайт и получают себе некий уникальный код, который сохраняется.
Затем при обмене (загрузке или выгрузке данных) указываем этот код и все, файл только для него.

Можно в эти коды других сторон тоже сохранить в мобильном или в обработке, чтобы каждый раз не вводить причем с именами своими.
Тогда отправка будет выглядеть как выбор из списка кому посылаем данные, а получение аналогично от кого принимаем.
38 DGorgoN
 
02.06.19
22:12
+(36) Но делать буду на вынь ибо он уже есть. Сейчас сижу с повершеллом развлекаюсь по заведению отдельного фтп и юзера.
39 Garykom
 
гуру
02.06.19
22:12
(36) Мобильная платформа от 1С не умеет с фтп никак. Точнее только через нечто внешнее, что невозможно на iOS.
40 Garykom
 
гуру
02.06.19
22:13
(38) Забей на FTP сразу советую - устаревшая и хреново поддерживаемая технология. HTTP надежнее.
41 Garykom
 
гуру
02.06.19
22:13
(40)+ Еще когда для WinCE/WinMobile писали с FTP намучались.
42 pavig
 
02.06.19
22:15
(40)
+100 однозначно
43 pavig
 
02.06.19
22:22
(37)
Ну да, так и есть.
Только сервер тебе писать придется.
А в случае с сервисом гугла или яндекса - будешь просто делать запросы по https к этой субд в контексте твоего разделителя.
Причем логику контекста ты сам напишешь на клиенте.
Файл = некий пакет данных, то есть результат запроса к этой субд.

Именно для такой схемы и сделаны эти сервисы.
44 DGorgoN
 
02.06.19
22:24
(40) Ммм, чем она устаревшая? Мне кажется тут наоборот чем старее тем лучше. Но да, мобильный оказывается не может ftp )
45 pavig
 
02.06.19
22:24
И да, там по-моему бесплатная квота 1000 запросов в сутки - не так уж и мало, если честно.
46 Garykom
 
гуру
02.06.19
22:45
(43) Да уже нашел готовый код, который просто слегка допилить.

Вот ID уже генерит уникальные http://1cvpn.ru:1717/getnewid
47 Злопчинский
 
02.06.19
23:48
посмотри у меня в группе http://catalog.mista.ru/community/groups/22/
может что полезное найдешь
48 Garykom
 
гуру
02.06.19
23:54
(47) Да есть полезное но копаться надо

Вот это точно потребуется для hid сканеров с эмуляцией клавиатуры
http://catalog.mista.ru/public/969675/
49 Злопчинский
 
02.06.19
23:56
(48) ну так я в группе собрал все что более-менее относится к "складской области" - то есть шерстить надо не весь ИС, а только группу.
50 Злопчинский
 
02.06.19
23:56
собрал - и регулярно отсматриваю и пополняю
51 Злопчинский
 
02.06.19
23:57
(48) эта публикация тоже сграблена в группу
52 Garykom
 
гуру
02.06.19
23:59
Вот это кстати http://catalog.mista.ru/public/955161/
То что я хочу примерно в итоге получить, но чтобы работало с моими сканерами и с моими реквизитами для номенклатуры.
53 Сияющий в темноте
 
03.06.19
08:48
В чем проблема?
рисуешь на php или javascript прокси для хранения данных и по http к нему подключаешься и из 1с и из мобильного приложения.
использовать web-сервисы 1с-это править или расширять конфу,а внешний сервис с внешней обработкой вполне заработает.
при желании,потом можно один сервис для нескольких баз использовать.
54 Garykom
 
гуру
03.06.19
11:09
(53) Да сделал уже, только не web-сервисы 1С а простые http-сервисы.
Golang классная штука для подобного, код меньше 140 строк занял.

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))
}


И теперь умеет генерить новый id и сохранять файлы "application/json" указанного имени для каждого id методом POST.
Ну и получать их методом GET
http://1cvpn.ru:1717/users/433zboc6d6/files/goods
55 Garykom
 
гуру
03.06.19
11:12
(54)+ Для 1С все не менее банально, вот так номенклатуру для Розница 2 выгружает

&НаСервере
Функция НоменклатураВJSON()
    
    ЗаписьJSON = Новый ЗаписьJSON();
    ЗаписьJSON.УстановитьСтроку();
    
    ТекстЗапроса = "ВЫБРАТЬ
                   |    Номенклатура.Наименование КАК Номенклатура,
                   |    Штрихкоды.Штрихкод КАК Штрихкод,
                   |    Номенклатура.Код КАК Код
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
                   |        ПО Штрихкоды.Владелец = Номенклатура.Ссылка";
    
    Запрос = Новый Запрос(ТекстЗапроса);
    тзДанные = Запрос.Выполнить().Выгрузить();
    
    МассивДанных = Новый Массив();
    Для Каждого ТекСтр Из тзДанные Цикл
        СтруктураОбъекта = Новый Структура();
        СтруктураОбъекта.Вставить("Код", СокрЛП(ТекСтр.Код));
        СтруктураОбъекта.Вставить("Номенклатура", СокрЛП(ТекСтр.Номенклатура));
        СтруктураОбъекта.Вставить("ШК", СокрЛП(ТекСтр.Штрихкод));
        МассивДанных.Добавить(СтруктураОбъекта);
    КонецЦикла;

    ЗаписатьJSON(ЗаписьJSON, МассивДанных);
    Результат = ЗаписьJSON.Закрыть();
    Возврат Результат;
КонецФункции

&НаСервере
Процедура ВыгрузитьНоменклатуруНаСервере()

    СтрокаJSON = НоменклатураВJSON();
    
    ИдентификаторОбмена = СокрЛП(Объект.ИдентификаторОбмена);
    ТипФайла = "goods";
    АдресРесурса =  "/users/"+ИдентификаторОбмена+"/files/"+ТипФайла;
    
    HTTPСоединение = Новый HTTPСоединение("1cvpn.ru",1717);
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
    HTTPЗапрос.УстановитьТелоИзСтроки(""+СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);  
    
    Сообщить("Код результата: " + Ответ.КодСостояния);
    Сообщить("Ответ: " + Ответ.ПолучитьТелоКакСтроку("UTF-8"));

КонецПроцедуры