Имя: Пароль:
1C
1С v8
v8: Соединение среза цен номенклатуры и цен документа
,
0 Coldboy
 
24.07.14
09:59
Здравствуйте. Проблема такова. Выбираю количество и цену с документа, где нет цены, хочу взять из регистра сведений цены номенклатуры. Но результат задваивается, на количество стрчоек в регистр сведений. Вот собственно запрос, что не так?
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Склад,
    ИнвентаризацияТоваровНаСкладеТовары.Номенклатура,
    ИнвентаризацияТоваровНаСкладеТовары.СчетУчета,
    ИнвентаризацияТоваровНаСкладеТовары.Номенклатура.Код КАК Код,
    ИнвентаризацияТоваровНаСкладеТовары.ЕдиницаИзмерения,
    ВЫБОР
        КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет > 0
            ТОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет
        ИНАЧЕ 0
    КОНЕЦ КАК КоличествоИзлишек,
    ВЫБОР
        КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет < 0
            ТОГДА ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет - ИнвентаризацияТоваровНаСкладеТовары.Количество
        ИНАЧЕ 0
    КОНЕЦ КАК КоличествоНедостача,
    МЕСЯЦ(ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата) КАК Месяц,
    ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата,
    ВЫБОР
        КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет > 0
            ТОГДА ВЫБОР
                    КОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена > 0
                        ТОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена * (ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет)
                    ИНАЧЕ ЦеныНоменклатуры.Цена * (ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет)
                КОНЕЦ
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаИзлишка,
    ВЫБОР
        КОГДА ИнвентаризацияТоваровНаСкладеТовары.Количество - ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет < 0
            ТОГДА ВЫБОР
                    КОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена > 0
                        ТОГДА ИнвентаризацияТоваровНаСкладеТовары.Цена * (ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет - ИнвентаризацияТоваровНаСкладеТовары.Количество)
                    ИНАЧЕ ЦеныНоменклатуры.Цена * (ИнвентаризацияТоваровНаСкладеТовары.КоличествоУчет - ИнвентаризацияТоваровНаСкладеТовары.Количество)
                КОНЕЦ
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаНедостачи
ИЗ
    Документ.ИнвентаризацияТоваровНаСкладе.Товары КАК ИнвентаризацияТоваровНаСкладеТовары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ИнвентаризацияТоваровНаСкладеТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата >= ЦеныНоменклатуры.Период
ГДЕ
    ИнвентаризацияТоваровНаСкладеТовары.Ссылка.ПометкаУдаления = ЛОЖЬ
    И ИнвентаризацияТоваровНаСкладеТовары.Ссылка.Дата МЕЖДУ &НачДата И &КонДата
    И ЦеныНоменклатуры.ТипЦен = &ТипЦен
1 Cube
 
24.07.14
10:02
(0) Используй срез последних для цен номенклатуры...
2 Бешеная Нога
 
24.07.14
10:02
1. Используй срез последних
2. В срезе последних ставь условие по типу цены
3 Бешеная Нога
 
24.07.14
10:03
и по хорошему порядок такой:
1. получаешь таблицу товаров из документа
2. получаешь срез последних с условием по типу цены и условием Номенклатура В (Выбрать ТаблицаТоваров)
3. Соединить Таблицу товаров и таблицу цен
4 Coldboy
 
24.07.14
10:20
(1) я бы рад, если бы знать как условие передать в запросе. делаю отчет в СКД, там выбираю цену из регпистра, если в документа она равна 0, а количество есть.
не знаю как все это увязать.
5 Cube
 
24.07.14
10:24
(4) Мда...
Ну вот, давай на пальцах:


Запрос к полной таблице цен:

ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.ТипЦен,
    ЦеныНоменклатуры.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры


Запрос к срезу последних:

ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.ТипЦен,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних


Запрос к срезу последних с указанием даты среза и типа цен:

ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.ТипЦен,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних


Дальше сам осилишь?
6 Coldboy
 
24.07.14
10:39
(5) это я знаю не знаю как в запросе параметр &Период, &Номенклатура передать к временной таблице.
7 Enders
 
24.07.14
10:46
(6) Переведи, а то ничего не понятно
8 Cube
 
24.07.14
10:46
(6) Запрос.УстановитьПараметр("Период", ТекущаяДата());
9 Coldboy
 
24.07.14
11:04
(8) мне нужно на дату документа, а не текущую. и это в запросе.
10 Cube
 
24.07.14
11:07
11 Coldboy
 
24.07.14
11:10
http://kb.mista.ru/article.php?id=92 вот тут не берут сред последних.
12 Coldboy
 
24.07.14
11:13
и мне нужно только 1 цену а не каждый день брать вот.
13 Cube
 
24.07.14
11:15
(12) То есть, ты считаешь мой совет бессмысленным? :)
14 Coldboy
 
24.07.14
11:17
(13) ваш совет я считаю самым оптимальным решением, вирутальная таблицА, срез последних, я не знаю как передать параметры документа, такие как &Дата = Регистратор.Дата и &Номенклатура в запрос к срезу последних в 1 запросе.
15 el-gamberro
 
24.07.14
11:18
По логике надо взять цену на дату документа. А это уже более хитрый запрос.
1. Сформировать таблицу цен с интервалами (Начало действия цены, конец действия цены или &Конец)
2. Документ соединить с этой таблицей.
16 Coldboy
 
24.07.14
11:20
(15) пример можно
17 el-gamberro
 
24.07.14
11:20
(14) Если исходите исключительно из последний цены, то нет смысла передавать дату документа. Даже документ от 1990 года вы соедините с последний ценой. Так что... соединять только по Номенклатура.
18 hhhh
 
24.07.14
11:21
(16) пример в (11)
19 Cube
 
24.07.14
11:21
(14) Так не получится. У тебя два варианта:

1. Связывать таблицу инвентаризаций с таблицей цен на каждую дату.

2. (предпочтительней) Связать таблицу инвентаризаций с полной таблицей цен, найти последнюю дату для каждой номенклатуры и связать с полной таблицей цен ещё раз, чтобы получить цену по рассчитанной дате.
20 Enders
 
24.07.14
11:22
(14) Делай свой срез, в чём проблема?

Выбрать
Док.Дата
Док.Номенклатура
Поместить ВТ
Из
Док как Док
;
Выбрать
Вт.Дата,
Вт.Номенклатура,
Минимум(Цены.Период)как датаЦены
Поместить ВтДатыЦен
Из
Вт
Левое Соединение Цены как Цены
По Вт.Дата<=Цены.Период
и Вт.Номенклатура = Цены.Номенклатура
;
Выбрать
ВтДатыЦен.Дата,
ВтДатыЦен.Номенклатура,
ВтДатыЦен.датаЦены,
Цены.Цена
ИЗ ВтДатыЦен
Левое соединение Цены как Цены
По ВтДатыЦен.датаЦены =Цены.Период
И ВтДатыЦен.Номенклатура = Цены.Номенклатура


очень примерный пример;)
21 Coldboy
 
24.07.14
11:28
(18) либо я очень глуп, либо я что-то не знаю там везде передаю параметр &Дата в нужном мне варианте, а где его указываю в запросе я не увидел.
22 el-gamberro
 
24.07.14
11:29
(20)Хороший пример. Только конец улетит и будет глюк.
23 Coldboy
 
24.07.14
11:29
(19) мне нужна цена только на одну дату, на дату моего документа, зачем лишние данные?
24 Enders
 
24.07.14
11:32
(22) Какой конец, не очень понял?

В идеале, там ещё оптимизировать и оптимизировать, но для понятия алгоритма этого хватит)
25 el-gamberro
 
24.07.14
11:35
(24) Например цена ставилась 01.01.14. документ от 24.07.14
В таблицу ВтДатыЦен это не попадет по условию "Вт.Дата<=Цены.Период"
26 Cube
 
24.07.14
11:43
(23) Опиши задачу. Хватит уже запутывать всех. Давай изначально, что требуется сделать и где это будет использовано.
27 Enders
 
24.07.14
11:44
(25) Точно, я не правильно указал условия соединения)))
Там надо "Вт.Дата>=Цены.Период" и период не в минимум, а в максимум.
28 Coldboy
 
