|
v7: Можно ли ускорить глВернутьЦену() | ☑ | ||
---|---|---|---|---|
0
zenon46
05.04.19
✎
12:25
|
Доброго дня!
Снова немного некрофилии, начал притормаживать справочник Номенклатура, и в частности выборка цен, через глВернутьЦену, там реализован тупо перебор справочника ТипыЦен по владельцу, короче долго. Наткнулся вот на это http://catalog.mista.ru/public/76337/, но не завелась, спится в ошибку. Идея типы не использовать выборку "Пока ЦеныНоменклатуры.ПолучитьЭлемент() = 1 Цикл", за менить на НайтиПоРеквизиту, думаю не даст выигрыша. Может есть у кого рабочий пример этой функции ? |
|||
1
1Сергей
05.04.19
✎
12:27
|
Для списка лучше сделать функцию получения всех цен за одно обращение к базе
|
|||
2
Kigo_Kigo
05.04.19
✎
12:27
|
Запрос к переодике?
|
|||
3
VladZ
05.04.19
✎
12:28
|
(0) переход на НайтиПоРеквизиту улучшит ситуацию. Если нужно еще быстрее - переходи на прямые запросы.
|
|||
4
Garykom
гуру
05.04.19
✎
12:28
|
Эээ в 77 как бы есть запросы, конечно они очень специфичные но при правильном употреблении работают сильно шустрее чем прямой доступ через курсоры.
|
|||
5
1Сергей
05.04.19
✎
12:28
|
Ну, и текст ошибки не конфиденциальная информация же :)
|
|||
6
Вафель
05.04.19
✎
12:28
|
на прямом скл если написать, то можно
|
|||
7
Вафель
05.04.19
✎
12:29
|
а ну собственно это и есть в (0)
|
|||
8
Garykom
гуру
05.04.19
✎
12:30
|
(0) Код "глВернутьЦену" в студию
|
|||
9
Холст
05.04.19
✎
12:33
|
(0) если сложно через объект "ПрямойЗапрос", то попробуй "обычный" запрос через компоненту 1CPP
используя $ПоследнееЗначение.Цены.Цена(СпрЦ.id,:КонДата) [Цена$Число.15.2] |
|||
10
zenon46
05.04.19
✎
12:36
|
(8) код штатный
Функция глВернутьЦену(Номенклатура, ТипЦены, ДатаЦены = 0, ЦенаЦены = 0, ЕдЦены = 0, ВалЦены = 0, НаценкаЦены = 0, НайденнаяЦена = 0) Экспорт Перем ЦеныНоменклатуры; Перем Рассчетная; Перем НужныйТипЦен; Перем ЕстьУдаленные; Рез = 1; НайденнаяЦена = ПолучитьПустоеЗначение("Справочник.Цены"); Если ПустоеЗначение(ДатаЦены) = 1 Тогда ДатаЦены = РабочаяДата(); КонецЕсли; // Найдет или нужную цену в справочнике // если она рассчитывается, то найдем базовую цену Рассчетная = ТипЦены.Рассчитывается; НужныйТипЦен = ?(ПустоеЗначение(Рассчетная) = 1, ТипЦены, ТипЦены.БазовыйТипЦен); ЦеныНоменклатуры= СоздатьОбъект("Справочник.Цены"); ЦеныНоменклатуры.ИспользоватьВладельца(Номенклатура); ЦеныНоменклатуры.ВыбратьЭлементы(); Пока ЦеныНоменклатуры.ПолучитьЭлемент() = 1 Цикл Если ЦеныНоменклатуры.ТипЦен <> НужныйТипЦен Тогда Продолжить; КонецЕсли; НайденнаяЦена = ЦеныНоменклатуры.ТекущийЭлемент(); Если ЦеныНоменклатуры.ПометкаУдаления() = 1 Тогда Рез = - 1; // Цена есть, но помечена на удаление Продолжить; Иначе Прервать; КонецЕсли; КонецЦикла; Если ПустоеЗначение(НайденнаяЦена) = 1 Тогда // Нет такой цены Возврат 0; КонецЕсли; // Заполним все ценовые характериситики // если не задана единица цены на эту дату, то потом придется обрабатывать случай нулевого коэффициента у пустой единицы ЕдЦены = НайденнаяЦена.Единица.Получить(ДатаЦены); Если ПустоеЗначение(Рассчетная) = 1 Тогда //Если цена не рассчитывается ЦенаЦены = НайденнаяЦена.Цена.Получить(ДатаЦены); // элемент справочника существует Валюту и Наценку возьмем из него ВалЦены = НайденнаяЦена.Валюта; НаценкаЦены = НайденнаяЦена.Процент; Иначе //Если цена рассчитывается БазоваяЦена = НайденнаяЦена.Цена.Получить(ДатаЦены); БазоваяВалюта = НайденнаяЦена.Валюта; // Цены у базового типа могут отличаться ЦенаЦены = глПересчет(БазоваяЦена, БазоваяВалюта, ДатаЦены, ТипЦены.Валюта, ДатаЦены); ЦенаЦены = глОкруглить(ЦенаЦены * (100 + ТипЦены.Процент) / 100, ТипЦены.ПорядокОкругления); // элемент справочника Цены не существует (расчетный). Валюту и Наценку возьмем из типа цены ВалЦены = ТипЦены.Валюта; НаценкаЦены = ТипЦены.Процент; КонецЕсли; Возврат Рез; КонецФункции // глВернутьЦену() |
|||
11
Холст
05.04.19
✎
12:40
|
(0) Засада в том, что цена может быть расчетной от другой цены, которая тоже расчетная и дальше длинная цепочка расчетных цен. И тогда функция сложная будет.
Если в базе нет цепочки расчетных цен или она короткая, то можно ограничиться $ПоследнееЗначение.Цены.Цена(СпрЦ.id,:КонДата) [Цена$Число.15.2] или соединением с расчетной ценой Также для ускорения можно один раз (при старте или время от времени) рассчитывать таблицу цен и хранить её или в глобальной ТЗ или в дополнительной SQL таблице (Наподобие идТовара/идТипЦены/Дата/Цена ) |
|||
12
opus70
05.04.19
✎
12:43
|
(11) сам провинциный и самый быстрый вариант отдельная таблица
так как4 не так уж часто цена меняется |
|||
13
Сияющий в темноте
05.04.19
✎
12:45
|
(11)кеш цен в индексированной таблице-хорошая идея.
какие бы не были расчетные цены и т.п.обычно,цена нужна на сейчас,то есть действующая,кеш спасет,а для тех,кому нужна цена из истории,можно и подождать. кстати,очень интересный вопрос,почему расчетные цены нужно пересчитывать каждый раз,а не только при изменении цены,от которой зависит расчет? |
|||
14
opus70
05.04.19
✎
12:45
|
и если человек задумался об ускорении глВернутьЦену , то уж точно перепилить под отдельную таблицу или расчет цен в справочник другой и так далее уже не стоит такой уж не выполнимой задачей,
так как значит товаров много клиентов тоже |
|||
15
Базис
naïve
05.04.19
✎
12:51
|
Флаг изменения цены и таблица с текущими ценами, обновляемая по сбросу флага.
Сколько пользователей, сколько документов в день, сколько типов цен фактически используются? |
|||
16
Kigo_Kigo
05.04.19
✎
12:51
|
(13) Потому что есть у тебя 2 отдела, отдел закупок и отдел продаж, цена продажи строго + 30% на закупку, отдел продаж в душе не знает, что там делает отдел закупок, а цена нужна сейчас, а когда там приход вбивают ХЗ
|
|||
17
zenon46
05.04.19
✎
12:55
|
(15) пользователей 40, документов по разному, не считал если честно, отдел закупок обновляет цены через документы "Установка цен", цен расчетных нет (в классическом понимании), они рассчитываются при записи в документе "установка цен", 8 типов цен всего.
|
|||
18
opus70
05.04.19
✎
12:56
|
(16)тогда в расходной накладной добавить одну кнопку
РАСЧЕТ ЦЕНЫ и работа строиться вот так Набили по остатку нажали кнопку рассчитать цену, рассчитать 100 позиций всегда быстрей чем бежать по подбору и считать на лету |
|||
19
zenon46
05.04.19
✎
12:56
|
Иногда цены необходимо получать на предыдущую дату, а не на текущую. Главный тормоз это отоброжение списка номенклатуры в котором выведены 3 колонки с "базовыми" ценами и их хотят видеть он-лайн.
|
|||
20
Злопчинский
05.04.19
✎
12:56
|
все уже сделано до вас
http://catalog.mista.ru/public/76287/ |
|||
21
Базис
naïve
05.04.19
✎
12:56
|
Пора слезать с файловой :)
Найди Павла Шемякина, ToyPaul - он переделывал типовую ТиС на быстрые запросы. |
|||
22
zenon46
05.04.19
✎
12:57
|
(21) так база SQL, 40 гигов
|
|||
23
1Сергей
05.04.19
✎
12:57
|
(22) текст ошибки будет или нет?
|
|||
24
zenon46
05.04.19
✎
12:58
|
(23) да тот код уже похерил, но ради инетреса верну назад, и скину ошибку.
|
|||
25
opus70
05.04.19
✎
12:58
|
(22) тодда тем более ищи как тебе посоветовали самый быстрый способ все ускорить
|
|||
26
opus70
05.04.19
✎
13:02
|
(22)ну или пуст кто нибуть поделиться у кого осталось эта библиотека с обработками там полный комплект для ТИС очень удобно и отчеты и модули проведения
|
|||
27
Aleksey
05.04.19
✎
13:06
|
Переходи на эмуляцию рс средствами рн
|
|||
28
opus70
05.04.19
✎
13:06
|
(22) у меня к несчастью она канула на умершем ноутбуке а организации которым покупал канули за данностью лет нет ничего вечного
|
|||
29
uno-group
05.04.19
✎
13:54
|
Пиши свою функцию в справочник ТМЦ. При Открытии создай справочник цен. у раз рассчитай коэффициент пересчета исходя из курсов, если конечно цены не в разных валютах. Можно пихать в сам справочник ТМЦ последние актуальную цену при изменение справочника цен. А если дата не актуальная лесть в справочник цен. В основном будет все летать, а любящие лазить в прошлое подождут.
|
|||
30
Злопчинский
05.04.19
✎
23:09
|
(22) и чего? у меня файловая на 10 гигов почти. из прямых запросов в оперативной работе - ничего нет. и все нормально работают.
. проблемы зависят не столько от объема базы сколько от текущей интенсивности работы. хочешь мощность - много за короткое время - база начгет потеть точно так как человек. |
|||
31
Сияющий в темноте
05.04.19
✎
23:36
|
Можно в кеше держать не одно значение,а несколько на нужный период,а остальное в историю и подчиненный справочник,чтобы периодику не трясти.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |