|
Оптимизация кода 🠗 (Волшебник 13.09.2022 22:49) | ☑ | ||
---|---|---|---|---|
0
Лиза777
13.09.22
✎
18:29
|
ДД! Подскажите как оптимальней - в цикле перебираю номенклатуру и составляю текстовый файл с её характеристиками. Туда например беру ширину, высоту, вес, картинки, беру только то, что есть на остатках. Пока на каждую позицию в цикле делаю отдельный запрос для получения всего этого. То есть - беру 1й товар, делаю по нему запрос на остатки и делаю определённые действия с этой цифрой, потом запросом получаю картинку по этому товару, затем функция мне возвращает габариты товара, потом запросос нахожу штрихкод товара и т.п.
Я вот думаю, что если сразу всё получить запросом по всему справочнику Номенклатура и выгрузить в Таблицу Значений, а потом обращаться к ней каждый раз оптимальней ли? ведь в оперативке постоянно висит большой объём... |
|||
1
Волшебник
модератор
13.09.22
✎
18:30
|
Будет быстрее, а памяти на компах сейчас много. Если не хватит, то ОС выдаст место в файле подкачки
|
|||
2
lubitelxml
13.09.22
✎
18:38
|
(0) конечно оптимальнее будет 1 раз одним запросом все получить, далее можно и без ТЗ (непонятно зачем она вообще) - просто обходишь выборку, и там пишешь в файл уже
|
|||
3
Лиза777
13.09.22
✎
18:53
|
спасибо, переделаю
|
|||
4
vi0
13.09.22
✎
18:57
|
(3) причем писать нужно не ТекстовымДокументом, а ЗаписьюТекста
|
|||
5
vicof
13.09.22
✎
18:59
|
В нескольких фоновых заданиях со своей порцией данных.
|
|||
6
Garykom
гуру
13.09.22
✎
19:02
|
(5) +1
Т.е. не один запрос а порциями, например можно по коду делить Каждое фоновое пишет в свой текстовый файл, затем их слить вместе |
|||
7
Конструктор1С
13.09.22
✎
19:17
|
Если по времени всё устраивает, то не заморачивайся с переписыванием запроса. Бесконтрольный расход памяти тоже ничего хорошего
|
|||
8
ansh15
13.09.22
✎
19:33
|
Так, на всякий случай УТ 11, выгрузка на сайт.. Недостаточно памяти (Порции всего по 5000 позиций)
Любит писать "недостаточно памяти", обычно это пугает... |
|||
9
Мультук
гуру
13.09.22
✎
19:33
|
(0)
Сколько всего номенклатуры? Количество записей ? P.S. Ну какие фоновые? Человек пытается уйти от запроса в цикле, а вы сразу ему синхрофазотрон. |
|||
10
RomanYS
13.09.22
✎
19:34
|
(5) (6) перепись извращенцев)
|
|||
11
Курцвейл
13.09.22
✎
19:43
|
Какой еще запрос? Для таких случаев как раз используют метод менеджера.
СправочникМенеджер.<Имя справочника> (CatalogManager.<Catalog name>) Выбрать (Select) Синтаксис: Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>) |
|||
12
Курцвейл
13.09.22
✎
19:45
|
Всем советчикам выше ставим двойку по знанию основ платформы 1С :))
СправочникВыборка.<Имя справочника> (CatalogSelection.<Catalog name>) Описание: Объект этого типа возвращается методами Выбрать и ВыбратьИерархически у объекта типа СправочникМенеджер.<Имя справочника> и представляет собой специализированный способ перебора элементов справочника. Обход элементов выполняется системой динамически. Это означает, что использование выборки не считывает все элементы сразу, а выбирает их порциями из базы данных. Такой подход позволяет достаточно быстро обходить с помощью выборки большие списки справочников и не загружает в память всех элементов выборки. |
|||
13
Kassern
13.09.22
✎
19:52
|
(12) гениально!)) А теперь расскажите, какая разница между выборки данных из запроса и выборки из справочника?)
Все верно вначале написали. Делаете запрос и в нем получаете всю необходимую информацию. Вангую, будет достаточно регистра свободных остатков, возможно еще и таблица упаковок для (ширину, высоту, вес). |
|||
14
mistеr
13.09.22
✎
20:01
|
(13) Разница в том, что выборка из результатов запроса загружает всю выборку в оперативную память, а выборка из справочника нет.
|
|||
15
Kassern
13.09.22
✎
20:04
|
(14) а вы уверены, что выборка запроса загружает всю оперативную память? Да и к тому же ТСу нужны остатки, а не вся номенклатура. Куда больше памяти сожрет запрос в цикле со 100500 запросами к остаткам и упаковкам.
|
|||
16
Курцвейл
13.09.22
✎
20:04
|
(14) Вот именно! Получаем данные справочника порциями. А для остатков используем кэшированный запрос в котором меняем параметр.
|
|||
17
Мультук
гуру
13.09.22
✎
20:04
|
(11)
Расскажите это людям которые пишут километровые запросы в типовых УТ и ЕРП и выгружают их в таблицы значений |
|||
18
Курцвейл
13.09.22
✎
20:05
|
(15) Запрос в цикле не сожрет память если это будет один и тот же запрос, в котором будем менять только параметр.
|
|||
19
Курцвейл
13.09.22
✎
20:06
|
(17) Там другое. Там подход примерно такой - считаем что мы не ограничены вычислительными мощностями, потому что они дешевеют день ото дня.
|
|||
20
Kassern
13.09.22
✎
20:09
|
Вы так боретесь за память и вообще не в курсе за объемы данных ТС. Только помимо памяти, есть еще и время выполнения. Такой цикл со 100500 номенклатурами и несколькими запросами внутри может отрабатывать кратно дольше чем один простой запрос без цикла
|
|||
21
mistеr
13.09.22
✎
20:12
|
С остатками конечно деваться некуда, только запрос.
Если есть опасения, что выборка может получиться слишком большой, можно добавить ПЕРВЫЕ 10000. |
|||
22
Курцвейл
13.09.22
✎
20:13
|
(20) Откуда такой вывод? Курсор на остатках всегда открыт, пока идет выборка. Чем это отличается от запроса через соединение?
|
|||
23
Kassern
13.09.22
✎
21:06
|
(22) Из личного опыта. Можете протестировать что быстрее - 1 запрос к свободным остаткам, где из 1кк номенклатуры, с остатками 50тыс. позиций. Или же 1 лям раз сделать запрос к таблице свободных остатков, чтобы в итоге получить таблицу с 50тыс позициями номенклатуры.
|
|||
24
Волшебник
модератор
13.09.22
✎
22:50
|
(10) Текущая перепись иностранных агентов произведена. Продолжайте наблюдениею
|
|||
25
timurhv
13.09.22
✎
23:33
|
(15) Вот ссылка по поводу помещения выборки в ОЗУ:
https://its.1c.ru/db/v8std/content/725/hdoc |
|||
26
Kassern
14.09.22
✎
00:06
|
(25) Я в курсе, по поводу порционного запроса, только это не всегда актуально. Конечно, когда речь идет о сотнях тысяч, или о миллионах строк, тогда да, в цикле получаешь порциями, пока весь объем не обойдешь. Только вот конструкция Справочники.Номенклатура.Выбрать() в контексте текущей задачи вряд ли сильно оптимизирует используемую память, но скорее всего, кратно увеличит время выполнения.
|
|||
27
Конструктор1С
14.09.22
✎
18:29
|
(26) так и маниакально бороться с запросами в цикле тоже не всегда правильно. Иногда множество запросов в цикле это лучше, чем один гигантский запрос
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |