Имя: Пароль:
1C
1С v8
Оптимизация кода
🠗 (Волшебник 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) так и маниакально бороться с запросами в цикле тоже не всегда правильно. Иногда множество запросов в цикле это лучше, чем один гигантский запрос
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс