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

Хранилище

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

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

> Как можно оптимизировать обработку табличной части документа          
bizisoft Подменю пользователя
сообщение 02.09.18, 20:44
Сообщение #1

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

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

Есть такой документ как Изменение цен компании, в котором устанавливаются цены для товаров в разрезе выбранного типа цен.
Например: у поставщика куплен товар, проведена приходная накладная. В Изменение цен компании выбирается эта приходная как документ основание и заполняется ТЧ по документу основания.
В ТЧ отображаются старая цена (которая была установлена ранее), базовая цена (цена из приходной), себестоимость (судя по значениям это итоговая себестоимость товара), а также % наценки, сумма наценки и Новая цена.

Добавил поле ПредыдущаяСебестоимость, в которую вывожу себестоимость товара, но без учета товара из приходной, т.е. делаю выборку по партиям до даты приходной накладной.
Все это действие выполняю в процедуре ПриПолученииДанных - все вроде работает, но тормоза при этом неописуемые.
При любом чихе (изменение данных, простая смена строки) происходит проход по ТЧ и выполнение запроса для каждой строки, что не по феншую.

...
        Если РасчетЦенОт=1 Тогда            
            Если НЕ ДокументОснование.Пустая() Тогда    
                ДокОсн = ДокументОснование.Ссылка;
                //Сообщить(ДокОсн.Номер);
                //Сообщить(ДокОсн.Дата);
                //Сообщить(ДокОсн.Номер);
                ЗапросПартии = Новый Запрос;                      
                ЗапросПартии.Текст =
                    "ВЫБРАТЬ
                    |    ПартииТоваровКомпанииОстатки.Номенклатура,
                    |    ПартииТоваровКомпанииОстатки.СуммаУпрОстаток / ПартииТоваровКомпанииОстатки.КоличествоОстаток КАК Себест
                    |ИЗ
                    |    РегистрНакопления.ПартииТоваровКомпании.Остатки КАК ПартииТоваровКомпанииОстатки
                    |ГДЕ
                    |    ПартииТоваровКомпанииОстатки.Номенклатура = &Номенклатура
                    |    И ПартииТоваровКомпанииОстатки.Партия.Дата < &Дата";                 
                ЗапросПартии.УстановитьПараметр("Номенклатура",ДанныеСтроки.Номенклатура);         
                ЗапросПартии.УстановитьПараметр("Дата",ДокОсн.Дата);         
                Результат = ЗапросПартии.Выполнить();
                ТЗ = Результат.Выгрузить();
                //ТЗ.Свернуть("Номенклатура","Себест");
                Сумма = 0;
                КолВо = 0;
                Для Каждого Стр Из ТЗ Цикл
                //Выб = Результат.Выбрать();
                //ПредыдущаяСебестоимость = 0;
                //Пока Выб.Следующий() Цикл
                    //Сообщить(Выб.Номенклатура);
                    //Сообщить(Выб.Себест);
                    Сумма = Сумма+Стр.Себест;
                    КолВо = КолВо+1;
                    Сообщить(Сумма);
                    Сообщить(КолВо);
                    //ПредыдущаяСебестоимость = Выб.Себест; //ЗапросПартии.Выполнить().Выгрузить()[0][1];//.Себест;
                    //Сообщить(ПредыдущаяСебестоимость);
                КонецЦикла;
                Попытка
                    ПредыдущаяСебестоимость = Сумма/КолВо;
                Исключение
                    ПредыдущаяСебестоимость = 0;
                КонецПопытки;
                ОформлениеСтроки.Ячейки.ПредыдущаяСебестоимость.ОтображатьТекст=Истина;
                ОформлениеСтроки.Ячейки.ПредыдущаяСебестоимость.Текст=Формат(ПредыдущаяСебестоимость,"ЧЦ=15; ЧДЦ=2");
            КонецЕсли;            
        КонецЕсли;            
...


Подскажите пожалуйста как можно оптимизировать этот процесс?


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

bizisoft Подменю пользователя
сообщение 03.09.18, 1:53
Сообщение #2

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

bizisoft @ Вчера, 21:44 * ,
Получилось немного доработать посредством вынесения запроса из цикла
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл

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



Насколько такое решение верно или есть более изысканные способы?


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

andr_andrey Подменю пользователя
сообщение 03.09.18, 9:34
Сообщение #3

Оратор
Иконка группы
Группа: Местный
Сообщений: 460
Спасибо сказали: 106 раз
Рейтинг: 81.6

bizisoft @ Сегодня, 2:53 * ,


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

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

Крутой
Иконка группы
Группа: Местный
Сообщений: 1986
Из: Проскуров
Спасибо сказали: 460 раз
Рейтинг: 450.4

добавить в тз индекс по номенклатуре

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

andr_andrey Подменю пользователя
сообщение 03.09.18, 13:12
Сообщение #5

Оратор
Иконка группы
Группа: Местный
Сообщений: 460
Спасибо сказали: 106 раз
Рейтинг: 81.6

Использование виртуальной таблицы "Остатки" без параметров - странно.
Если данных очень много, то возможно не стоит на клиента тащить таблицу значений, а использовать объект "Выборка".
Хотите ускорения поиска в остатках, надо понимать сколько их будет. Вполне возможно, придётся использовать не только "тз с индексом", а и хеш-таблицу (Соответствие).


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

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

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

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

andr_andrey @ Сегодня, 14:12 * ,
Данных очень много - сколько считается много? Предположительно в ТЧ может быть 10000 строк, допускаю до 40000 строк, что маловероятно, т.к. это вся номенклатура.
Забыл написать база файловая.
А можно уточнить, что имеется ввиду под хеш-таблицей (Соответствие)?


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

andr_andrey Подменю пользователя
сообщение 03.09.18, 19:30
Сообщение #7

Оратор
Иконка группы
Группа: Местный
Сообщений: 460
Спасибо сказали: 106 раз
Рейтинг: 81.6

bizisoft @ Сегодня, 19:21 * ,
Прошу прощения у администратора за кросс-линки, но по другому переписывать нет смысла:
[необходимо зарегистрироваться для просмотра ссылки]
[необходимо зарегистрироваться для просмотра ссылки]
[необходимо зарегистрироваться для просмотра ссылки]
[необходимо зарегистрироваться для просмотра ссылки]


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

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

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


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

 

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

Курсы валют: доллар США к гривне Курсы валют: евро к гривне Курсы валют: российский рубль к гривне