|
порционное чтение таблицы значений | ☑ | ||
|---|---|---|---|---|
|
0
Маленький Вопросик
07.02.26
✎
18:19
|
товарищи, доброго времени!
предложите варианты кода порционного чтения тз спасибо! |
|||
|
1
Ёпрст
гуру
07.02.26
✎
18:22
|
(0) а че, циклы уже отменили ?
|
|||
|
2
Ёпрст
гуру
07.02.26
✎
18:23
|
+1 еще, дарю: [тут типа номер строки]
|
|||
|
3
X Leshiy
07.02.26
✎
18:52
|
(0) А зачем? ТЗ она в памяти рисуется, а потом уже в сеансовых данных. Индексируй, индексы рулят)
|
|||
|
4
X Leshiy
07.02.26
✎
18:52
|
||||
|
5
sikuda
07.02.26
✎
20:15
|
(0) Из ТаблицыЗначений или Базы данных?
ТаблицаЗначений вся в памяти - выбирай кусками, что хочешь База данных: Пагинации в 1С нет, приходится извращаться Но при много миллионный выборке сделать выгрузить в ТЗ точно не надо ... |
|||
|
6
Маленький Вопросик
07.02.26
✎
21:56
|
если что, то сделано! спасибо всем за советы!
|
|||
|
7
Волшебник
07.02.26
✎
23:55
|
(6) Сделано как?
|
|||
|
8
Chai Nic
08.02.26
✎
08:21
|
(5) Выборка из результата запроса тоже в памяти висит, кстати. По крайней мере, так было пару лет назад. Проверял. Оверхед при выгрузке в ТЗ был буквально единицы процентов.
|
|||
|
9
Маленький Вопросик
08.02.26
✎
08:47
|
(7) ответами "экспертов" не воодушевился?
вот так: &НаСервере
Функция РазбитьТЗНаЧасти(ВходящийМассив, РазмерЧасти)
Сч = 0;
СодержаниеПорции = Новый Массив;
Части = Новый Массив;
Для Индекс = 0 По ВходящийМассив.Количество() - 1 Цикл
Сч = Сч + 1;
Если Сч % РазмерЧасти = 0 Тогда
СодержаниеПорции.Добавить(ВходящийМассив[Индекс]);
Части.Добавить(СодержаниеПорции);
СодержаниеПорции = Новый Массив;
Сч = 0;
Иначе
СодержаниеПорции.Добавить(ВходящийМассив[Индекс]);
КонецЕсли;
КонецЦикла;
Части.Добавить(СодержаниеПорции);
Возврат Части;
КонецФункции |
|||
|
10
Кирпич
08.02.26
✎
09:01
|
Чота как то жутковато становится на мисте.
|
|||
|
11
craxx
08.02.26
✎
09:29
|
(9) а зачем???
|
|||
|
12
Кирпич
08.02.26
✎
09:57
|
(11) Хрен знает. Может хочет одну таблицу значений одновременно обработать несколькими фоновыми заданиями. Но нафига по массивам распихивать, непонятно. Судя по тупости приведенного кода, код писал ИИ. Сельская интеллигенция осваивает ИИ. Деградация, тупость, уныние, безысходность.
|
|||
|
13
Маленький Вопросик
08.02.26
✎
10:10
|
(12) следи за своим языком и предложи свой пример
|
|||
|
14
craxx
08.02.26
✎
10:11
|
(12) если для этого, то просто берешь размер таблицы, делишь его на количество фонок, и в параметры фонок просто первый и последний индекс суешь, нафиг вообще массивы?
|
|||
|
15
Кирпич
08.02.26
✎
10:15
|
(13) вот тебе пример в (14)
|
|||
|
16
H A D G E H O G s
08.02.26
✎
12:05
|
(14) И в фоновые уедут полные копии таблицы?
|
|||
|
17
Кирпич
08.02.26
✎
12:08
|
(16) чо проверил? :)
|
|||
|
18
H A D G E H O G s
08.02.26
✎
12:08
|
(12) Ну и если он разбивает ТЗ - то в результирующем массиве у него будут СтрокаТаблицыЗначений, которую не передать в Фоновое.
|
|||
|
19
H A D G E H O G s
08.02.26
✎
12:10
|
(17) Что проверил? Если я правильно понял идею (14) - Она в передаче в фоновое номеров строк таблицы. Но и таблицу же надо передать, откуда фоновое данные брать будет?
|
|||
|
20
Кирпич
08.02.26
✎
12:15
|
(19) есть маленькая надежда, что таблица не скопируется. но скорее всего она скопируется. проверять ниахота
|
|||
|
21
H A D G E H O G s
08.02.26
✎
12:18
|
(20) Конечно скопируется, а потом сериализуется и десериализуется в фоновом, вы чего?
|
|||
|
22
Кирпич
08.02.26
✎
12:20
|
(21) да ничего. просто логично было бы её не копировать. но в 1с своя логика.
|
|||
|
23
Кирпич
08.02.26
✎
12:23
|
прочитал. "Все передаваемые параметры должны поддерживать сериализацию."
|
|||
|
24
craxx
08.02.26
✎
12:26
|
(19) ТЗ можно заранее передать в некий глобальный объект, который будет виден всем фонкам.
|
|||
|
25
Кирпич
08.02.26
✎
12:41
|
(24) да 1с её скорее всего всё равно скопирует. может там конечно оптимизирует это дело, но тот факт, что параметры должны сериализоваться, гарантий некопирования не дает. да и хрен с ним. нафиг это вабще надо. да и автор так и не сказал чего он хотел сотворить своим гениальным кодом и почему ему не зашло использование метода тз.Скопировать()
|
|||
|
26
Кирпич
08.02.26
✎
12:46
|
(24) вово. в модуль с повторным использованием
|
|||
|
27
craxx
08.02.26
✎
15:18
|
(25) Да и нехай скопирует. Важно, что скопирует только ОДИН раз, а не кучу раз.
|
|||
|
28
ГдеСобака Зарыта
08.02.26
✎
15:44
|
(8) Сомнительно. Почему тогда поиск по выборке так жутко тормозит?
|
|||
|
29
Гипервизор
08.02.26
✎
17:38
|
(8) Кстати, слышал я, что выборка через объектную модель ведёт себя иначе. Но не проверял.
|
|||
|
30
Chai Nic
08.02.26
✎
17:40
|
(28) Не знаю, не приходилось по выборке искать.
Но эксперимент с огромными результатами запросов проводил. И потребление памяти после метода Выбрать() было практически таким же как и после метода Выгрузить(). |
|||
|
31
Asmody
08.02.26
✎
20:50
|
А МВТ в фоновое можно передать? Не охото лезть проверять
|
|||
|
32
CepeLLlka
08.02.26
✎
21:07
|
(10)ВайбКодинг :)
|
|||
|
33
zippygrill
09.02.26
✎
09:40
|
(9) годный вариант, под задачу конечно.
Дополню: если знаешь заранее что ТЗ будет большое, то сразу разбивай ее на части пропорциональным размером и потоками обрабатывай эти части. |
|||
|
34
unenu
09.02.26
✎
09:56
|
если тз типизирована, то в ВТ и примерно так...
ПодробностиВЫБРАТЬ ТаблицаНабораДанных.Ссылка КАК Товар, АВТОНОМЕРЗАПИСИ() КАК Номер ПОМЕСТИТЬ Вт_ТаблицаНабораДанных ИЗ Справочник.Номенклатура КАК ТаблицаНабораДанных ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПЕРВЫЕ 1505 // В реальном наборе ПЕРВЫЕ убрать Вт_ТаблицаНабораДанных.Товар КАК Товар, Вт_ТаблицаНабораДанных.Номер КАК Номер, ВЫБОР КОГДА &СтрокВПорции > 0 ТОГДА (ВЫРАЗИТЬ(Вт_ТаблицаНабораДанных.Номер / &СтрокВПорции - 0.5 КАК ЧИСЛО(15, 0))) + ВЫБОР КОГДА Вт_ТаблицаНабораДанных.Номер / &СтрокВПорции - (ВЫРАЗИТЬ(Вт_ТаблицаНабораДанных.Номер / &СтрокВПорции - 0.5 КАК ЧИСЛО(15, 0))) > 0 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ ИНАЧЕ 0 КОНЕЦ КАК Порция ИЗ Вт_ТаблицаНабораДанных КАК Вт_ТаблицаНабораДанных УПОРЯДОЧИТЬ ПО Номер |
|||
|
35
Толич
09.02.26
✎
09:46
|
(21) Тоже об этом подумал. Разбить на массивы и отправить в фоновые задачи.
|
|||
|
36
H A D G E H O G s
09.02.26
✎
10:38
|
(34) К черту полумеры!
Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ ПЕРВЫЕ 10000 | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка > &Ссылка | |УПОРЯДОЧИТЬ ПО | Ссылка"; ПоследняяСсылка=Справочники.Номенклатура.ПустаяСсылка(); Пока Истина Цикл Запрос.УстановитьПараметр("Ссылка",ПоследняяСсылка); МассивНаОбработку=Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); Если МассивНаОбработку.Количество()=0 Тогда Прервать; КонецЕсли; ПоследняяСсылка=МассивНаОбработку[МассивНаОбработку.ВГраница()]; ФоновыеЗадания.Выполнить("ОбработатьНоменклатуру",МассивНаОбработку); КонецЦикла; |
|||
|
37
АгентБезопасной Нацио
09.02.26
✎
10:59
|
(34) АВТОНОМЕРЗАПИСИ() не обязана нумеровать "с единицы"...
|
|||
|
38
unenu
09.02.26
✎
11:55
|
(37) это уже вопрос порядка, если он важен для алгоритма, то сначала формируем вт из тз, потом(в запросе) добиваемся правильного порядка и нумерации любым доступным методом в контексте СУБД.
если порядок не важен, а важно только только разбить тз на фиксированные подмножества для параллелизма, то по-барабану. |
|||
|
39
Гипервизор
09.02.26
✎
12:21
|
(36) А вторые 10к записей оставляем за бортом?
|
|||
|
40
Timon1405
09.02.26
✎
12:24
|
(39) Пока Истина Цикл
|
|||
|
41
aka MIK
09.02.26
✎
12:37
|
(36)
Номенклатура.Ссылка > &Ссылка
Прикольно |
|||
|
42
sikuda
09.02.26
✎
13:00
|
(36) Когда технологии пагинации в 1C нет, но очень хочется...
- 10000 Выполнить().Выгрузить() тогда норм. Да унификация в 1С доступа к данным убила всякие SQL OFFSET ... |
|||
|
43
АгентБезопасной Нацио
09.02.26
✎
13:33
|
(38) Это не "вопрос порядка". В (34), еали Автономерзаписи() начнет внезапно нумерацию с мильёна, первые порции будут пустыми.
|
|||
|
44
Галахад
гуру
09.02.26
✎
13:58
|
(41) Особенно если РИБ или сервер менял имя.
|
|||
|
45
PLUT
гуру
09.02.26
✎
14:41
|
(44) ссылка это жы ГУИД, из него даже датувремя создания сцылки можно получить (если установила сцылку нового сама 1С, а не получена из сторонней сисьтемы)
как "Особенно если РИБ или сервер" может изменить ссцылку? "имя" не считается так шта в (36) рабочий вариант (я тыщу раз так делал, когда порционно нужно обработать большой массив сцылок) GUID и вычисление(восстановление) даты из него тут автор (36) в далеком 2007 году ходил "потрошить GUID" |
|||
|
46
PLUT
гуру
09.02.26
✎
14:56
|
(40)
Если Ложь Тогда ...тут переопределение переменной... КонецЕсли |
|||
|
47
H A D G E H O G s
09.02.26
✎
15:01
|
(44) в чем затруднения?
|
|||
|
48
Галахад
гуру
09.02.26
✎
15:02
|
(45) В данном случае не влияет.
А в общем случае сортировать в ГУИД не стоит. Последняя группа символов в ГУИД это MAC-адрес сервера. |
|||
|
49
Галахад
гуру
09.02.26
✎
15:02
|
(47) Написал в (48)
|
|||
|
50
PLUT
гуру
09.02.26
✎
15:13
|
(48) ну и как адрес ссылки (ссуть ГУИД) у ссылки может поменяться?
ну разве что в моменте чисто гипотетически "по РИБ" ссылка прилетит в "начало" сортировки (мало вероятно)? ну тады ой, эту ссылку не обработали. в следующий раз точно получится! (ну или в момент работы обормотки нужно не делать обмены по РИБ) |
|||
|
51
H A D G E H O G s
09.02.26
✎
15:19
|
(48) почему сортировать по guid не стоит?
|
|||
|
52
H A D G E H O G s
09.02.26
✎
15:20
|
(50) вот тут подойдет исключительная блокировка на спр. до окончания выгрузки.
|
|||
|
53
Chai Nic
09.02.26
✎
15:24
|
(42)
"Да унификация в 1С доступа к данным убила всякие SQL OFFSET ..." Где гарантия, что между выполнением двух запросов с заданным диапазоном выдачи состояние базы не изменится? А поскольку СУБД в 1с блокировочная, а не версионная, то это потребует наложения блокировки на все таблицы, участвующие в запросе. Что чревато сами понимаете чем. А если в запросе и хранимые процедуры задействованы - тогда вообще жесть, всю базу надо блокировать для обеспечения повторяемости чтения, ибо фиг знает куда там в этих хранимках лезут. Был бы версионник - другое дело.. |
|||
|
54
Гипервизор
09.02.26
✎
15:23
|
(40) Проглядел, интересный подход.
|
|||
|
55
TTimur
09.02.26
✎
15:41
|
(40) из за такой фигни у нас под одним пользователем в типовой рознице зависон минут на 10-15 при попытке нажать на пункт меню "разрешить редактирование" в справочнике "Кассы ККМ". Вот хз почему-то у всех остальных 5 админских учеток все норм.
|
|||
|
56
unenu
09.02.26
✎
15:47
|
(43) протестировал - количество порций неизменно.
а вот номера порций масштабированы не от 1, а от масштаба старта нумерации... 1 000 001 ......... 1 000 002 Зная, обратившись к первой строке (или максимум), первый номер порции - можно также "разложить" таблицу на подмножества порций. Немного больше кода для старта фоновых будет не лишним для отработки этой особенности. |
|||
|
57
Кирпич
09.02.26
✎
22:27
|
(36) Можно еще в фоновое задание сразу передавать результат запроса вместо тз. он тоже сериализуется. Ну и менеджер временных таблиц использовать, чтобы не бомбить сильно сервер БД
|
|||
|
58
АгентБезопасной Нацио
10.02.26
✎
08:23
|
(56) Да, решение простое. Просто о том, что Автономер может быть не с 1, и это нужно учитывать - часто забывают.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |