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

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

Функция НовыйМодельПользователь() Экспорт
    Модель = Новый Структура;
    Модель.Вставить("ИДПользователя", 0);
    /// еще овердохера полей

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


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

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

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

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