Имя: Пароль:
1C
1С v8
Последнее значение из регистра.
,
0 DenYuliya
 
20.05.16
15:45
Надо получить
1) Цену номенклатуры из предыдущего поступления (колонка Приход).
Я ее смотрю в рег.накопления Закупки, потому что док. "Поступление товаров и услуг" не является регистратором для рег.св "Цены номенклатуры"
2) Последние цены по номенклатуре (Опт, Опт1,Опт0) из рег.св "Цены номенклатуры"

Что-то делаю не так(((.
Потому что по 1), если предыдущих записей больше 1, то они выводятся вс, а нужна только последняя.
По 2) - получается максимальная цена, если стоит "Максимум" (что в принципе логично), а если убрать максимум - то получаются все (((. А как последнюю вывести, не могу понять... РАзве что брать реальную таблицу Цены, и ЦеныСрез последних, и как-то их сравнивать?


ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПоступлениеТоваровУслугТовары.Номенклатура.Код КАК НоменклатураКод,
    ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    ПоступлениеТоваровУслугТовары.Номенклатура.Производитель КАК НоменклатураПроизводитель,
    ПоступлениеТоваровУслугТовары.Количество КАК Количество,
    ПоступлениеТоваровУслугТовары.Цена КАК Цена,
    ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата
ПОМЕСТИТЬ ДокументПоступление
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
    ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка
    И НЕ ПоступлениеТоваровУслугТовары.Ссылка.ПометкаУдаления

СГРУППИРОВАТЬ ПО
    ПоступлениеТоваровУслугТовары.Номенклатура,
    ПоступлениеТоваровУслугТовары.Номенклатура.Код,
    ПоступлениеТоваровУслугТовары.Номенклатура.Артикул,
    ПоступлениеТоваровУслугТовары.Номенклатура.Производитель,
    ПоступлениеТоваровУслугТовары.Количество,
    ПоступлениеТоваровУслугТовары.Цена,
    ПоступлениеТоваровУслугТовары.Ссылка.Дата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
    ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьRUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьEUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьUSD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьUS1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ КАК ОбластьРуб,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаRUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаEUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаUSD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаUS1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ КАК Розница,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптRUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптEUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптUSD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптUS1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ КАК Опт,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1RUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1EUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1ER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1USD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1US1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ КАК Опт1,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0RUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0EUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0ER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0USD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0US1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ КАК Опт0
ПОМЕСТИТЬ Цены
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.ВидЦены,
    ЦеныНоменклатурыСрезПоследних.Цена,
    ЦеныНоменклатурыСрезПоследних.Валюта,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьRUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьEUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьUSD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОбластьUS1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаRUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаEUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаUSD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "РозницаUS1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптRUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптEUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптUSD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "ОптUS1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1RUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1EUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1ER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1USD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт1US1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ,
    ВЫБОР
        КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0RUB"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0EUR"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0ER1"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0USD"
                ИЛИ ЦеныНоменклатурыСрезПоследних.ВидЦены.Наименование = "Опт0US1"
            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    КОНЕЦ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Закупки.Регистратор КАК Регистратор,
    Закупки.Период КАК Период,
    Закупки.ИсточникГФУНоменклатуры КАК ИсточникГФУНоменклатуры,
    Закупки.Сумма / Закупки.Количество КАК Приход
ПОМЕСТИТЬ ЦенаПредПрихода
ИЗ
    РегистрНакопления.Закупки КАК Закупки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДокументПоступление.НоменклатураКод КАК Группа,
    ДокументПоступление.НоменклатураПроизводитель КАК Модель,
    ДокументПоступление.НоменклатураАртикул КАК Номер,
    ДокументПоступление.Цена КАК Цена,
    ДокументПоступление.Количество КАК Кол,
    ДокументПоступление.Номенклатура КАК Наименование,
    ЦенаПредПрихода.Приход КАК Приход,
    МАКСИМУМ(Цены.ОбластьРуб) КАК ОбластьРуб,
    МАКСИМУМ(Цены.Розница) КАК Розница,
    МАКСИМУМ(Цены.Опт) КАК Опт2,
    МАКСИМУМ(Цены.Опт1) КАК Опт11,
    МАКСИМУМ(Цены.Опт0) КАК Опт01,
    ЦенаПредПрихода.Регистратор КАК Регистратор
ИЗ
    ДокументПоступление КАК ДокументПоступление
        ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены
        ПО ДокументПоступление.Номенклатура = Цены.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ЦенаПредПрихода КАК ЦенаПредПрихода
        ПО ДокументПоступление.Номенклатура = ЦенаПредПрихода.ИсточникГФУНоменклатуры
ГДЕ
    ДокументПоступление.Дата > ЦенаПредПрихода.Период

СГРУППИРОВАТЬ ПО
    ДокументПоступление.НоменклатураКод,
    ДокументПоступление.НоменклатураПроизводитель,
    ДокументПоступление.НоменклатураАртикул,
    ДокументПоступление.Номенклатура,
    ДокументПоступление.Количество,
    ЦенаПредПрихода.Приход,
    ЦенаПредПрихода.Регистратор,
    ДокументПоступление.Цена

УПОРЯДОЧИТЬ ПО
    Регистратор,
    Наименование


Ссылка на результат: https://yadi.sk/i/DGMshxrnrrxwa

Натыкайте меня носом в ошибки, люди добрые?
1 DenYuliya
 
20.05.16
15:45
P/S Конфа Управление Торговлей 11.1 (11.1.10.173)
2 Fram
 
20.05.16
15:51
Я конечно все понимаю, можно иногда позволить себе по хардкодить, но не на столько же
3 Nik_nik_nik
 
20.05.16
15:58
Ого :)
"Потому что по 1), если предыдущих записей больше 1, то они выводятся вс, а нужна только последняя. " - сортировка по периоду и "Выбрать Первые 1" - будет всегда 1/0 последних цен.
4 qwasqu
 
20.05.16
16:00
Тебе нужно взять цены по номенклатуре из последнего поступления и сравнить с ценами из регистра сведений?

Что нужно и самое главное для чего?
5 Fram
 
20.05.16
16:02
(3) а ниче что у нее там несколько номенклатуру? Первые 1 мудро сработает на каждую номенклатуру, думаешь?
6 DenYuliya
 
20.05.16
16:06
(3) если в док-те будет несколько строк, то "Выбрать первые 1" обрубит все строки, кроме 1
7 DenYuliya
 
20.05.16
16:08
(4) Нет, их сравнить не нужно. Нужно вывести в отчет колонку с ценами из текущего док-та ПТИУ (по которому отбор), в соседнюю колонку вывесит данные по этой же номенклатуры из предыдущего поступления
8 DenYuliya
 
20.05.16
16:08
(2) в чем именно))?
9 qwasqu
 
20.05.16
16:13
Мне кажется, что нужно взять документы, которые меньше даты текущего документа, и по максимальной дате найти предыдущие цены.

Вот так.
Только если очень много документов будет, то будет плохо.
10 Nik_nik_nik
 
20.05.16
16:14
(8) Можете вопрос по другому задать? Не понимаю что вы хотите получить. Пишете цену из предыдущего документа? - Для чего? Для произвольного списка товаров? Для товаров которые есть только в предыдущем (кстати предыдущем чему?) товаров?
11 DenYuliya
 
20.05.16
16:21
(10) Есть документ ПТиУ № 2 от 20.05.16. В нем есть товар "Булка", цена 10 р и "Колбаса", цена 20 р.
Есть отбор по документу.

Надо вывести в колонку "Приход" цену "Булки" и "Колбасы", из предыдущего поступления. Того, по которому "Булка" и "Колбаса" в прошлый раз приходили.
12 DenYuliya
 
20.05.16
16:22
(9)с отбором по ТекДок.Номенклатура = ПредыдущийДок.Номенклатура?
И получать что-то из документа - зло)))
13 DenYuliya
 
