|
Запрос к таблице оборотов | ☑ | ||
---|---|---|---|---|
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) спасибо, буду пробовать!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |