Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Запрос к таблице оборотов

Запрос к таблице оборотов
Я
   Droning1C
 
01.04.19 - 12:30
Добрый день! Есть такой вот запросик.

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


Вопрос-Подскажите, пожалуйста, как построить такой же запрос, только обращаться при этом не к таблице Закупки, а к Оборотной таблице этого же регистра. Никак не получается правильно сделать... Не могу максимум отобрать нормально( ламер чёртов(
 
 
   Mankubus
 
1 - 01.04.19 - 12:35
(0)
ИЗ
        РегистрНакопления.Закупки.Обороты
   Droning1C
 
2 - 01.04.19 - 12:43
(1) Гениально) Это я понимаю. Может вопрос не так поставил. Как правильно задать параметры виртуальной таблицы, чтобы получить данные из последнего документа закупки каждной номенклатурной позиции?
   azernot
 
3 - 01.04.19 - 12:45
Регистратор = &ПоследнийДокументЗакупки
:)
   unregistered
 
4 - 01.04.19 - 12:49
(2) Для решения этой задачи лучше использовать первичную таблицу самого регистра, а не виртуальную Обороты. Обороты придётся всё равно запрашивать с периодичностью "Регистратор" или даже "Запись". А это лишние и по сути бессмысленные в данном случае накладные расходы.
   Droning1C
 
5 - 01.04.19 - 12:57
(4) Но все же, если это делать через обороты, то как должен выглядеть текст запроса?
   catena
 
6 - 01.04.19 - 12:58
(2)Без заранее известного последнего документа, параметрами вт данная задача не решается.
   Droning1C
 
7 - 01.04.19 - 13:16
(6) Хмм.. А если обрисую задачу целиком... Мне нужно написать обработку, которая берет последнюю закупочную цену по номенклатуре, сравнивает ее с ценой в установке цен номенклатуры, если таковая есть на эту номенклатурную позицию, и, если цена разнится, то записывает строку в новосозданную установку цен номенклатуры.
   Droning1C
 
8 - 01.04.19 - 13:17
Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    взПериодПоследнейЗакупки.Номенклатура КАК Номенклатура,
    |    взПериодПоследнейЗакупки.ХарактеристикаНоменклатуры,
    |    Закупки.Количество,
    |    Закупки.Стоимость,
    |    ВЫБОР
    |        КОГДА Закупки.Количество = 0
    |            ТОГДА 0
    |        ИНАЧЕ ВЫРАЗИТЬ(Закупки.Стоимость / Закупки.Количество КАК ЧИСЛО(15, 2))
    |    КОНЕЦ КАК Цена,
    |    взПериодПоследнейЗакупки.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХраненияОстатков
    |ПОМЕСТИТЬ ВТ_ПоследниеЗакупки
    |ИЗ
    |    (ВЫБРАТЬ
    |        Закупки.Номенклатура КАК Номенклатура,
    |        МАКСИМУМ(Закупки.Период) КАК Период,
    |        Закупки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
    |    ИЗ
    |        РегистрНакопления.Закупки КАК Закупки
    |    
    |    СГРУППИРОВАТЬ ПО
    |        Закупки.Номенклатура,
    |        Закупки.ХарактеристикаНоменклатуры) КАК взПериодПоследнейЗакупки
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Закупки
    |        ПО взПериодПоследнейЗакупки.Период = Закупки.Период
    |            И взПериодПоследнейЗакупки.Номенклатура = Закупки.Номенклатура
    |            И взПериодПоследнейЗакупки.ХарактеристикаНоменклатуры = Закупки.ХарактеристикаНоменклатуры
    |ГДЕ
    |    взПериодПоследнейЗакупки.Период МЕЖДУ &Начало И &Конец
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    |    ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры,
    |    ЦеныНоменклатурыСрезПоследних.Цена,
    |    ЦеныНоменклатурыСрезПоследних.Валюта,
    |    ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения
    |ПОМЕСТИТЬ ВТ_УстЦен
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    ВТ_ПоследниеЗакупки.Номенклатура,
    |    ВТ_ПоследниеЗакупки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |    ВТ_ПоследниеЗакупки.ЕдиницаХраненияОстатков,
    |    ВТ_ПоследниеЗакупки.Количество КАК КоличествоПоследнейЗакупки,
    |    ВТ_ПоследниеЗакупки.Стоимость КАК СтоимостьПоследнейЗакупки,
    |    ВТ_ПоследниеЗакупки.Цена КАК ЦенаРасчетнаяПоследнейЗакупки,
    |    ЕСТЬNULL(ВТ_УстЦен.Цена, 0) КАК ЦенаУстановкиЦенНоменклатуры,
    |    ВТ_УстЦен.Валюта КАК ВалютаУстановки
    |ИЗ
    |    ВТ_ПоследниеЗакупки КАК ВТ_ПоследниеЗакупки
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_УстЦен КАК ВТ_УстЦен
    |        ПО ВТ_ПоследниеЗакупки.Номенклатура = ВТ_УстЦен.Номенклатура
    |            И ВТ_ПоследниеЗакупки.ХарактеристикаНоменклатуры = ВТ_УстЦен.ХарактеристикаНоменклатуры";
    
    Запрос.УстановитьПараметр("Конец", КонецПериода);
    Запрос.УстановитьПараметр("Начало", НачалоПериода);
    ТЗ = Запрос.Выполнить().Выгрузить();
    
    ВсегоЗаписей = ТЗ.Количество();
    ТипЦенЗаказСредняя = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000006");
    ВалютаРубли = Справочники.Валюты.НайтиПоКоду("643");
    Счетчик = 0;
    //СписокТипов = Новый СписокЗначений;

    //СписокТипов.Добавить(ТипЦенЗаказСредняя);

    //ФормаУстановки = Установка.ПолучитьФорму("ФормаДокумента");

    //ФормаУстановки.СписокТиповЦен = СписокТипов;

    
    Установка = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    ФормаУстановки = Установка.ПолучитьФорму("ФормаДокумента");
    Установка.Дата = ТекущаяДата();
    Установка.УстановитьНовыйНомер();
    Установка.Комментарий = "Установлено обработкой";
    
    Если ВсегоЗаписей > 0 Тогда
        Для Каждого СТрокаТЗ из ТЗ Цикл
            
            Если Окр (Число(СТрокаТЗ.ЦенаУстановкиЦенНоменклатуры),0) <> ОКр(Число(СТрокаТЗ.ЦенаРасчетнаяПоследнейЗакупки),0) Тогда
                
                НоваяСтрока = Установка.Товары.Добавить();
                НоваяСтрока.Номенклатура = СТрокаТЗ.Номенклатура;
                Если СтрокаТЗ.ВалютаУстановки <> ВалютаРубли Тогда 
                    Курс = ПолучитьКурс(СтрокаТЗ.ВалютаУстановки);
                    Если ЗначениеЗаполнено(Курс) Тогда
                        Цена = Окр(СТрокаТЗ.ЦенаРасчетнаяПоследнейЗакупки/Курс,2);
                    Иначе Сообщить("Для номенклатуры " + СТрокаТЗ.Номенклатура + " не указана валюта в Установке цен. Цена записана в рублях без учет валют.");
                        Цена = СТрокаТЗ.ЦенаРасчетнаяПоследнейЗакупки;
                        
                    КонецЕсли;
                КонецЕсли;
                
                
                НоваяСтрока.Цена = Цена;
                Если ЗначениеЗаполнено(СТрокаТЗ.ВалютаУстановки) Тогда
                    НоваяСтрока.Валюта = СТрокаТЗ.ВалютаУстановки;
                Иначе НоваяСтрока.Валюта = ВалютаРубли;
                КонецЕсли;
                НоваяСтрока.ХарактеристикаНоменклатуры =СТрокаТЗ.ХарактеристикаНоменклатуры;
                //Если ЗначениеЗаполнено(СТрокаТЗ.ЕдиницаИзмерения) Тогда 

                //    НоваяСтрока.ЕдиницаИзмерения = СТрокаТЗ.ЕдиницаИзмерения;

                //Иначе НоваяСтрока.ЕдиницаИзмерения = СтрокаТЗ.Номенклатура.ЕдиницаХраненияОстатков;

                //КонецЕсли;

                НоваяСтрока.ЕдиницаИзмерения = СтрокаТЗ.ЕдиницаХраненияОстатков; 
                НоваяСтрока.ТипЦен = ТипЦенЗаказСредняя;
                Счетчик = Счетчик + 1;
                Сообщить("" + Счетчик + " из " + ВсегоЗаписей);
            КонецЕсли;
            
        КонецЦикла;
        СтрокаТипыЦен = Установка.ТипыЦен.Добавить();
        СтрокаТипыЦен.ТипЦен = ТипЦенЗаказСредняя;
        
        Установка.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Установка цен создана и проведена.");
        ФормаУстановки.Открыть();
    Иначе Сообщить("Результат запроса по регистрам пуст.");
    КонецЕсли;
   Droning1C
 
9 - 01.04.19 - 13:18
Все таки, моему начальнику почему-то ну очень хочется чтобы я использовал в запросе именно виртуальную таблицу оборотов. Возможно ли это?
   Вася Теркин
 
10 - 01.04.19 - 13:20
Вот это очень хорошо
 взПериодПоследнейЗакупки.Период МЕЖДУ &НачалоПериода И &КонецПериода
   Droning1C
 
11 - 01.04.19 - 13:22
(10) Это сарказм я так понимаю? Что с того что мне нужна последняя закупка в определенном периоде?
   Droning1C
 
12 - 01.04.19 - 13:23
(10) Или ты про название параметров? я уже из переименовал в &НачалоПериода И &КонецПериода
   Вася Теркин
 
13 - 01.04.19 - 13:23
(0) если тебе цены последних закупок нужны, то сначала выбери документы с максимальной датой в ВТ, потом отберешь тольк оих движения
   Вася Теркин
 
14 - 01.04.19 - 13:24
Названия не важны, важна только Сила.
   Droning1C
 
15 - 01.04.19 - 13:25
У меня так и отбирается же. только не по виртуальной таблице оборотов а по физической. Как сделать по виртуальной?)) или все же без заранее известного последнего документа, параметрами вт данная задача не решается?
   catena
 
16 - 01.04.19 - 13:29
(15)Виртуальной точно так же.
   Вася Теркин
 
17 - 01.04.19 - 13:32
Виртуальную таблицу Обороты РегистраНакопления Закупки возьми за период в разрезе регистратора. Это всё -  параметры виртуальной таблицы. И помести в ВТ_ВсеДвиженияПериода
Потом по ней найди максимальные даты регистраторов для каждого сочетания Характеристики и Номенклатуры. И помести в другую ВТ_Максимумы
Потом соедини две виртуальные таблицы, их пересечение даст тебе власть над миром.
   Вася Теркин
 
18 - 01.04.19 - 13:33
"в разрезе регистратора" - с детализацией до регистратора
   Вася Теркин
 
19 - 01.04.19 - 13:46
Да, и тут смотря сколько оборотов в день.
Если пятнадцать миллионов движений по закупкам ежедневно, то лучше сначала взять обороты в разрезе дней ,определить какой день тебе нужен и только потом взять обороты в разрезе полных дат за день и там определить какой документ тебе нужен.
   Droning1C
 
20 - 01.04.19 - 13:55
(17) спасибо, буду пробовать!

Список тем форума
Рекламное место пустует  Рекламное место пустует
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.