Имя: Пароль:
1C
1С v8
http сервис с большим количеством данных
,
0 gem
 
29.10.21
19:44
Для сторонней системы (не 1с), делаю сервис для получения данных по документам поступление  товаров и услуг за определенный период. Необходимо выгружать все данные, в том числе и табличную часть.
За день - это примерно 80 тыс. строк. жутко тормозит при формировании ответа json. Есть какие-то варианты, как это можно ускорить?
1 OldCondom
 
29.10.21
19:48
ты одним ответом это шлешь? Разбей на разные сервисы.
К примеру в ОФД, данные по кассе получишь только в цикле сперва организаций, затем касс, затем отбор по дню и пр.
2 OldCondom
 
29.10.21
19:49
ой, методы, а не сервисы
3 OldCondom
 
29.10.21
19:50
и да, отдавай частями, если больше 1к.
4 gem
 
29.10.21
19:51
(1) да, шлю одним методом.
Принимающая система так заточена, что хочет за выбранный период получить весь массив данных.
не пойму, из-за чего так долго? ранее аналогичный сервис на web работал в разы быстрее
5 ДенисЧ
 
29.10.21
19:53
Если ты захочешь 10ГБ с интернету скачать - тоже будешь плакаться, что медленно работает?
Внешнюю систему переточить
Издаваемые файлы формировать заранее, сохранять, отдавать по запросу.
6 OldCondom
 
29.10.21
19:53
(4) тогда частями отдавай. Нормальная практика.
7 Ненавижу 1С
 
гуру
29.10.21
19:56
+(3) добавь пагинацию, что-то типа параметров NBC top, skip
Если ответ содержит данных больше предельного значения вместо ответа формируй соответствующую ошибку
8 gem
 
29.10.21
19:57
(6) это как? вначале сформировать пакеты и вернуть id каждого пакета?
дергая ID, уже получить порцию данных?
9 Ненавижу 1С
 
гуру
29.10.21
19:59
(8) Пагинация
Функции, возвращающие массив значений, поддерживают параметры для порционной загрузки, которые передаются в виде query-строки(?$top=1&$skip=10).

Пример:

https://localhost:9000/api/v1/Docs?$top=5&$skip=10

При выполнении данного запроса мы получим максимум 5 записей начиная с 11 индекса в списке.
10 gem
 
29.10.21
20:00
пример кода.
for each row in vt do
        str=new structure;
        

        ColIndex=0;

        for each col in vt.columns do
            
            colName=col.name;
            
            value=string(row.get(ColIndex));
            
            ColIndex=ColIndex+1;
            try
                str[colName]=value;
            except
                execute ("str.insert("""+colName+""",)");
                str[colName]=value;

                
            endtry;
            //
            
        enddo;
        array.add(str);
    enddo;
11 gem
 
29.10.21
20:00
очень много уходит на формирование этой структуры
12 Ненавижу 1С
 
гуру
29.10.21
20:08
(10) это потому, что на буржуйском (шутка)

1. перед основным циклом - обойди список колонок и собери все их имена в одну строку, например
СтрокаИменКолонок = "Поле1,Поле2,Поле3";

2. далее в основном цикле сразу создавай структуру с этими колонками
str=new structure(СтрокаИменКолонок);

3. убери внутренний цикл по колонкам, достаточно будет:
ЗаполнитьЗначенияСвойств(str,row);
13 gem
 
29.10.21
20:16
(12) в разы быстрее! спасибо!
14 Ненавижу 1С
 
гуру
29.10.21
20:27
(13) а вообще в типовом БСП есть метод
ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаЗначений)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.