20.05.16
16:23
С п.2 (последняя цена из рег.св "Цены номенклатуры") я вроде бы разобралась
14 qwasqu
 
20.05.16
16:32
Ребята, вот!

ВЫБРАТЬ
    ЗакупкиОбороты.Номенклатура,
    ЗакупкиОбороты.Период,
    ЗакупкиОбороты.СтоимостьОборот / ЗакупкиОбороты.КоличествоОборот КАК Цена
ПОМЕСТИТЬ ЦеныТекДокумента
ИЗ
    РегистрНакопления.Закупки.Обороты(, , Регистратор, ) КАК ЗакупкиОбороты
ГДЕ
    ЗакупкиОбороты.Регистратор = &Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗакупкиОбороты.Номенклатура,
    ЗакупкиОбороты.Период,
    ЗакупкиОбороты.СтоимостьОборот / ЗакупкиОбороты.КоличествоОборот КАК Цена
ПОМЕСТИТЬ ВсеДокументы
ИЗ
    РегистрНакопления.Закупки.Обороты(, , Регистратор, ) КАК ЗакупкиОбороты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦеныТекДокумента КАК ЦеныТекДокумента
        ПО ЗакупкиОбороты.Период < ЦеныТекДокумента.Период
            И ЗакупкиОбороты.Номенклатура = ЦеныТекДокумента.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеДокументы.Номенклатура,
    МАКСИМУМ(ВсеДокументы.Период) КАК Период
