|   |   | 
| 
 | Оптимизация кода ↓ (Волшебник 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) так и маниакально бороться с запросами в цикле тоже не всегда правильно. Иногда множество запросов в цикле это лучше, чем один гигантский запрос     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |