|
Запрос к документам | ☑ | ||
---|---|---|---|---|
0
Novicadmin
29.10.14
✎
08:00
|
Задача: Нужна последняя закупочная цена склада отправителя.
На склад поступает товар с нескольких организаций. Один и тот же товар может поступить от разных поставщиков. В программе несколько организаций и в каждую может поступить товар по разной цене от разных поставщиков. Закупочная цена не регистрируется документом "Установка цен номенклатуры". Есть информация о цене в Регистре сведений "Цены номенклатуры контрагентов", но там регистрация по ТипЦены(мы его не знаем т.к. не знаем поставщика товара). Функция ПолучитьЦенуТовара(Товар) ЦенаТовара = 0; ПечДокумент =СсылкаНаОбъект; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ПоступлениеТоваровУслугТовары.Цена КАК цена |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары |ГДЕ | ПоступлениеТоваровУслугТовары.Ссылка.СкладОрдер = &Склад | И ПоступлениеТоваровУслугТовары.Номенклатура = &Номенклатура | |УПОРЯДОЧИТЬ ПО | ПоступлениеТоваровУслугТовары.Ссылка.Дата УБЫВ"; Запрос.УстановитьПараметр("Номенклатура", Товар); Запрос.УстановитьПараметр("Склад", ПечДокумент.СкладОтправитель); Результат = Запрос.Выполнить().Выгрузить(); Если Результат.Количество() > 0 тогда ЦенаТовара = Результат.Получить(0).Цена; КонецЕсли; Возврат ЦенаТовара; КонецФункции Помогите оптимизировать или найти иное решение задачи, а то как то долго выполняется код. |
|||
1
PePaRiTB
29.10.14
✎
08:16
|
(0) Во-первых, где используется запрос? Если в цикле для каждой строки ТЧ, то надо переделывать подход (сразу получать 1 запросом все цены в таблицу).
Во-вторых, использовать регистр сведений по цене (создать?) и делать запрос с выборкой (а не выгрузкой): Результат = Запрос.Выполнить().Выборка(); Если Выборка.Следующий() Тогда ЦенаТовара = Выборка.Цена; КонецЕсли; В-третьих, если будет более 1-й цены в долкументе? В-четвертых, нужно разбить скрытые запросы на простые запросы. Например, вот это: ПоступлениеТоваровУслугТовары.Ссылка.СкладОрдер |
|||
2
Novicadmin
29.10.14
✎
08:20
|
Тогда может просто добавить в регистр цены контрагентов склад? и делать выборку? (1)
|
|||
3
ам794123
29.10.14
✎
08:23
|
(0) не верю, что эта функция сильно тормозит. Должна выполняться доли секунды. Проблема в другом
|
|||
4
Novicadmin
29.10.14
✎
08:32
|
(3) 100% эта функция тормозит у меня
|
|||
5
Novicadmin
29.10.14
✎
08:32
|
даже если
Результат = Запрос.Выполнить().Выборка(); Если Выборка.Следующий() Тогда ЦенаТовара = Выборка.Цена; КонецЕсли; Всё равно тормозит |
|||
6
Ёпрст
29.10.14
✎
08:32
|
(4) ты её в цикле поди выполняешь, да ?
|
|||
7
Ёпрст
29.10.14
✎
08:34
|
(5) это вообще не рабочий код, он просто не выполнится - тормозить не может по-определению
|
|||
8
Novicadmin
29.10.14
✎
08:35
|
(6) да
....Цикл Цена = ПолучитьЦену(); КонецЦикла; Как это не рабочий когда работает ))))) |
|||
9
Ёпрст
29.10.14
✎
08:37
|
(8) вот только ври да не завирайся.
На счет цикла - весь код в топку. Цену надо получить сразу, для всей номенклатуры. Тогда и тормозов не будет |
|||
10
Novicadmin
29.10.14
✎
08:45
|
(9) Функция ПолучитьЦенуТовара(Товар)
Полностью рабочая, что в ней не работает? если у меня формируется печатная форма с нужными мне цифрами, я не пойму. |
|||
11
Novicadmin
29.10.14
✎
08:46
|
а счет (1) я понял что надо попробовать выдернуть сразу все цены для всех товаров табличной части документа
|
|||
12
Strogg
29.10.14
✎
08:48
|
(11) ну так и соедини таблицу цен с таблицей номенклатуры. тогда получишь без цикла сопоставление цены каждой номенклатуре.
|
|||
13
PePaRiTB
29.10.14
✎
08:51
|
(8) Так ты бы сразу так и писал. Тогда тебе надо получить все данные в одном запросе. Можно сделать по простому:
1. Загрузить во Временную таблицу запроса твою таблицу (ТЧ) т.е. в запросе будет как параметр, с указанием всех полей (либо написать функцию, которая формирует текст запроса исходя из колонок тч): &ТЧ как ТаблицаДокумента далее Запрос.УстановитьПараметр("ТЧ", МояТЧ); 2. Соединить ее с ценами из регистра (который ты создашь и будешь ложить значения :) ) 3. И выгружаешь результат запроса прямо в таблицу: МояТЧ.Загрузить(Запрос.Выполнить().Выгрузить()); 4. Все результат готов. (10) Да, функция не нужна более. |
|||
14
PePaRiTB
29.10.14
✎
08:53
|
(13) + естественно сортировку надо по НомерСтроки сделать, чтобы все осталось как есть.
|
|||
15
Ёпрст
29.10.14
✎
08:57
|
(10) читай внимательнее, я говорил, за код в (5) , а не то что у тебя там где-то написано
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |