Имя: Пароль:
1C
 
изобрел получение ближайшей закупочной на момент продажи
0 Гений 1С
 
гуру
14.07.21
18:44
Я просто ранее никогда таким способом не пользовался, что скажете коллеги, все ли ок?
Или есть способы проще.

Фишечка в соединении двух одинаковых запросов.
В общем, в итог попадают те закупочные цены, у которых нет более поздних закупочных цен.

Мне такой способ никогда раньше в голову не приходил, а тут само родилось как-то.

Вот текст запроса:

ВЫБРАТЬ
    ТО.Услуга КАК Номенклатура,
    ТО.Ссылка.Дата КАК Дата,
    ТО.Количество КАК Количество,
    ЕСТЬNULL(ТП.Цена, 0) КАК ЦенаЗакупочная
ИЗ
    Документ.Наряд.Услуги КАК ТО
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ТМ.Номенклатура КАК Номенклатура,
            ТМ.Ссылка.Дата КАК Дата,
            ТМ.Ссылка КАК Ссылка,
            ТМ.Цена КАК Цена
        ИЗ
            Документ.ПоступлениеМатериалов.Материалы КАК ТМ
        ГДЕ
            ТМ.Ссылка.Дата <= &КонецПериода) КАК ТП
        ПО (ТП.Номенклатура = ТО.Услуга)
            И (ТП.Дата <= ТО.Ссылка.Дата)
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ТМ.Номенклатура КАК Номенклатура,
            ТМ.Ссылка.Дата КАК Дата,
            ТМ.Ссылка КАК Ссылка,
            ТМ.Цена КАК Цена
        ИЗ
            Документ.ПоступлениеМатериалов.Материалы КАК ТМ
        ГДЕ
            ТМ.Ссылка.Дата <= &КонецПериода) КАК ТП2
        ПО (ТП2.Номенклатура = ТО.Услуга)
            И (ТП2.Дата <= ТО.Ссылка.Дата)
            И (ТП2.Дата > ТП.Дата
                ИЛИ ТП2.Дата = ТП.Дата
                    И ТП2.Ссылка > ТП.Ссылка)
ГДЕ
    (ТП.Ссылка ЕСТЬ NULL
            ИЛИ ТП2.Ссылка ЕСТЬ NULL)
    И ТО.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
1 BeerHelpsMeWin
 
14.07.21
18:47
РС.ЦеныНоменклатуры.СрезПоследних(&НужнаяДата, ВидЦены=&ВидЦеныЗакупочная)
2 nicxxx
 
14.07.21
18:47
4 Fragster
 
гуру
14.07.21
18:51
главное, что результат не совсем верный, а так пофиг
5 Вафель
 
14.07.21
18:51
Коррелированные подзапросы не так делаются.
Делаешь соединение с нужной таблицей по всем полям, а дата в (выбрать первые 1 ... Где номенклатура = основнойзапррс.номенклатура)
6 Новый1сник2
 
14.07.21
18:54
(0) (1) "РС.ЦеныНоменклатуры.СрезПоследних(&НужнаяДата, ВидЦены=&ВидЦеныЗакупочная)", что еще нужно?
7 Гений 1С
 
гуру
14.07.21
18:54
(1) (6) мдя, мелко сударь, мелко. Речь о дате на момент регистратора, &НужнаяДата - она гулящая.
(2) Получая 1800 в час, несложно, сударь. Это преимущество ИП
(4) в чем неверность?
(5) не выйдет, там динамический отбор по дате продажи.
8 Fragster
 
гуру
14.07.21
18:56
(7) подумай, что будет, если будет более одного поступления в периоде
9 Fragster
 
гуру
14.07.21
18:56
и да, куда ты деваешь то время, которое ты экономишь на набирании псевдонимов таблиц?
10 Новый1сник2
 
14.07.21
18:57
(7) ну добавь там конец дня, задача то какая?
11 Новый1сник2
 
14.07.21
18:58
и это поступление материалов, могут быть и другие поступления
12 Ненавижу 1С
 
гуру
14.07.21
19:01
Гений изобрел срез последних на произвольные даты
Скоро фифо в запросе реализует
13 Новый1сник2
 
14.07.21
19:07
(0) "В общем, в итог попадают те закупочные цены, у которых нет более поздних закупочных цен." смотрим (10)
14 Гений 1С
 
гуру
14.07.21
19:08
(10) надо не на конец дня, а на регистратор.
15 Новый1сник2
 
14.07.21
19:12
(14) а смысл, есть поступление материалов или поступление товаров, чем тебе поможет регистратор?
16 Новый1сник2
 
14.07.21
19:13
или в течении дня цены меняются как на морковку?
17 Новый1сник2
 
14.07.21
19:22
теперь понятен замысел правительства по отказу от долларов, теперь в  обменных пунктах, вместо доллара будет стоимость морковки))) как я сразу не догадался))
18 H A D G E H O G s
 
14.07.21
19:24
Находятся люди, которые читают ветки Сергея, я им удивляюсь.

P.S. я здесь, чтобы удивиться, а не читать.
19 Вафель
 
14.07.21
19:26
(7) именно так и делается

ВЫБРАТЬ
    ТО.Услуга КАК Номенклатура,
    ТО.Ссылка.Дата КАК Дата,
    ТО.Количество КАК Количество,
    ЕСТЬNULL(ТМ.Цена, 0) КАК ЦенаЗакупочная
ИЗ
    Документ.Наряд.Услуги КАК ТО
        ЛЕВОЕ СОЕДИНЕНИЕ  Документ.ПоступлениеМатериалов.Материалы КАК ТМ
        ПО ТО.Услуга = ТМ.Номенклатура
         И ТМ.Ссылка.Дата В (ВЫБРАТЬ ПЕРВЫЕ 1
            ТМ.Ссылка.Дата КАК Дата
        ИЗ
            Документ.ПоступлениеМатериалов.Материалы КАК ТМ1
        ГДЕ
            ТМ1.Номенклатура = ТО.Услуга
            ТМ1.Ссылка.Дата <= ТО.Ссылка.Дата
        УПОРЯДОЧИТЬ ПО
            Дата УБЫВ) КАК ТП
20 Prog111
 
14.07.21
19:28
"ТО", "ТМ" и "ТП" - как-то некошерно.
21 Вафель
 
14.07.21
19:29
тут конечно не хватает условия на проведенность, но у гени тоже нте
22 BeerHelpsMeWin
 
14.07.21
19:29
(7) Да, это я не посмотрел. Давно не видел такого говнокода, отвык. Могу научить срезу последних на произвольные даты. Ну и в моей среде общения и таблицы называют нормально, и выборку по документам не делают.
(18) это ж одновременно развлечение, разминка для мозгов и повышение квалификации - улыбнись, как забавно сделано и подумай, как сделать правильно. Бонус - попробуй угадать, что на самом деле хотел сделать автор.
23 Новый1сник2
 
14.07.21
19:30
(18) ну как бы демократия, читаем что приглянулось
24 Вафель
 
14.07.21
19:30
(19) хотя лучше не дату в (...) делать, а ссылка в (...)
25 Вафель
 
14.07.21
19:32

ВЫБРАТЬ
    ТО.Услуга КАК Номенклатура,
    ТО.Ссылка.Дата КАК Дата,
    ТО.Количество КАК Количество,
    ЕСТЬNULL(ТМ.Цена, 0) КАК ЦенаЗакупочная
ИЗ
    Документ.Наряд.Услуги КАК ТО
        ЛЕВОЕ СОЕДИНЕНИЕ  Документ.ПоступлениеМатериалов.Материалы КАК ТМ
        ПО ТО.Услуга = ТМ.Номенклатура
         И ТМ.Ссылка В (ВЫБРАТЬ ПЕРВЫЕ 1
            ТМ1.Ссылка КАК Ссылка
        ИЗ
            Документ.ПоступлениеМатериалов.Материалы КАК ТМ1
        ГДЕ
            ТМ1.Номенклатура = ТО.Услуга
            И ТМ1.Ссылка.Дата <= ТО.Ссылка.Дата
            И ТМ1.Ссылка.Проведен
        УПОРЯДОЧИТЬ ПО
            ТМ1.Ссылка.Дата УБЫВ) КАК ТП
26 H A D G E H O G s
 
14.07.21
19:32
(22) спасибо, не надо. Я вчера весь день угадывал, что хотел сказать автор, когда erp передачей материалов в производство плодила отрицательные остатки по себестоимости.
27 BeerHelpsMeWin
 
14.07.21
19:35
(26) Это заняло так долго потому, что у вас нет опыта угадывания, что хотел сделать ТС! :)
28 NorthWind
 
14.07.21
19:43
(7) 1800 в час - несложно, а вот гарантированные 200 в месяц - не так-то просто.
29 Гений 1С
 
гуру
14.07.21
22:08
(25) о, спасибо, про выбрать Первые 1 во вложенном запросе тоже только счас узнал, раньше максимум юзал.
(16) почему в течении дня? у тебя есть продажи за месяц, нужно с-сть посчитать этих продаж. На каждую продажу нужно извлекать последнюю закупочную цену, в течении месяца она может менятся. Тем более отчет можно выполнять за квартал.
30 Гений 1С
 
гуру
14.07.21
22:10
(28) это всего 111 часов. у меня выработка 80 в месяц, мне хватает.
31 mikecool
 
14.07.21
22:13
(0) про данные регистров когда вспомнишь?
32 Гений 1С
 
гуру
14.07.21
22:42
(31) ты о чем?
33 Ненавижу 1С
 
гуру
15.07.21
00:11
(32) у документов даже проверку на проведение не организовал
34 assasu
 
15.07.21
07:24
(0) если в запросах баловаться с условиями на "<" и ">" можно и не такое еще получить.
35 Гений 1С
 
гуру
15.07.21
08:14
(33) не ищи пятна на Солнце
36 BaZZiL
 
15.07.21
10:55
Прочитал как "ближайшей закусочной")
37 Krendel
 
15.07.21
10:57
(0) Работа Регистра сведений выполненная ректальным запросом?
38 Лефмихалыч
 
15.07.21
11:02
(0) печально, что ты так из 8.0 и не вырос
39 Classic
 
15.07.21
11:42
(29)
"Выбрать первые" универсальней.
например если тебе надо сортировать не только по дате, а и еще по какому-то критерию.
40 Гений 1С
 
гуру
15.07.21
11:54
(37) Ты будешь удивлен, но даже к периодическому регистру сведений нужен такой запрос если на дату регистратора нужен показатель
Опыта маловато, да?
41 Chameleon1980
 
15.07.21
12:55
снова "изобрёл"
запатентовал?
42 WebberNSK
 
15.07.21
13:36
(0)
Вот 1С написали стандарты разработки, чтобы люди, не умеющие писать запросы правильно не допускали "детские" ошибки. Но нет, и стандарты нам тоже использовать не хочется...
43 acht
 
15.07.21
13:43
(42) Да кто вы такие, чтобы указывать Солнцу (35)?
44 Гений 1С
 
гуру
15.07.21
14:29
(41) Кстати, через соединения быстрее работает, но через В Первые проще воспринимается.

В итоге переписал так:

Документ.Наряд.Услуги КАК ТО
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеМатериалов.Материалы КАК ТМ
ПО ТО.Услуга = ТМ.Номенклатура
    И (ТМ.Ссылка В
        (ВЫБРАТЬ ПЕРВЫЕ 1
            ТМВ.Ссылка КАК Ссылка
        ИЗ
            Документ.ПоступлениеМатериалов.Материалы КАК ТМВ
        ГДЕ
            ТМВ.Ссылка.Дата <= ТО.Ссылка.Дата
            И ТО.Услуга = ТМВ.Номенклатура
        УПОРЯДОЧИТЬ ПО
            ТМВ.Ссылка.Дата УБЫВ,
            Ссылка))
    И (ТМ.НомерСтроки В
        (ВЫБРАТЬ ПЕРВЫЕ 1
            ТМВ.НомерСтроки КАК НомерСтроки
        ИЗ
            Документ.ПоступлениеМатериалов.Материалы КАК ТМВ
        ГДЕ
            ТМВ.Ссылка.Дата <= ТО.Ссылка.Дата
            И ТО.Услуга = ТМВ.Номенклатура
        УПОРЯДОЧИТЬ ПО
            ТМВ.Ссылка.Дата УБЫВ,
            ТМВ.Ссылка))

Тут важно, что ТМВ сортировать надо не только по дате, но и по ссылке, чтобы в обоих таблицах ТМВ была гарантированно выбрана одна и та же накладная поступления (если их будет две с одинаковой датой).


Жаль, что вот так нельзя, было бы лаконично:

Документ.Наряд.Услуги КАК ТО
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеМатериалов.Материалы КАК ТМ
ПО ТО.Услуга = ТМ.Номенклатура
    И ((ТМ.Ссылка, ТМ.НомерСтроки) В
        (ВЫБРАТЬ ПЕРВЫЕ 1
            ТМВ.Ссылка КАК Ссылка, ТМВ.НомерСтроки
        ИЗ
            Документ.ПоступлениеМатериалов.Материалы КАК ТМВ
        ГДЕ
            ТМВ.Ссылка.Дата <= ТО.Ссылка.Дата
            И ТО.Услуга = ТМВ.Номенклатура
        УПОРЯДОЧИТЬ ПО
            ТМВ.Ссылка.Дата УБЫВ))

Если использовать ссылку, могут быть проблемы если в документе две одинаковые строки
45 Гений 1С
 
гуру
15.07.21
14:30
(42) о каком стандарте идет речь?
46 crazy_killer
 
03.08.21
00:06
(45) 655, например
47 Конструктор1С
 
03.08.21
07:06
(20) у него весь код такой
48 dubolom
 
03.08.21
08:40
Не, ну тут явно троллинг, кмк.
49 Хосе
 
03.08.21
09:53
(20) краткие имена лаконичнее смотрятся, не загромождают код
50 Малыш Джон
 
03.08.21
10:33
(49) "кр им ла см, не за ко" - это конечно лаконично, но нихера не понятно
51 Said_We
 
03.08.21
10:37
(44) Добавь и номер строки. Больше номер строки, значит позже.
52 Said_We
 
03.08.21
10:39
УПОРЯДОЧИТЬ ПО
             ТМВ.Ссылка.Дата УБЫВ
            ,ТМВ.НомерСтроки УБЫВ
53 ildary
 
03.08.21
11:17
(49) Короткие имена развивают навык телепатии и добавляют радости тому, кто впервые видит код и пытается запомнить, что такое "ТО", "ТМ" и "ТП"
54 SiAl-chel
 
03.08.21
11:31
(53) Я, я, я знаю, что такое ТП (усердно тянет руку ввех). Но тут приличное общество, потому не буду озвучивать (потупив взор, ковыряет носком туфли ковер на полу).
55 Ненавижу 1С
 
гуру
04.08.21
06:01
(53) гений не читает код повторно