Имя: Пароль:
1C
1С v8
Как избавиться от запроса в цикле?
,
0 Slavik_hak
 
06.10.17
09:16
Подскажите как избавиться от запроса в цикле, в 1с еще новичок, сильно не пинайте)
&НаСервере
Процедура  ЗаполнитьНаСервере(НовыйОбъект)
    
    Товары = НовыйОбъект.Товары;
    Массив = Новый массив();
    Для Каждого Строка из Товары Цикл

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

КонецПроцедуры

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

    ВыборкаДанных = Запрос.Выполнить().Выбрать();
    
    Если ВыборкаДанных.Следующий() Тогда
        ЦенаПродажи = ВыборкаДанных.Цена;
    Иначе
        ЦенаПродажи = 0;
    КонецЕсли;
    
    ЦенаПродажиМодифицирована = Ложь;
    
    Возврат ЦенаПродажи;
    
КонецФункции
1 FIXXXL
 
06.10.17
09:18
ты близок к истине, ты уже написал  Массив = Новый массив();
осталось в массив сунуть всю номенклатуру и передать параметром в запрос, получить таблицу цен и в цикле искать уже в таблице
2 FIXXXL
 
06.10.17
09:19
вот только запрос еще бы переписать на регистры
3 Antony8x
 
06.10.17
09:24
+1 Запрос за цикл ко всей коллекции "Товары", выгрузить в ТЗ, далее в цикле искать цену методом НайтиСтроки
4 igorPetrov
 
06.10.17
09:38
(0) Бред какой-то, почти всё, что написано.
5 dezss
 
06.10.17
09:41
МассивТоваров = НовыйОбъект.Товары.ВыгрузитьКолонку("Номенклатура");
И его пихаешь в запрос, только в запросе условие
ОтчетПроизводстваЗаСменуПродукция.Номенклатура В (&Номенклатура)

И в ВЫБРАТЬ номенклатуру добавь.
6 Рэйв
 
06.10.17
10:01
можно сразу отправить таб часть в запрос и потом загрузить чтобы не мучиться потом с .Найти и т.д.
Как пример подстановка цен в расходную накладную:
//------

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

тРез=Рез.Выгрузить().Выгрузить();
Товары.Загрузить(тРез);
7 Vaflya
 
06.10.17
10:02
Соединением таблицы объекта и и таблицы ссылок(регистра)
8 Фортовый
 
06.10.17
10:06
можно вопрос .а где у вас запрос в цикле?
9 Vaflya
 
06.10.17
10:07
"Выбрать ТЧ.Номенклатура Поместить ВТ Из &ТЧ Как ТЧ; Выбрать ВТ.Номенклатура, Регистр.Цена ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних Как Регистр
По ВТ.Номенклатура = Регистр.Номенклатура"
10 Фортовый
 
06.10.17
10:07
все увидел . делайте без  функции напрямую
11 Vaflya
 
06.10.17
10:08
Ну и параметры задать - &ТЧ - товары, организация и все что еще нужно
12 Фортовый
 
06.10.17
10:08
умудренный код
13 Vaflya
 
06.10.17
10:09
(12)да обычный код начинающего, главное что работает)
14 Dzenn
 
гуру
06.10.17
10:10
(0) Берёшь и избавляешься.

А по факту — номенклатуру в массив надо.
А по ещё большему факту — хранить себестоимость в документе это зашквар.
15 Slavik_hak
 
07.10.17
02:13
Всем спасибо, все получилось))
Первый раз создавал тему, и удивился, что так много откликов))
16 mistеr
 
07.10.17
08:51
(0) А тебе точно нужна первая попавшаяся цена за месяц?
17 Otark
 
07.10.17
08:56
(15)Вопрос простой, повод пофлудить.
18 trooba
 
07.10.17
09:25
(0) Не использовать запрос в цикле
19 Slavik_hak
 
07.10.17
09:45
(16) да, предполагается, что документ за месяц один
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший