Имя: Пароль:
1C
1С v8
запрос, но без цикла
0 Vvvvv
 
17.07.14
10:50
может кто подскажет решение одной задачки,
есть табличная часть(ТЧ) с реквизитом товар. Есть запрос, который обрабатывает каждый товар в ТЧ. т.е.

В запросе просто выбран регистр сведений
для каждого стр из ТЧ Цикл
  Выборка = Запрос.Выполнить().Выбрать();
  Пока Выборка.Следующий() Цикл
       // а здесь выполняется код
  КонецЦикла

КонецЦикла;

как изменить код, что бы не использовать цикл
1 Vvvvv
 
17.07.14
10:51
(0) если товаров 1000, то цикл будет выполняться 1000 раз, а это долго
2 butterbean
 
17.07.14
10:52
написать запрос, который обрабатывает сразу все товары.
3 Godofsin
 
17.07.14
10:52
пихай ТЧ во временную и таблицу и делай соединение с РС
4 Ymryn
 
17.07.14
10:53
(0) Мне несколько боязно спрашивать, но запрос же по всей номенклатуре в табличной части? Если нет, то надо сделать. А получать нужный результат можно через НайтиСледующий(Новый Структура("Номенклатура", Стр.Номенклатура)) (ну или как-то так). И да,   Выборка = Запрос.Выполнить().Выбрать(); лучше чтобы было до начала цикла.
5 Vvvvv
 
17.07.14
10:57
(3) а есть какие нибудь статьи, примеры?
6 Лефмихалыч
 
17.07.14
11:06
(0)
Запрос = новый запрос("
|ВЫБРАТЬ номенклатура, Сумма(Количество) как Количество, Сумма(Сумма) как Сумма
|ИЗ Документ.РасходнаяНакладная.Товары
|где
|Ссылка = &Ссылка
|Сгруппировать по Номенклатура");

Запрос.установитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Выборка.Номенклатура.ПолучитьОбъект().Удалить();
КОнецЦикла;
7 Dionis Sergeevich
 
17.07.14
11:09
(0) В цикле параметры не передаешь? тогда

Выборка = Запрос.выаолнить().выбрать()
для каждого стр из ТЧ Цикл
  
  Пока Выборка.Следующий() Цикл
       // а здесь выполняется код

  КонецЦикла
  Выборка.Сбросить();
КонецЦикла;
8 spiller26
 
17.07.14
11:10
(0) что нужно хоть сделать с таблицей, пересчет всей таблицы или чисто по строке?
9 Ymryn
 
17.07.14
11:11
(6) какой милый пример. Особенно в случае попытки его продублировать. :)
10 User_Agronom
 
17.07.14
11:15
(6) Добрый мальчик. Душевный.
11 JeyRico
 
17.07.14
11:25
(6) Автор может и скописастить...
(7) Опять квадратичный алгоритм получается.
Нужно выгрузитьКолонку номенклатуры и пихнуть ее параметром в запрос.
12 JeyRico
 
17.07.14
11:27
(0) Запрос в студию
13 Fragster
 
гуру
17.07.14
11:37
у меня так в обработке получения данных:

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


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

    Пока Выборка.Следующий() Цикл
        ОформлениеСтроки = Соответствие.Получить(Выборка.Ссылка);
        
        Если Выборка.ВыполняетДвижения Тогда
            ОформлениеСтроки.Шрифт = мШрифт;
        КонецЕсли;
        Если Выборка.ЦветКарты <> NULL Тогда
            мЦветКарты = Выборка.ЦветКарты.Получить();
            Если ТипЗнч(мЦветКарты)=Тип("Цвет") Тогда
                ОформлениеСтроки.ЦветТекста = мЦветКарты;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

    
КонецПроцедуры
14 Vvvvv
 
17.07.14
11:41
мой запрос

Для каждого стр из ТЧ Цикл    
    если стр.Товар.ЭтоГруппа = Ложь тогда
        // УСЛОВИЕ 1
        Запрос1 = новый Запрос;
        Запрос1.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                        |    ЦеныСрезПоследних.Номенклатура,
                        |    ЦеныСрезПоследних.ТипЦен,
                        |    ЦеныСрезПоследних.Период КАК Период,
                        |    ЦеныСрезПоследних.Цена
                        |ИЗ
                        |    РегистрСведений.Цены.СрезПоследних(, ) КАК ЦеныСрезПоследних
                        |ГДЕ
                        |    ЦеныСрезПоследних.ТипЦен = &ТипЦ
                        |    И ЦеныСрезПоследних.Номенклатура = &Номен
                        |
                        |УПОРЯДОЧИТЬ ПО
                        |    Период УБЫВ";
        Запрос1.УстановитьПараметр("ТипЦ", Подразделение.ТипЦенРеализации);
        Запрос1.УстановитьПараметр("Номен",стр.Товар);
        Выборка1 = Запрос1.Выполнить().Выбрать();
        пока Выборка1.Следующий() Цикл
            Сообщить(Выборка1.Номенклатура);
            Сообщить("его цена " +Выборка1.Цена + " на дату: " + Выборка1.Период);
            Сообщить("тип цен: " + Подразделение.ТипЦенРеализации);
            Сообщить("_____________________________________________");
        КонецЦикла;
    КонецЕсли;
КонецЦикла;
15 JeyRico
 
17.07.14
11:43
(13) Запрос.УстановитьПараметр("Массив", Массив) - а в массиве что?
16 JeyRico
 
17.07.14
11:50
(14)
Товары = ТЧ.ВыгрузитьКолонку("Товар");

        Запрос1 = новый Запрос;  
        Запрос1.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                        |    ЦеныСрезПоследних.Номенклатура,
                        |    ЦеныСрезПоследних.ТипЦен,
                        |    ЦеныСрезПоследних.Период КАК Период,
                        |    ЦеныСрезПоследних.Цена
                        |ИЗ
                        |    РегистрСведений.Цены.СрезПоследних(,ТипЦен = &ТипЦ
                        |                                        И Номенклатура В (&Номен) ) КАК ЦеныСрезПоследних
                        |                
                        |УПОРЯДОЧИТЬ ПО
                        |    Период УБЫВ";
        Запрос1.УстановитьПараметр("ТипЦ", Подразделение.ТипЦенРеализации);
        Запрос1.УстановитьПараметр("Номен",Товары );
        Выборка1 = Запрос1.Выполнить().Выбрать();
        пока Выборка1.Следующий() Цикл
            Сообщить(Выборка1.Номенклатура);
            Сообщить("его цена " +Выборка1.Цена + " на дату: " + Выборка1.Период);
            Сообщить("тип цен: " + Подразделение.ТипЦенРеализации);
            Сообщить("_____________________________________________");
        КонецЦикла;

Если тип цен на группы не установлен, то появляться не будут, хотя можно условие на ЦеныСрезПоследних.Номенклатура.ЭтоГруппа = Ложь можно в секцию ГДЕ запихнуть
17 Лефмихалыч
 
17.07.14
11:51
(9),(10),(11) добро должно быть с кулаками, ящетаю
18 Fragster
 
гуру
17.07.14
11:58
(15) а, там МассивКлючей и СоответствиеСтрок, просто скопипастил криво (из нескольких функций).
19 JeyRico
 
17.07.14
12:00
(18) Понятно.
20 echo77
 
17.07.14
12:04
(16) ВЫБРАТЬ ПЕРВЫЕ 1 нах , а остальное нормально.

И еще ТС уверен что срез последних нужен на дату самой последней записи, а не на дату документа?
21 Fragster
 
гуру
17.07.14
12:14
(20) нифига, еще нужно запихать исходную таблицу с ключем (или всю таблицу, если по типам возможно), например НомерСтроки в запрос, соединить с ней уже срез последних.

в обходе выборки по этому "ключу" сразу заполнить что надо (Товары[Выборка.НомерСтроки].Цена = Выборка.Цена), или загрузить целиком товары, если они были переданы в запрос целиком.
22 Fragster
 
гуру
17.07.14
12:15
[Выборка.НомерСтроки-1]
23 Лефмихалыч
 
17.07.14
12:24
"ВЫБРАТЬ
| вт.Номенклатура
|ПОМЕСТИТЬ ВТ
|ИЗ &Табчасть как ВТ
|;
|ВЫБРАТЬ
|ВТ.Номенклатура,
|РС.ТипЦен,
|РС.Период,
|РС.Цена
|ИЗ ВТ
|ЛЕВОЕ СОЕДИНЕНИЕ |РегистрСведений.ЦеныНоменклатуры(,Номенклатура в (ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура ИЗ ВТ)) как РС
|ПО РС.Номенклатура = ВТ.Номенклатура"

Запрос.УстановитьПараметр("Табчасть", ЭтотОбъект.ИмяТабличнойЧасти);
Программист всегда исправляет последнюю ошибку.