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

Объектная модель без метаданных

Объектная модель без метаданных
Я
   Asmody
 
27.04.21 - 12:19
Предположим, в рамках некоторой интеграционной задачи, необходимо реализовать объектную модель из десятка сущностей со связями и т.д. При этом данные будут получаться из каких-то произвольных внешних источников в некотором формате. Нужно обеспечить получение, некоторую обработку, возможно, сохранение в объектах метаданных, отправку изменений обратно.
Какими средствами языка или платформы вы бы реализовали такую модель? (вопрос именно про модель, не про задачу целиком!)
   mistеr
 
1 - 27.04.21 - 12:27
Нужно уточнить, что за "связи", и что от них требуется.

Как-то для похожей задачи использовал ТЗ с типизированными колонками. Но связей там особо не было, примитивные типы в основном.
   МихаилМ
 
2 - 27.04.21 - 12:30
мне для объектной модели больше всего подошли ВИД.
они и на сервере и на клиенте и имеют неограниченную вложенность.
   Asmody
 
3 - 27.04.21 - 12:34
(1) связи в смысле ссылочные типы. Например, у ветки есть автор, который есть пользователь, а у пользователя есть ИД, соответственно, у ветки есть поле ИДАвтора
   mistеr
 
4 - 27.04.21 - 12:36
(3) Можно использовать ТЗ для хранения. И ссылки на строки ТЗ.
   ДенисЧ
 
5 - 27.04.21 - 12:37
(3) Типа форума?
Я когда-то пытался нечто такое делать на справочниках. Но обновление иерархии занимало неприлично большое время
   Asmody
 
6 - 27.04.21 - 12:37
(4) ссылка на строку ТЗ?
   mistеr
 
7 - 27.04.21 - 12:38
(6) Я имею в виду в памяти, не в базе.
   Asmody
 
8 - 27.04.21 - 12:38
(5) не, форум - это просто для примера. Просто есть некий развесистый АПИ, надо с ним работать
   Kassern
 
9 - 27.04.21 - 12:38
Если я правильно понял вопрос, использовал бы веб/http сервис, со своей апишкой для интеграции. Для хранения структуры (источник/приемник) использовал бы справочники/документы. Для связей регистры сведений.
   mistеr
 
10 - 27.04.21 - 12:38
А в базе конечно справочники.
   Asmody
 
11 - 27.04.21 - 12:39
АПИ возвращает всякие джейсоны, а хочется работать с ними "по человечески"
   fisher
 
12 - 27.04.21 - 12:40
Необходимость сохранения на диск - ключевой момент. Человеческое структурирование потребует либо специфических метаданных в терминах 1С либо средств эмуляции.
   Asmody
 
13 - 27.04.21 - 12:42
(12) из сохранения - разве что кеширование. какие-то данные должны перекладываться в данные конфы, но прямого соответствия нет.
   Kassern
 
14 - 27.04.21 - 12:42
(11) Если мы говорим про веб сервисы, то можно вполне использовать xdto пакеты. У меня так мобильное приложение получает массив заказов при запросе к центральной базе
   Asmody
 
15 - 27.04.21 - 12:42
А что общественность скажет за XDTO?
   fisher
 
16 - 27.04.21 - 12:43
(14) С языка снял.
   Asmody
 
17 - 27.04.21 - 12:44
XDTO меня смущает некоторой перегруженностью и, местами, неочевидностью. Опять же, (де)сериализацию в/из тот же json всё равно руками писать.
   Lama12
 
18 - 27.04.21 - 12:45
(15) Плохо их знаю, и еще не пользовался, но судя по описанию это как раз то, что нужно.
   Lama12
 
19 - 27.04.21 - 12:46
(17) Зато после десериализации можешь работать как с объектом.
   Garykom
 
20 - 27.04.21 - 12:46
JSON
К черту тормозной XML с XDTO
   Garykom
 
21 - 27.04.21 - 12:46
(20)+ C JSON дико удобно работать через структуры 1С
   Garykom
 
22 - 27.04.21 - 12:48
   fisher
 
23 - 27.04.21 - 12:51
Тему можно закрывать.
   Жан Пердежон
 
24 - 27.04.21 - 12:51
xdto/json уже было?
   Asmody
 
25 - 27.04.21 - 12:51
Я частично сделал на структурах, которые имитируют объекты моделей. Сделал модуль с конструкторами типа
Функция НовыйМодельПользователь() Экспорт 
    Модель = Новый Структура;
    Модель.Вставить("ИДПользователя", 0);
    /// еще овердохера полей


    Возврат Модель;
КонецФункции


и еще парой методов для сериализации/десериализации в json

Сейчас этот модуль подбирается к тысяче строк, а в нем всего пяток моделей. Я ловлю себя на вопросе: нафига столько boilerplate-кода? я на 1С пишу или на java?
   Asmody
 
26 - 27.04.21 - 12:55
И еще приходится что-то дублировать в формах, куда прилетает, например, массив структур, а на форме - ТЗ под таблицей. и начинается:
Для каждого ЗаполнитьЗначенияСвойств() ... вот это всё.
   Asmody
 
27 - 27.04.21 - 12:56
А потом надо на эту ТЗ наложить динамический отбор.
Вот я и думаю - нафига я переписываю 1С на 1С?
   mistеr
 
28 - 27.04.21 - 12:58
(25) Ты пишешь для проприетарной платформы на весьма ограниченном ЯП, не содержащем средств для "улучшения качества жизни".
   Bigbro
 
29 - 27.04.21 - 12:58
а потом мы удивляемся почему решения построенные на обертках для оберток из абстракций для более выосокуровневых абстракций ... тормозят...
   mistеr
 
30 - 27.04.21 - 12:59
(26) Я уже предлагал хранить сразу в ТЗ
 
 
   fisher
 
31 - 27.04.21 - 13:02
(25) Ну, если получится через нативное XDTO <-> JSON, то это уйдет. Если не получится - штош...
(26) А это не уйдет. Это галя балувана.
   fisher
 
32 - 27.04.21 - 13:03
Но ТЗ <-> массив структур это ж один раз пишется.
   PLUT
 
33 - 27.04.21 - 13:09
делал как-то такую модельку на XDTO-пакетах, оказалось удобно.

"тело запроса" в жопсон (json) нужной структуры (данные метода API) буквально в несколько строк кода получал.

ну и при изменении структуры данных методов API тоже легко в пакетах изменить
   Asmody
 
34 - 27.04.21 - 13:17
(33) вот этот момент: "тело запроса в несколько строк кода". ясен пень, что 146% АПИ отдают джейсона по-ненашемски. А в 1С кошерно оперировать русскими буквами. Естессно хочется, чтобы и в коде было как-то "Пользователь.Наименование" вместо "Пользователь.name". И тогда возвращаемся к необходимости программной (де)сериализации.
   Kassern
 
35 - 27.04.21 - 13:30
(34) Твой API - твои правила) Можешь структуру xdto по русски запилить. Теги русские писать тоже никто не запрещает)
   polosov
 
36 - 27.04.21 - 13:31
(27) Слишком много думаешь. Работай!
   Вафель
 
37 - 27.04.21 - 13:35
можешь сам накидать свой жсон с правилами сериализации.
сами правила хранить в макетах.
тогда нужно только парсер написать.
хотя стойте - это же и есть xdto
   Asmody
 
38 - 27.04.21 - 13:39
(35) АПИ не мой,  ̶я̶ ̶т̶о̶л̶ь̶к̶о̶ ̶р̶а̶з̶м̶е̶с̶т̶и̶л̶ ̶о̶б̶ъ̶я̶в̶у̶ , я на него повлиять не могу. Моя только обёртка внутри 1С
   fisher
 
39 - 27.04.21 - 13:42
(34) Ну пиши User.name. Зато  "инородные" объекты сразу видно будет. Если тебя это настолько напрягает, что ты готов написать прокладку - пиши прокладку, программист буриданов. Можешь сделать два разноязычных комплекта XDTO. И прозрачное преобразование туда-обратно по словарю.
   Garykom
 
40 - 27.04.21 - 13:45
ВК и все унутри
   Вафель
 
41 - 27.04.21 - 14:00
(40) изменится апи и вк нужно будет пересобирать
   Garykom
 
42 - 27.04.21 - 14:02
(41) Так и код переписывать на 1С
Зато написание кода ВК удобное можно и пересборку автоматизировать по одной кнопке
   Garykom
 
43 - 27.04.21 - 14:03
(42)+ А это идея
И даже вполне монетизируемая
   Вафель
 
44 - 27.04.21 - 14:08
(42) ем удобнее? есть какие то готовые библиотеки для трансформации жсон?
   arsik
 
45 - 27.04.21 - 14:10
Я за XDTO, в СериализаторXDTO все есть.
   Cyberhawk
 
46 - 27.04.21 - 14:15
Почему без метаданных?
   Garykom
 
47 - 27.04.21 - 14:16
(44) дофига
   Garykom
 
48 - 27.04.21 - 14:18
   arsik
 
49 - 27.04.21 - 14:23
(44) В 1С JSON можно через СериализаторXDTO прогнать.
   PLUT
 
50 - 28.04.21 - 11:40
+(33) на примере одного метода какого-то API (для удобства добавлен справочник какоетоAPI предопределенных методов API) выглядел вызов метода с использованием XDTO для получения тела запроса в жЫсон (json):


Функция CheckCustomer(Параметры) Экспорт

    Операция = Справочники.какоетоAPI.CheckCustomer;
    НастройкиОперации = Справочники.какоетоAPI.ПолучитьНастройкиДляОперации(Операция);

    customer = XDTOобъект("tcustomer", Новый Структура("mobilephone", Параметры["mobilephone"]));
    operation = XDTOобъект("operation", Новый Структура("customer, pointofcontact", customer, Параметры["pointofcontact"]));

    data = XDTO2JSON(operation);

    Возврат ВыполнитьHTTPSЗапрос("POST", НастройкиОперации.Ресурс, НастройкиОперации.Заголовки, Data, Операция);

КонецФункции

Функция XDTO_Объект(ИмяТипа, СтруктураПараметров = Неопределено) Экспорт
    
    XDTOОбъект = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://какоетоAPI/requestTypes", ИмяТипа));
    
    Если ТипЗнч(СтруктураПараметров) = Тип("Структура")
        ИЛИ ТипЗнч(СтруктураПараметров) = Тип("Соответствие") Тогда
        
        Для Каждого Элем из СтруктураПараметров Цикл
            Если Элем.Значение <> Неопределено Тогда
                Если ТипЗнч(Элем.Значение) = Тип("Массив") Тогда
                    Для Каждого ЭлемМассива Из Элем.Значение Цикл
                        XDTOОбъект[Элем.Ключ].Добавить(ЭлемМассива);
                    КонецЦикла;
                Иначе
                    XDTOОбъект[Элем.Ключ]    = Элем.Значение;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
        
    Возврат XDTOОбъект;    
    
КонецФункции

Функция XDTO2JSON(XDTO_Объект) Экспорт
    
    Если ТипЗнч(XDTO_Объект) <> Тип("ОбъектXDTO") Тогда
        Возврат "";
    КонецЕсли;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
    ФабрикаXDTO.ЗаписатьJSON(ЗаписьJSON, XDTO_Объект);    

    СтрокаОтвета = СтрЗаменить(ЗаписьJSON.Закрыть(), "{""#value"":", "");
    СтрокаОтвета = Лев(СтрокаОтвета, СтрДлина(СтрокаОтвета) - 1);
    
    Возврат СтрокаОтвета;
    
КонецФункции




Список тем форума
 
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.