24.07.14
11:45
(26) на дату документа, если есть количество, но нет суммы, взять цену закупки и получить сумму, либо просто брать цену, если есть сумма в документе.
29 el-gamberro
 
24.07.14
11:51
(27) верно :) тогда остается вопрос начала. Если товар продают, а цены еще нет :) Но это уже административный барьер, а не программистский :)
30 Cube
 
24.07.14
11:52
(28) Отличная постановка задачи. Чтоб клиенты тебе так объясняли...

http://risovach.ru/upload/2013/12/mem/klichko_37366386_orig_.png
а сегодня в завтрашний день не все могут смотреть... Вернее смотреть могут не только лишь все, мало кто может это делать
31 Coldboy
 
24.07.14
12:19
(30) еще раз.
Есть документ инвентаризация.
С него я беру учетное количество, количество, и учетную сумму по какой-то номенклатурной позиции.. Если учетное количество >0 и Учетная сумма отлична от нуля, то все хорошо, я могу рассчитать цена, как учет.сумма/учет.количество. Но если вдруг оказалось, учетное количество есть, а суммы нет, мне нужно рассчиту эту сумму, путем выборки из регистра сведений актуальной цены закупки на дату документа инвентаризации, соответственно здесь у меня и возникла проблема, как вытащить эту актуальную цену срезом. В моем запросе в (0) есть вероятность, задвоения записей, из за того, что цен на текущую дату несколько.
32 el-gamberro
 
24.07.14
12:23
Пример с таблицей интервалов для реальной конфы "Бух 3.0":

ВЫБРАТЬ
    ЦеныНоменклатуры.Период КАК Начало,
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    МИНИМУМ(ЕСТЬNULL(ЦеныНоменклатуры1.Период, ДАТАВРЕМЯ(2014, 7, 24))) КАК Конец,
    ЦеныНоменклатуры2.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры1
        ПО ЦеныНоменклатуры.ТипЦен = ЦеныНоменклатуры1.ТипЦен
            И ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатуры1.Номенклатура
            И ЦеныНоменклатуры.Период < ЦеныНоменклатуры1.Период
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры2
        ПО ЦеныНоменклатуры.ТипЦен = ЦеныНоменклатуры2.ТипЦен
            И ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатуры2.Номенклатура
            И ЦеныНоменклатуры.Период = ЦеныНоменклатуры2.Период
ГДЕ
    ЦеныНоменклатуры.ТипЦен = &ТипЦен

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатуры.Период,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры2.Цена

УПОРЯДОЧИТЬ ПО
    Номенклатура
33 Cube
 
24.07.14
12:23
(31) Да мля, в твоем запросе из (0) ты вибираешь все документы инвентаризаций из диапазона дат. Сейчас ты лепишь про один документ.
Для чего это всё делается - одному ежику в тумане известно....
34 el-gamberro
 
24.07.14
12:28
Подправленный вариант в (20) тоже верный. Но я в этом случае не люблю ВТ по привычке. Такие вещи писал в MS SQL, а темп таблицу делать некомильфо. Лучше верно написать единый запрос.
35 Coldboy
 
24.07.14
12:39
(33) ну все это в разрере складов идет, какая разница, что 1 документ, что их несколько в разрезе складов же данные выводятся.
36 Cube
 
24.07.14
12:44
(35) Да, конечно, никакой. Удачи. Я пытался как мог...
37 Enders
 
24.07.14
12:53
(35) для вашей задачи уже предоставлено два варианта решения:
в (20)+ исправления в (27) и в(32).
Вам надо их осмыслить и переписать под себя. Готовый код вам тут никто не напишет)
38 Coldboy
 
24.07.14
13:06
(37) я поднимаю, в 32 не могу понять, куда документ засунуть.
39 el-gamberro
 
24.07.14
13:25
(38) засунь в подзапрос

выбрать док.*, ИнтервалыЦен.*
из Доки.Инвентаризация как док
левое соединение (запрос в 32 без упорядочить) как ИнтервалыЦен
по ИнтервалыЦен.Номенклатура = док.Номенклатура
и док.Дата >= ИнтервалыЦен.Начало
И док.Дата < ИнтервалыЦен.Конец