Имя: Пароль:
1C
1С v8
Запрос к документам
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) , а не то что у тебя там где-то написано