ПОМЕСТИТЬ МаксимальныйПериод
ИЗ
    ВсеДокументы КАК ВсеДокументы

СГРУППИРОВАТЬ ПО
    ВсеДокументы.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеДокументы.Номенклатура,
    ВсеДокументы.Цена
ПОМЕСТИТЬ ЦеныПредыдущие
ИЗ
    ВсеДокументы КАК ВсеДокументы
ГДЕ
    (ВсеДокументы.Номенклатура, ВсеДокументы.Период) В
            (ВЫБРАТЬ
                МаксимальныйПериод.Номенклатура,
                МаксимальныйПериод.Период
            ИЗ
                МаксимальныйПериод КАК МаксимальныйПериод)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныПредыдущие.Номенклатура,
    ЦеныПредыдущие.Цена КАК ЦенаПредыдущая,
    ЦеныТекДокумента.Цена КАК ЦенаТекущая
ИЗ
    ЦеныТекДокумента КАК ЦеныТекДокумента
        ЛЕВОЕ СОЕДИНЕНИЕ ЦеныПредыдущие КАК ЦеныПредыдущие
        ПО ЦеныТекДокумента.Номенклатура = ЦеныПредыдущие.Номенклатура
15 qwasqu
 
20.05.16
16:34
Только во втором пакете не внутреннее, а левое соединение.
16 qwasqu
 
20.05.16
16:52
И отбор по документу естественно забыл в первом пакете
17 qwasqu
 
20.05.16
16:52
Ну в общем смысл ясен
18 Фрэнки
 
20.05.16
16:58
мдя... совсем недавно кусочки этой задачи уже поднимались на мисте. Конечно, просто поговорили, поговорили и ничего не выговорили.

А тут абсолютно такое же решение пытаются найти. Интересно, что ответил "постановщик задания" предыдущему кандидату?
19 Фрэнки
 
20.05.16
17:00
стоп-стоп, так это же просто продолжение прошлой ветки подняли! ТС, зачем-почему создаем новую ветку и даже без ссылки на предыдущую?
20 DenYuliya
 
20.05.16
17:04
Почему-то не могу на нее зайти, извиняюсь
21 Fram
 
20.05.16
17:07
(8) я про фильтр по наименованию типов цен в запросе
22 Nik_nik_nik
 
20.05.16
17:08
Я похожу задачу решил записью в регистр с ценами цен по отдельным видам цен. Потом читай как хочешь.
23 Фрэнки
 
20.05.16
17:12
(20) ладно. Ну в первой выборке взамен сгруппировать я бы поставил Выбрать Различные - этого бы хватило, т.к. группировать там просто незачем.
24 Фрэнки
 
20.05.16
17:21
(20) во втором запросе, там где Цены и СерзПоследних
- риск воткнуться в данные более новые, чем ТА документа-регистратора, передаваемого в первый запрос. Т.е. этот запрос имеет смысл только если Дата текущего документа обязательно Текущая, а что это значит?

Кстати, если текущий документ будет, к примеру, новым и ранее не проведенным, то это очень сильно упростит постановку задачу. В такой постановке все сводится с выборке действительно в выборке Цен из Сведений по границе на ТА текущего регистратора, где граница не включена. А это означает только потребность в выводе чисел 0, там где предыдущего поступления в номенклатуре не было.
25 Фрэнки
 
20.05.16
17:26
и в последнем запросе как-то странно соединяемся. Т.е. соединяться нужно, но зачем после этого исключаем из полученных ВСЕХ результатов по условии Даты - так в самом деле вылетит вообще вся выборка, когда предыдущего прихода просто нет - это же очевидно написано.
26 Фрэнки
 
20.05.16
17:30
и напоследок - смутные сомнения, что регистр ЦеныНоменклатуры заполняется ценами от Поставщиков.
27 qwasqu
 
21.05.16
02:12
Ребята, я предложил решение запросом, решение 100% правильное. Что вам еще надо? Или вы думали, что будет мини запросик с одним пакетом?
28 youalex
 
21.05.16
03:20
Последнее значение из регистра?

Функция ПередУдалениемРегистра(ОчищатьЗаписи = Истина, УдалятьРегистр)

ОчищатьЗаписи = Ложь;
СтандартнаяОработка = Ложь;
УдалятьРегистр = Истина

ПоследнееЗначение = ПолучитьЗначениеИзРегистра(ЭтотОбъект, УдалятьРегистр);

ЗаписатьПоследнееЗначение(ПоследнееЗначение);

Конфигурация.РегистрыСведений [ЭтотОбъект.Метаданные.Имя()].Удалить();
Конфигурация.Сохранить()

КонецФункции