Имя: Пароль:
1C
1С v8
Запрос к таблице оборотов
0 Droning1C
 
01.04.19
12:30
Добрый день! Есть такой вот запросик.

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


Вопрос-Подскажите, пожалуйста, как построить такой же запрос, только обращаться при этом не к таблице Закупки, а к Оборотной таблице этого же регистра. Никак не получается правильно сделать... Не могу максимум отобрать нормально( ламер чёртов(
1 Mankubus
 
01.04.19
12:35
(0)
ИЗ
        РегистрНакопления.Закупки.Обороты
2 Droning1C
 
01.04.19
12:43
(1) Гениально) Это я понимаю. Может вопрос не так поставил. Как правильно задать параметры виртуальной таблицы, чтобы получить данные из последнего документа закупки каждной номенклатурной позиции?
3 azernot
 
01.04.19
12:45
Регистратор = &ПоследнийДокументЗакупки
:)
4 unregistered
 
01.04.19
12:49
(2) Для решения этой задачи лучше использовать первичную таблицу самого регистра, а не виртуальную Обороты. Обороты придётся всё равно запрашивать с периодичностью "Регистратор" или даже "Запись". А это лишние и по сути бессмысленные в данном случае накладные расходы.
5 Droning1C
 
01.04.19
12:57
(4) Но все же, если это делать через обороты, то как должен выглядеть текст запроса?
6 catena
 
01.04.19
12:58
(2)Без заранее известного последнего документа, параметрами вт данная задача не решается.
7 Droning1C
 
01.04.19
13:16
(6) Хмм.. А если обрисую задачу целиком... Мне нужно написать обработку, которая берет последнюю закупочную цену по номенклатуре, сравнивает ее с ценой в установке цен номенклатуры, если таковая есть на эту номенклатурную позицию, и, если цена разнится, то записывает строку в новосозданную установку цен номенклатуры.
8 Droning1C
 
01.04.19
13:17
Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    взПериодПоследнейЗакупки.Номенклатура КАК Номенклатура,
    |    взПериодПоследнейЗакупки.ХарактеристикаНоменклатуры,
    |    Закупки.Количество,
    |    Закупки.Стоимость,
    |    ВЫБОР
    |        КОГДА Закупки.Количество = 0
    |            ТОГДА 0
    |        ИНАЧЕ ВЫРАЗИТЬ(Закупки.Стоимость / Закупки.Количество КАК ЧИСЛО(15, 2))
    |    КОНЕЦ КАК Цена,
    |    взПериодПоследнейЗакупки.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХраненияОстатков
    |ПОМЕСТИТЬ ВТ_ПоследниеЗакупки
    |ИЗ
    |    (ВЫБРАТЬ
    |        Закупки.Номенклатура КАК Номенклатура,
    |        МАКСИМУМ(Закупки.Период) КАК Период,
    |        Закупки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
    |    ИЗ
    |        РегистрНакопления.Закупки КАК Закупки
    |    
    |    СГРУППИРОВАТЬ ПО
    |        Закупки.Номенклатура,
    |        Закупки.ХарактеристикаНоменклатуры) КАК взПериодПоследнейЗакупки
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Закупки
    |        ПО взПериодПоследнейЗакупки.Период = Закупки.Период
    |            И взПериодПоследнейЗакупки.Номенклатура = Закупки.Номенклатура
    |            И взПериодПоследнейЗакупки.ХарактеристикаНоменклатуры = Закупки.ХарактеристикаНоменклатуры
    |ГДЕ
    |    взПериодПоследнейЗакупки.Период МЕЖДУ &Начало И &Конец
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    |    ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры,
    |    ЦеныНоменклатурыСрезПоследних.Цена,
    |    ЦеныНоменклатурыСрезПоследних.Валюта,
    |    ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения
    |ПОМЕСТИТЬ ВТ_УстЦен
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТ_ПоследниеЗакупки.Номенклатура,
    |    ВТ_ПоследниеЗакупки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |    ВТ_ПоследниеЗакупки.ЕдиницаХраненияОстатков,
    |    ВТ_ПоследниеЗакупки.Количество КАК КоличествоПоследнейЗакупки,
    |    ВТ_ПоследниеЗакупки.Стоимость КАК СтоимостьПоследнейЗакупки,
    |    ВТ_ПоследниеЗакупки.Цена КАК ЦенаРасчетнаяПоследнейЗакупки,
    |    ЕСТЬNULL(ВТ_УстЦен.Цена, 0) КАК ЦенаУстановкиЦенНоменклатуры,
    |    ВТ_УстЦен.Валюта КАК ВалютаУстановки
    |ИЗ
    |    ВТ_ПоследниеЗакупки КАК ВТ_ПоследниеЗакупки
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_УстЦен КАК ВТ_УстЦен
    |        ПО ВТ_ПоследниеЗакупки.Номенклатура = ВТ_УстЦен.Номенклатура
    |            И ВТ_ПоследниеЗакупки.ХарактеристикаНоменклатуры = ВТ_УстЦен.ХарактеристикаНоменклатуры";
    
    Запрос.УстановитьПараметр("Конец", КонецПериода);
    Запрос.УстановитьПараметр("Начало", НачалоПериода);
    ТЗ = Запрос.Выполнить().Выгрузить();
    
    ВсегоЗаписей = ТЗ.Количество();
    ТипЦенЗаказСредняя = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000006");
    ВалютаРубли = Справочники.Валюты.НайтиПоКоду("643");
    Счетчик = 0;
    //СписокТипов = Новый СписокЗначений;
    //СписокТипов.Добавить(ТипЦенЗаказСредняя);
    //ФормаУстановки = Установка.ПолучитьФорму("ФормаДокумента");
    //ФормаУстановки.СписокТиповЦен = СписокТипов;
    
    Установка = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    ФормаУстановки = Установка.ПолучитьФорму("ФормаДокумента");
    Установка.Дата = ТекущаяДата();
    Установка.УстановитьНовыйНомер();
    Установка.Комментарий = "Установлено обработкой";
    
    Если ВсегоЗаписей > 0 Тогда
        Для Каждого СТрокаТЗ из ТЗ Цикл
            
            Если Окр (Число(СТрокаТЗ.ЦенаУстановкиЦенНоменклатуры),0) <> ОКр(Число(СТрокаТЗ.ЦенаРасчетнаяПоследнейЗакупки),0) Тогда
                
                НоваяСтрока = Установка.Товары.Добавить();
                НоваяСтрока.Номенклатура = СТрокаТЗ.Номенклатура;
                Если СтрокаТЗ.ВалютаУстановки <> ВалютаРубли Тогда
                    Курс = ПолучитьКурс(СтрокаТЗ.ВалютаУстановки);
                    Если ЗначениеЗаполнено(Курс) Тогда
                        Цена = Окр(СТрокаТЗ.ЦенаРасчетнаяПоследнейЗакупки/Курс,2);
                    Иначе Сообщить("Для номенклатуры " + СТрокаТЗ.Номенклатура + " не указана валюта в Установке цен. Цена записана в рублях без учет валют.");
                        Цена = СТрокаТЗ.ЦенаРасчетнаяПоследнейЗакупки;
                        
                    КонецЕсли;
                КонецЕсли;
                
                
                НоваяСтрока.Цена = Цена;
                Если ЗначениеЗаполнено(СТрокаТЗ.ВалютаУстановки) Тогда
                    НоваяСтрока.Валюта = СТрокаТЗ.ВалютаУстановки;
                Иначе НоваяСтрока.Валюта = ВалютаРубли;
                КонецЕсли;
                НоваяСтрока.ХарактеристикаНоменклатуры =СТрокаТЗ.ХарактеристикаНоменклатуры;
                //Если ЗначениеЗаполнено(СТрокаТЗ.ЕдиницаИзмерения) Тогда
                //    НоваяСтрока.ЕдиницаИзмерения = СТрокаТЗ.ЕдиницаИзмерения;
                //Иначе НоваяСтрока.ЕдиницаИзмерения = СтрокаТЗ.Номенклатура.ЕдиницаХраненияОстатков;
                //КонецЕсли;
                НоваяСтрока.ЕдиницаИзмерения = СтрокаТЗ.ЕдиницаХраненияОстатков;
                НоваяСтрока.ТипЦен = ТипЦенЗаказСредняя;
                Счетчик = Счетчик + 1;
                Сообщить("" + Счетчик + " из " + ВсегоЗаписей);
            КонецЕсли;
            
        КонецЦикла;
        СтрокаТипыЦен = Установка.ТипыЦен.Добавить();
        СтрокаТипыЦен.ТипЦен = ТипЦенЗаказСредняя;
        
        Установка.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Установка цен создана и проведена.");
        ФормаУстановки.Открыть();
    Иначе Сообщить("Результат запроса по регистрам пуст.");
    КонецЕсли;
9 Droning1C
 
01.04.19
13:18
Все таки, моему начальнику почему-то ну очень хочется чтобы я использовал в запросе именно виртуальную таблицу оборотов. Возможно ли это?
10 Вася Теркин
 
01.04.19
13:20
Вот это очень хорошо
взПериодПоследнейЗакупки.Период МЕЖДУ &НачалоПериода И &КонецПериода
11 Droning1C
 
01.04.19
13:22
(10) Это сарказм я так понимаю? Что с того что мне нужна последняя закупка в определенном периоде?
12 Droning1C
 
01.04.19
13:23
(10) Или ты про название параметров? я уже из переименовал в &НачалоПериода И &КонецПериода
13 Вася Теркин
 
01.04.19
13:23
(0) если тебе цены последних закупок нужны, то сначала выбери документы с максимальной датой в ВТ, потом отберешь тольк оих движения
14 Вася Теркин
 
01.04.19
13:24
Названия не важны, важна только Сила.
15 Droning1C
 
01.04.19
13:25
У меня так и отбирается же. только не по виртуальной таблице оборотов а по физической. Как сделать по виртуальной?)) или все же без заранее известного последнего документа, параметрами вт данная задача не решается?
16 catena
 
01.04.19
13:29
(15)Виртуальной точно так же.
17 Вася Теркин
 
01.04.19
13:32
Виртуальную таблицу Обороты РегистраНакопления Закупки возьми за период в разрезе регистратора. Это всё -  параметры виртуальной таблицы. И помести в ВТ_ВсеДвиженияПериода
Потом по ней найди максимальные даты регистраторов для каждого сочетания Характеристики и Номенклатуры. И помести в другую ВТ_Максимумы
Потом соедини две виртуальные таблицы, их пересечение даст тебе власть над миром.
18 Вася Теркин
 
01.04.19
13:33
"в разрезе регистратора" - с детализацией до регистратора
19 Вася Теркин
 
01.04.19
13:46
Да, и тут смотря сколько оборотов в день.
Если пятнадцать миллионов движений по закупкам ежедневно, то лучше сначала взять обороты в разрезе дней ,определить какой день тебе нужен и только потом взять обороты в разрезе полных дат за день и там определить какой документ тебе нужен.
20 Droning1C
 
01.04.19
13:55
(17) спасибо, буду пробовать!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн