Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Оптимизация запроса остатков по складам для Перемещения          
bizisoft Подменю пользователя
сообщение 02.02.16, 10:10
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 242
Из: Донецк
Спасибо сказали: 19 раз
Рейтинг: 0

Здравствуйте.
Наши креативщики не унимаются и желают видеть в макете документа ПеремещениеТовароа дополнительные столбцы с остатками по складам, якобы, чтобы можно было видеть остаток.
Хотели видеть по всем складам, но уговорил только чтобы были остатки складов Отправитель и Получатель.

Сначала сделал через такой запрос (вернее два запроса для склада отправитель и склада получатель):
                Запрос = Новый Запрос;
        Запрос.Текст =
           "ВЫБРАТЬ
           |    ОстаткиТоваровКомпанииОстатки.Номенклатура,
           |    ОстаткиТоваровКомпанииОстатки.СкладКомпании,
           |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
           |ИЗ
           |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
           |ГДЕ
           |    ОстаткиТоваровКомпанииОстатки.Номенклатура = &Номенклатура
           |    И ОстаткиТоваровКомпанииОстатки.СкладКомпании = &СкладКомпании";            

        Запрос.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
        Запрос.УстановитьПараметр("СкладКомпании", ЭтотОбъект.СкладКомпании);
        
        Выборка = Запрос.Выполнить().Выбрать();
        ОстатокНаСкладе = 0;
        Пока Выборка.Следующий() Цикл    
            ОстатокНаСкладе = Выборка.КоличествоОстаток;
        КонецЦикла;
                ОбластьТовар.Параметры.Остаток = ОстатокНаСкладе;  
                ....  // Тут выполняется второй запрос для склада получателя
        ОбластьТовар.Параметры.ОстатокПолуч = ОстатокПолучатель;
                // Далее выводится строка в печатную форму


Работает, но долго, особенно если перемещение большое.
Потом оптимизировал его до такого вида:
                Запрос = Новый Запрос;
        Запрос.Текст =           
            "ВЫБРАТЬ
            |    ОстаткиТоваровКомпанииОстатки.Номенклатура,
            |    ОстаткиТоваровКомпанииОстатки.СкладКомпании,
            |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
            |ИЗ
            |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
            |ГДЕ
            |    ОстаткиТоваровКомпанииОстатки.Номенклатура = &Номенклатура
            |    И (ОстаткиТоваровКомпанииОстатки.СкладКомпании = &СкладКомпанииОтпр
            |    ИЛИ ОстаткиТоваровКомпанииОстатки.СкладКомпании = &СкладКомпанииПолуч)
            |
            |СГРУППИРОВАТЬ ПО
            |    ОстаткиТоваровКомпанииОстатки.СкладКомпании,
            |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
            |    ОстаткиТоваровКомпанииОстатки.Номенклатура";

        Запрос.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);        
        Запрос.УстановитьПараметр("СкладКомпанииОтпр", ЭтотОбъект.СкладКомпании);
        Запрос.УстановитьПараметр("СкладКомпанииПолуч", ЭтотОбъект.СкладПолучатель);

        Выборка = Запрос.Выполнить().Выбрать();
        ОстатокНаСкладе = 0;
        Пока Выборка.Следующий() Цикл    
            Если Выборка.СкладКомпании = ЭтотОбъект.СкладКомпании Тогда
                ОстатокНаСкладе = Выборка.КоличествоОстаток;
            ИначеЕсли Выборка.СкладКомпании = ЭтотОбъект.СкладПолучатель Тогда
                ОстатокПолучатель = Выборка.КоличествоОстаток;
            КонецЕсли;
        КонецЦикла;
        ОбластьТовар.Параметры.Остаток = ОстатокНаСкладе;  
        ОбластьТовар.Параметры.ОстатокПолуч = ОстатокПолучатель;
                // Далее выводится строка в печатную форму


Время формирования печатной формы сократилось, но все-равно долго.

Подскажите пожалуйста, возможно-ли оптимизировать запрос еще, чтобы он не выполнялся каждый раз для каждой строки табличной части, а выполнился один раз для всего товара табличной части и двух складов, а разбор результата уже произвести в цикле?
Можно-ли позиции табличной части поместить в список и передать этот список в запрос в качестве параметра или саму табличную часть передать как параметр?

С Уважением, Дмитрий.


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

sava1 Подменю пользователя
сообщение 02.02.16, 10:29
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2693
Из: Проскуров
Спасибо сказали: 682 раз
Рейтинг: 661

Все условия в параметры ВТ, группировку убрать

+ номенклатуру сразу всю в запрос

СпЗначений = ТаблЧасть.Выгрузить(,"Номенклатура");
....
...УстановитьПараметр("СпНоменклатура",СпЗначений);

в запросе Номенклатура в (&СпНоменклатура)

Спасибо сказали: bizisoft,

bizisoft Подменю пользователя
сообщение 02.02.16, 10:37
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 242
Из: Донецк
Спасибо сказали: 19 раз
Рейтинг: 0

Цитата(sava1 @ 02.02.16, 11:29) *
Все условия в параметры ВТ, группировку убрать

Можно уточнить ВТ это временная таблица или что-то другое?


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

sava1 Подменю пользователя
сообщение 02.02.16, 10:48
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2693
Из: Проскуров
Спасибо сказали: 682 раз
Рейтинг: 661

ВТ это виртуальная таблица (Остатков/оборотов)

Petre Подменю пользователя
сообщение 02.02.16, 11:00
Сообщение #5

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1148 раз
Рейтинг: 1230.2

Запрос.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);

Вы же не в цикле такой запрос делаете?


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

bizisoft Подменю пользователя
сообщение 02.02.16, 11:04
Сообщение #6

Завсегдатай
****
Группа: Пользователи
Сообщений: 242
Из: Донецк
Спасибо сказали: 19 раз
Рейтинг: 0

Цитата(Petre @ 02.02.16, 12:00) *
Вы же не в цикле такой запрос делаете?

Понимаю, что 47067070.gif , поэтому и решил оптимизировать его, т.к. когда срочно реализовывал хотелку 09000000.gif , ничего другого в голову не пришло 64000000.gif


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

bizisoft Подменю пользователя
сообщение 02.02.16, 14:26
Сообщение #7

Завсегдатай
****
Группа: Пользователи
Сообщений: 242
Из: Донецк
Спасибо сказали: 19 раз
Рейтинг: 0

Все прекрасно получилось.
Выкладываю свой запрос:
    ...
    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОстаткиТоваровКомпанииОстатки.Номенклатура,
        |    ОстаткиТоваровКомпанииОстатки.СкладКомпании,
        |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
        |ПОМЕСТИТЬ ОстОтпрПолуч
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
        |ГДЕ
        |    ОстаткиТоваровКомпанииОстатки.Номенклатура В(&СпНоменклатура)
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ОстОтпрПолуч.Номенклатура,
        |    ОстОтпрПолуч.СкладКомпании,
        |    ОстОтпрПолуч.КоличествоОстаток
        |ИЗ
        |    ОстОтпрПолуч КАК ОстОтпрПолуч
        |ГДЕ
        |    ОстОтпрПолуч.СкладКомпании = &СкладОтпр
        |    ИЛИ ОстОтпрПолуч.СкладКомпании = &СкладПолуч";
    СпЗначений = ВыборкаТабличнойЧасти.Выгрузить(,"Номенклатура");     // Помещаем табл.часть в список
    Запрос.УстановитьПараметр("СпНоменклатура", СпЗначений);        // Передаем список в качестве параметра
    Запрос.УстановитьПараметр("СкладОтпр", ЭтотОбъект.СкладКомпании);    // Отбор по складу отправителю
    Запрос.УстановитьПараметр("СкладПолуч", ЭтотОбъект.СкладПолучатель);// и складу получателю    
    ВыборкаОстатков = Запрос.Выполнить().Выбрать();
    // Выгружаю в ТЗ результат выборки для дальнейшего поиска в цикле перебора ТЧ номенклатуры
    ВыбОст = Новый ТаблицаЗначений;
    ВыбОст.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура") );
    ВыбОст.Колонки.Добавить("ОстатокСкладОтправитель", Новый ОписаниеТипов("Число") );
    ВыбОст.Колонки.Добавить("ОстатокСкладПолучатель", Новый ОписаниеТипов("Число") );
    ВыбОст.Очистить(); // Очищаем Табл.Знач. от мусора    
    Пока ВыборкаОстатков.Следующий() Цикл
        НоваяСтрока = ВыбОст.Добавить();
        НоваяСтрока.Номенклатура = ВыборкаОстатков.Номенклатура;
        Если ВыборкаОстатков.СкладКомпании = ЭтотОбъект.СкладКомпании Тогда
            НоваяСтрока.ОстатокСкладОтправитель = ВыборкаОстатков.КоличествоОстаток;
            НоваяСтрока.ОстатокСкладПолучатель = 0;
        ИначеЕсли ВыборкаОстатков.СкладКомпании = ЭтотОбъект.СкладПолучатель Тогда
            НоваяСтрока.ОстатокСкладОтправитель = 0;
            НоваяСтрока.ОстатокСкладПолучатель = ВыборкаОстатков.КоличествоОстаток;                                          
        КонецЕсли;          
    КонецЦикла;    
    ВыбОст.Свернуть("Номенклатура","ОстатокСкладОтправитель, ОстатокСкладПолучатель");      
    // Перебираем табличную часть перемещения и формируем строки для вывода на печать
    Для Каждого СтрокаТабличнойЧасти Из ВыборкаТабличнойЧасти Цикл        
        ...
        ОбластьТовар.Параметры.ТоварНаименование = СтрокаТабличнойЧасти.Номенклатура.Наименование;
        // Поиск текущего товара в ТЗ с остатками        
        НайденаСтрока = ВыбОст.Найти(СтрокаТабличнойЧасти.Номенклатура, "Номенклатура");
        ОстатокНаСкладе =0;
        ОстатокПолучатель=0;
        Если НайденаСтрока = Неопределено Тогда
            Сообщить("НЕ НАЙДЕНО");
        Иначе
            ОстатокНаСкладе   = НайденаСтрока.ОстатокСкладОтправитель;
            ОстатокПолучатель = НайденаСтрока.ОстатокСкладПолучатель;
        КонецЕсли;         
        ОбластьТовар.Параметры.Остаток = ОстатокНаСкладе;  
        ОбластьТовар.Параметры.ОстатокПолуч = ОстатокПолучатель;
        ...
           ТабличныйДокумент.Вывести(ОбластьТовар);            
    КонецЦикла;    
    МенеджерВременныхТаблиц.Закрыть();  // Удаление ВременнойТаблицы


Взял для сравнения Перемещение на 52 строки, нажал Печать и начал отсчет (без секундомера), так на вскидку 1, 2, 3 ...
От момента нажатия Печать и до Появления печатной формы получилось:
До оптимизации - 26 с или 0,5с/строку
После оптимизации - 2 с или 0,038с/строку.

Всем Большое спасибо за помощь.


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

Zaval Подменю пользователя
сообщение 02.02.16, 14:32
Сообщение #8

Крутой
Иконка группы
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0

Цитата(bizisoft @ 02.02.16, 14:26) *
так на вскидку 1, 2, 3 ...

Оффтоп. smile.gif
Если говорить вслух - это будет по полсекунды. Чтобы получились секунды, надо считать "21, 22, 23".

Сообщение отредактировал Zaval - 02.02.16, 14:33

sava1 Подменю пользователя
сообщение 02.02.16, 14:39
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2693
Из: Проскуров
Спасибо сказали: 682 раз
Рейтинг: 661

Да - оптимизация "офигеть".
Жаль - нет внешних источников, АДО и остальных примочек.

Petre Подменю пользователя
сообщение 02.02.16, 14:40
Сообщение #10

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1148 раз
Рейтинг: 1230.2

Запрос.Текст = 
        "ВЫБРАТЬ
        |    ОстаткиТоваровКомпанииОстатки.Номенклатура,
        |    ОстаткиТоваровКомпанииОстатки.СкладКомпании,
        |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(
        |            ,
        |            Номенклатура В (&СпНоменклатура)
        |                И СкладКомпании В (&СкладОтпр, &СкладПолуч)) КАК ОстаткиТоваровКомпанииОстатки";


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

sava1 Подменю пользователя
сообщение 02.02.16, 14:43
Сообщение #11

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2693
Из: Проскуров
Спасибо сказали: 682 раз
Рейтинг: 661

Да здесь надо бы еще ИТОГИ показать человеку и Параметры.Заполнить...(строкаВыборки);

bizisoft Подменю пользователя
сообщение 02.02.16, 15:24
Сообщение #12

Завсегдатай
****
Группа: Пользователи
Сообщений: 242
Из: Донецк
Спасибо сказали: 19 раз
Рейтинг: 0

Цитата(Zaval @ 02.02.16, 15:32) *
Если говорить вслух - это будет по полсекунды. Чтобы получились секунды, надо считать "21, 22, 23".

Если быть точным, то дело было так: "и-и раз", "и-и два", "и-и три" rulez.gif

Цитата(Petre @ 02.02.16, 15:40) *
Запрос.Текст =         "ВЫБРАТЬ
        |    ОстаткиТоваровКомпанииОстатки.Номенклатура,
        |    ОстаткиТоваровКомпанииОстатки.СкладКомпании,
        |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(
        |            ,
        |            Номенклатура В (&СпНоменклатура)
        |                И СкладКомпании В (&СкладОтпр, &СкладПолуч)) КАК ОстаткиТоваровКомпанииОстатки";


Я правильно понимаю этот запрос получает, тоже самое что и мой, только без временной таблицы? upset.gif




Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

sava1 Подменю пользователя
сообщение 02.02.16, 15:31
Сообщение #13

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2693
Из: Проскуров
Спасибо сказали: 682 раз
Рейтинг: 661

Да - это оптимальный запрос.

+ если в выборку добавить ИТОГИ - не надо будет сворачивать таблицу, а если колонки назвать так-же как Параметры,
то не надо прописывать заполнение параметров по-отдельности.

bizisoft Подменю пользователя
сообщение 02.02.16, 15:36
Сообщение #14

Завсегдатай
****
Группа: Пользователи
Сообщений: 242
Из: Донецк
Спасибо сказали: 19 раз
Рейтинг: 0

sava1 @ Сегодня, 16:29 *,
А можете пояснить вот эту запись, а то не совсем понятно.
Если с Номенклатура В (&СпНоменклатура) и СкладКомпании В (&СкладОтпр, &СкладПолуч) как бы понятно, то что означает запятая какой-то пустой параметр?

        |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(
        |            ,
        |            Номенклатура В (&СпНоменклатура)
        |                И СкладКомпании В (&СкладОтпр, &СкладПолуч)) КАК ОстаткиТоваровКомпанииОстатки";


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

sava1 Подменю пользователя
сообщение 02.02.16, 15:41
Сообщение #15

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2693
Из: Проскуров
Спасибо сказали: 682 раз
Рейтинг: 661

Первый параметр - Дата остатков. Если пустая - значит берем актуальные значения.

Спасибо сказали: bizisoft,

bizisoft Подменю пользователя
сообщение 02.02.16, 15:44
Сообщение #16

Завсегдатай
****
Группа: Пользователи
Сообщений: 242
Из: Донецк
Спасибо сказали: 19 раз
Рейтинг: 0

sava1 @ Сегодня, 16:41 *,
Век живи - век учись.
А я тут чешу левое ухо правой рукой через голову crazy.gif .
Мне остается только одно 32542620.gif

P.S. Одно радует научился работать в ВТ 433.gif


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 27.05.24, 15:48
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!