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

Хранилище

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

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



> Замер продуктивности. Почему так? , Разный вес на ту же строку          
vbi Подменю пользователя
сообщение 30.04.20, 7:47
Сообщение #1

Оратор
Иконка группы
Группа: Местный
Сообщений: 373
Из: Украина, Луцк
Спасибо сказали: 72 раз
Рейтинг: 0

1С:Предприятие 8.3 (8.3.14.1976)
"Управление торговым предприятием для Украины", редакция 1.2. (1.2.54.1)

Почему так?


Signature
Впроваджую, супроводжую

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

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

кеш , видимо

Vofka Подменю пользователя
сообщение 30.04.20, 8:28
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Если вы делали этот замер несколько раз и у вас стабильно нижняя цифра меньше, можно сделать какие-то предположения о том, что операция сравнения с 0 в каких-то случаях для 1С тяжелее, чем операция присваивания. Вы выделили на картинке конкретную переменную, но замер ведь показывается по строке. Это же можно видеть в блоке Если ниже. Или вопрос в чем-то другом?

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

Говорящий
***
Группа: Пользователи
Сообщений: 70
Из: Киев
Спасибо сказали: 25 раз
Рейтинг: 0

Первое обращение через точку (Ссылка.ИтогВес) считает документ из базы, дальше он кэшируется, насколько я помню на 20 секунд, поэтому второе обращение не запрашивает его повторно.

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

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

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

1. Обращаясь через точку к реквизиту, мы обращаемся в БД за всей таблицей с данными, а нам нужны конкретные. В Вашем случае с диска в память тянутся все реквизиты из таблицы в которой хранятся реквизиты шапки и если там пару реквизитов, то может быстро отработать, а если документ сложный, то вот весь он и помещается в память, а потом Вам возвращается только одно значение. Дальнейшее обращение к этому же реквизиту возвращает уже значение, которое находится в оперативной памяти, поэтому отрабатывает быстро.
2. Обращение через точку это запрос. В описанной процедуре это запрос в цикле, а при скролинге списка имеем постоянный запрос в цикле, что конечно отражается на быстродействии работы с формой

По правильному необходимо заполнить ИтогВес в данных и выводить в списке уже стандартно.
Если же нет возможности хранить (а такое вполне бывает) ,то я б использовал следующую схему:

// 1. подготавливаем таблицы для оформления строк
тз = Новый ТаблицаЗначений;
тз.Колонки.Добавить("Ссылка");
тз.Колонки.Добавить("СтрокаОформления");
тз.Индексы.Добавить("Ссылка");
спДокументов = Новый СписокЗначений;

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

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

РезультатЗапроса = Запрос.Выполнить();

// 3. Обходим запрос, находим строку оформления по ссылке и делаем в ней то что нужно
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        ПараметрыОтбора = Новый Структура;
        ПараметрыОтбора.Вставить("Ссылка", Выборка.Ссылка);
        НайденныеСтроки = тз.НайтиСтроки(ПараметрыОтбора);
        Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
            СтрокаОформления = НайденнаяСтрока.СтрокаОформления;
            Если Выборка.ВесПоШапке > 0 Тогда
                ВесИтого = Выборка.ВесПоШапке;
            Иначе
                ВесИтого = Выборка.ВесПоСтрокам;
            КонецЕсли;
            Строкаоформления.Ячейки.Вес.Значение = ВесИтого;
        КонецЦикла;
    КонецЦикла;
КонецЕсли;


Описал для веса, в том же запросе получаем и другую информацию.

В итоге имеем один запрос вместо кучи (это условно конечно, т.к. всё таки он будет выполняться при любом скролинге списка) и этот запрос вытягивает только интересующие нас данные, а не все подряд

Сообщение отредактировал Batchir - 12.05.20, 11:54

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


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

 

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