Имя: Пароль:
1C
 
Порционное выполнение запроса
0 Max57
 
05.06.26
17:13
Всем привет.

Есть свой РН Обороты.
По нему собираются данные в JSON.
Если период в запросе превышает месяц, запрос падает.
Я хочу реализовать запрос в цикле, предварительно разбив период на месяцы. Какие еще могут быть варианты оптимизации? Добавить автономер и выполнять с указание первые n не получится же, так как придется сначала выполнить за год, например, запрос, поместить в вт, а потом к ней делать в цикле запрос? Порядок записей от сотен тысяч до десятков миллионов.
1 Bigbro
 
05.06.26
17:16
а точно запрос падает? может падает вывод/формирование джейсона все же.
запрос имхо должен быть один а дальше результат уже нарезать в зависимости от ограничений.
2 Max57
 
05.06.26
17:17
(1) JSON тоже режется, собирается в файлы через поток.
3 lubitelxml
 
05.06.26
17:20
(0) покажи запрос. Что значит падает?
4 Lama12
 
05.06.26
17:46
(0)Полей которые дают уникальную запись много? Можно выбрать первые N делать. Результат помещать во временную таблицу. Потом делать тот-же запрос, но без того что есть во временной таблице. И так до конца.
5 Dmitrii
 
гуру
05.06.26
18:36
(0) >> запрос в цикле, предварительно разбив период на месяцы

ИМХО, нормальный вариант.
Вряд ли другие методы дадут хоть сколько-нибудь заметно более качественный результат. В (4) по сути это самое и предлагает - запрос в цикле.
6 Dmitrii
 
гуру
05.06.26
18:37
(0) >> запрос падает

Как и с какой ошибкой?
Просто интересно...
7 shuhard
 
05.06.26
18:41
(6) +1
[запрос падает] напрашивается на детализацию
8 Garykom
 
гуру
05.06.26
21:05
(0) Использовать параллельное выполнение на куче фоновых
Например весь период разбить на дни, запускать запрос в отдельном фоновом для каждого дня
Результат фоновых собирать в массив из ТЗ или сразу структур
Затем как все фоновые выполнятся - соединить в JSON
9 breezee
 
05.06.26
22:18
А зачем такая аналитика на регистре - если нельзя получить даже месяц оборотов?
10 timurhv
 
06.06.26
04:15
(0) Бля, как может запрос по РН Оборотам падать? Сиди ковыряй свои левые внутренние соединения и обращения через точку. Ну я блин не знаю, там что каждая позиция чека отражена в какой-нибудь х5 или Магните по всей РФ?
11 timurhv
 
06.06.26
04:21
Ну вот было типо остатки марок выгрузить в SAP (в Excel бля), а там 50+млн марок, надо выгрузить артикулы номенклатуры, код организации\склада, вот там да, запрос падал и Excel падал и сиди объясняй что ОЗУ на SQL в 2Гб недостаточно и Excel тоже говно.
Я к тому что явно в (0) не 4Гб ОЗУ выделено, чет не то все-таки. 10млн записей за месяц - это что?
12 timurhv
 
06.06.26
04:24
(9) Это скорее всего, ошибка проектирования. Кому она нужна - никому, РН тут нафик не нужен
13 Max57
 
06.06.26
21:24
Всем спасибо за советы. Это легаси выгрузка в JSON для шины, попробую еще его поковырять, там из регистратора что-то берется, попробую «ВЫРАЗИТЬ» сделать. Вчера запустил 12 млн с чем-то записей, за 3,5 часа корректно отработала с делением по месяцам.
14 timurhv
 
06.06.26
22:43
(13) Если разово, то ОК. Если на постоянку, то лучше попробовать что-то из этого
https://infostart.ru/1c/articles/2133335/

Т.е. не передавать все данные для записи, а дописывать. Думаю, можно докрутить до 10-30 минут выгрузку
15 Max57
 
07.06.26
16:02
(14) Скорректировал запрос, время выполнения запроса уменьшилось в 4 раза, время выгрузки на час уменьшилось. Там из полей составных типов брались коды и наименования. Я как в этой статье делаю, но не дописываю а создаю по 50к строк файлики. Но за год падает все равно из консоли с ошибкой "превышен максимальный расход памяти сервера за один вызов", оставил разбивку на месяцы.
16 Кирпич
 
07.06.26
17:23
(15) Ты бы лучше запрос показал. А то так и будешь сам с собой разговаривать.
17 Кирпич
 
07.06.26
18:17
+(16) Я фиг знает что там автор выгружает, но насоветовать конечно же могу. Может есть смысл одним запросом выгружать отдельно цифры со ссылками на справочники и отдельным запросом справочники? Потом соединять цифры и данные из справочников в процессе вывода JSON(если на каждую запись пишутся имена полей, то это дебилизм).
18 Garykom
 
гуру
07.06.26
20:36
(17) Ага
Есть подозрение что там дико кривые запросы с кучей неявных соединений
Банально запросы тормозят и падают по памяти
19 Кирпич
 
07.06.26
21:25
(18) Да понятно, что дело в запросе. Записать JSON это плёвое дело. 1с пишет текстовый файл в 5-7 гигов за пару минут. И не надо там чудить чего то с дроблениями и параллельными заданиями.
20 timurhv
 
07.06.26
22:23
(15) Если консоль типовая УФ с ИТС, она будет падать. Там табличный документ, который жрет слишком много ОЗУ. Именно при выгрузке скорее всего такого не будет. Т.е. создается таб.док на сервере условно на 30Гб в ОЗУ и потом это говнище тянет на клиент, но на сервере ОЗУ не освобождает.
21 Max57
 
08.06.26
09:11
(19) Запросы за месяц нормально отрабатывают миллион-полтора записей минута +/-, львиная доля времени - это выгрузка в JSON.
22 Мультук
 
гуру
08.06.26
09:31
P.S.

Интересно, до показа кода выгрузки в JSON дело дойдёт ?
И в какой серии.
23 Max57
 
08.06.26
09:50
(22) Хотел для спин-офф оставить.
Подробности
Функция СтруктураВФайлJSON(Структура, СтавимNull = Ложь) Экспорт
    
    ВременныйФайлJSON = ПолучитьИмяВременногоФайла("json");
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
    
    Поток = Новый ФайловыйПоток(
        ВременныйФайлJSON,
        РежимОткрытияФайла.Создать,
        ДоступКФайлу.Запись);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.ПроверятьСтруктуру = Ложь;
    ЗаписьJSON.ОткрытьПоток(Поток, КодировкаТекста.UTF8, , ПараметрыЗаписиJSON);
    
    ЗаписьJSON.ЗаписатьНачалоОбъекта();
    
    Для Каждого Элемент Из Структура Цикл
        Если Элемент.Ключ <> "records" Тогда
            ЗаписьJSON.ЗаписатьИмяСвойства(Элемент.Ключ);
            ЗаписьJSON.ЗаписатьЗначение(СтрЗаменить(Строка(Элемент.Значение), Символы.НПП, ""));
        КонецЕсли;
    КонецЦикла;
    
    Если Структура.recordcount > 0 Тогда
        
        ЗаписьJSON.ЗаписатьИмяСвойства("records");
        ЗаписьJSON.ЗаписатьНачалоМассива();
        
        Для Каждого СтрокаЗаписи Из Структура.records Цикл
            
            СтруктураДанных = Новый Структура;
            
            Для Каждого Колонка Из Структура.records.Колонки Цикл
                
                ИмяПоля = Колонка.Имя;
                ЗначениеПоля = СтрокаЗаписи[ИмяПоля];
                
                Если ЗначениеЗаполнено(ЗначениеПоля) Тогда
                    СтруктураДанных.Вставить(ИмяПоля, XMLСтрока(ЗначениеПоля));
                ИначеЕсли СтавимNull Тогда
                    СтруктураДанных.Вставить(ИмяПоля, Неопределено);
                Иначе
                    СтруктураДанных.Вставить(ИмяПоля, "");
                КонецЕсли;
                
            КонецЦикла;
            
            ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
            
        КонецЦикла;
        
        Структура.records.Очистить();
        ЗаписьJSON.ЗаписатьКонецМассива();
        
    КонецЕсли;
    
    ЗаписьJSON.ЗаписатьКонецОбъекта();
    ЗаписьJSON.Закрыть();
    Поток.Закрыть();
    
    Возврат ВременныйФайлJSON;
    
КонецФункции
24 Кирпич
 
08.06.26
10:00
(21) Ну значит выгрузка в JSON написана хреново. А вабще зачем в JSON? Писал бы в csv хотя бы. Так то должно вроде в нормальное время укладываться, если не чудить сильно. Типа такого:
Запись = Новый ЗаписьТекста("1.json");
    Запись.Записать("[");     
    Выб = РезультатЗапроса.Выбрать();
    
    Пока Выб.Следующий() Цикл
        Запись.Записать(СтрШаблон("{""Наименование"":""%1"",""%2"",%3},",СтрЗаменить(Выб.Наименование,"""","\"""),Выб.Номер,Выб.Сумма));
    КонецЦикла;
    
    Запись.Записать("]");
    Запись.Закрыть();

А если прям супербыстро нужно, то можно ЗначениеВФайл и этот файл жахнуть в JSON с помощью любого компилируемого языка
25 Кирпич
 
08.06.26
10:00
+(24) это пример выгрузки в JSON, если что
26 Кирпич
 
08.06.26
10:06
(23) накой так много всего? пиши проще. вот так можно еще:
    Запись = Новый ЗаписьТекста("1.json");
    Запись.Записать("[");     
    Выб = РезультатЗапроса.Выбрать();    
    Пока Выб.Следующий() Цикл
        П = Новый Структура("Номер,Дата,ШК",Выб.Номер,Строка(Выб.Дата),Выб.Сумма);
        Запись.Записать(ЗаписатьЗначениеJSON(П));
        Запись.Записать(",");
    КонецЦикла;
    Запись.Записать("]");
    Запись.Закрыть();
27 shuhard
 
08.06.26
10:24
(15)[с ошибкой "превышен максимальный расход памяти сервера за один вызов"]
если платформа Корп и памяти достаточно - настройками парируется