Имя: Пароль:
1C
1С v8
СрезПоследних в регистре сведений
,
0 grandmaster
 
15.11.17
10:07
Подскажите, как работает срезпоследних. Что я делаю не так?
Возвращает целый список из регистра (ДокументыЭД). Нужно получать последнее значение по текущей дате

ВЫБРАТЬ
                       ДокументыЭДСрезПоследних.ИдентификаторЗапроса КАК ИдентификаторЗапроса,
                       ДокументыЭДСрезПоследних.Период Как Период,
                       РеализацияТоваровУслуг.Ссылка КАК Ссылка
ИЗ
                       РегистрСведений.ДокументыЭД.СрезПоследних(&ТекущаяДата, ) КАК ДокументыЭДСрезПоследних
                           ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                           ПО ДокументыЭДСрезПоследних.Документ = РеализацияТоваровУслуг.Ссылка
ГДЕ
                    РеализацияТоваровУслуг.Ссылка = ДокументыЭДСрезПоследних.Документ
1 Cyberhawk
 
15.11.17
10:09
Чтобы получать "получать последнее значение по текущей дате", срез не подходит, т.к. ты не знаешь, с какими значениями измерений эта запись
2 grandmaster
 
15.11.17
10:11
(1) разве нет такой функции, чтоб получать последнее значение из регистра? я думал как раз срезпоследних это оно, разве не так?
3 grandmaster
 
15.11.17
10:12
(1) и что значит ваше
"ты не знаешь, с какими значениями измерений эта запись"
4 FIXXXL
 
15.11.17
10:14
(2) срез последних - он по СОЧЕТАНИЯМ измерений
у тебя там сколько измерений?
5 grandmaster
 
15.11.17
10:16
(4) что значит измерений?
количество строк? полей? я не понимаю
строк очень много
надо получать последнее по текущей дате
6 lodger
 
15.11.17
10:16
(0) начни с того, что написать структуру регистра.
Измерения:
...
...
ресурсы:
...
...
7 grandmaster
 
15.11.17
10:19
(6)
Измерения:
Документ
ВариантОбмена

Ресурсы:
Файл
Статус
ИдентификаторЗапроса
8 h-sp
 
15.11.17
10:26
(7) ну значит по каждому документу реализация и по каждому варианту обмена будет отдельная строчка в срезе.

Ну то есть в ваш срез должны по-любому попасть все документы реализации, который есть в регистре.
9 Cyberhawk
 
15.11.17
10:27
(2) Функция как раз есть: ПолучитьПоследнее
10 Cyberhawk
 
15.11.17
10:27
(3) То и значит
11 grandmaster
 
15.11.17
10:32
(8) так а я что делаю?
ГДЕ
                    РеализацияТоваровУслуг.Ссылка = ДокументыЭДСрезПоследних.Документ
12 grandmaster
 
15.11.17
10:33
(9) так и как быть то?
13 h-sp
 
15.11.17
10:34
(11) что означает эта магическая формула? И какое отношение она имеет к теме разговора?
14 azernot
 
15.11.17
10:35
(12) Подумать, что ты хочешь получить, посмотреть что ты по факту получаешь, и понять, как добиться того, чтобы эти две сущности совпали.
15 h-sp
 
15.11.17
10:35
(12) не использовать срез последних.
16 HEKPOH
 
15.11.17
10:37
(0) в инете много статей, объясняющих что такое "срез последних". Изучай
17 Cyberhawk
 
15.11.17
10:38
(12) Отдай на аутсорс
18 azernot
 
15.11.17
10:38
Срез последних лучше всего понимается через пример  "КурсыВалют".
Есть измерение - Валюта, есть ресурс - Курс.
Срез на дату - даст последние (на эту дату) курсы каждой валюты. Было бы странно, если бы срез выдавал самый последний введённый курс по какой-то непонятной валюте.
19 grandmaster
 
15.11.17
10:42
ахаха у меня такое чувство, что я попал на ответы мэила.

- что это значит?
Cyberhawk
(3) То и значит

- что тогда делать?
h-sp
(12) не использовать срез последних.

не все же такие умные господа, как вы
могли бы и помочь человеку.
20 grandmaster
 
15.11.17
10:42
(18) спасибо, более-менее уже прояснилось
21 azernot
 
15.11.17
10:43
(19) Это всего лишь означает, что тебе надо переформулировать вопрос. Если ты не получаешь ответ, значит твой вопрос непонятен.
22 grandmaster
 
15.11.17
10:45
(21) что может быть не понятного в том, что мне надо получить последнюю запись регистра сведений. что тут может быть не понятного то?
23 azernot
 
15.11.17
10:47
(22) Если бы в (0) не было текста запроса, ты бы уже получил ответ. Но текст запроса, говорит о том, что не всё так просто.
Для чего тебе запись? Ты хочешь получить документ из неё?
24 grandmaster
 
15.11.17
10:47
последняя созданная строка в регистре сведений
25 grandmaster
 
15.11.17
10:48
(23) идентификатор
26 lodger
 
15.11.17
10:48
вот здесь добавь &ВариантОбмена

ИЗ
РегистрСведений.ДокументыЭД.СрезПоследних(&ТекущаяДата,&ВариантОбмена) КАК ДокументыЭДСрезПоследних

"РеализацияТоваровУслуг.Ссылка КАК Ссылка" - поменять на ДокументыЭДСрезПоследних.Документ.

в ГДЕ пиши
ДокументыЭДСрезПоследних.Документ ССЫЛКА Документ.РеализацияТоваровУслуг

соединение с таблицей "Документ.РеализацияТоваровУслуг" пока что убери. потом с ней разберешься.
27 azernot
 
15.11.17
10:52
ВЫБРАТЬ ПЕРВЫЕ 1
    ДокументыЭД.Документ КАК Документ ,
    ДокументыЭД.ВариантОбмена КАК ВариантОбмена ,
    ДокументыЭД.Файл КАК Файл ,
    ДокументыЭД.Статус КАК Статус,
    ДокументыЭД.ИдентификаторЗапроса КАК ИдентификаторЗапроса
ИЗ
    РегистрСведений.ДокументыЭД КАК ДокументыЭД
ГДЕ
    ДокументыЭД.Период <= &НужнаяДата

УПОРЯДОЧИТЬ ПО
    Период УБЫВ
28 lodger
 
15.11.17
10:53
(27) получишь один ближайший документ перед указанной датой. это то что ТопикСтартеру и надо было?
29 azernot
 
15.11.17
10:56
(28) Исходя из (24) - да. Если ТС получит не то, что ожидает, он переформулирует задачу.
30 Cyberhawk
 
15.11.17
10:58
(22) Вроде тебе уже ответили в этой ветке, как это сделать
31 grandmaster
 
15.11.17
11:07
(26) Неверные параметры "РегистрСведений.ДокументыЭД.СрезПоследних, 1"
РегистрСведений.ДокументыЭД.СрезПоследних(&ТекущаяДата,<<?>>&ВариантОбмена ) КАК ДокументыЭДСрезПоследних
32 lodger
 
15.11.17
11:07
(31) ну додумкал бы. ВариантОбмена = &ВариантОбмена
33 grandmaster
 
15.11.17
11:12
(32)  ВЫБРАТЬ
    ДокументыЭДСрезПоследних.ИдентификаторЗапроса КАК ИдентификаторЗапроса,
    ДокументыЭДСрезПоследних.Период КАК Период,
    ДокументыЭДСрезПоследних.Документ КАК Документ,
    ДокументыЭДСрезПоследних.ВариантОбмена КАК ВариантОбмена
ИЗ
    РегистрСведений.ДокументыЭД.СрезПоследних(&ТекущаяДата, ВариантОбмена=&ВариантОбмена И Документ=&Документ) КАК ДокументыЭДСрезПоследних
ГДЕ
    ДокументыЭДСрезПоследних.ВариантОбмена = &ВариантОбмена
34 lodger
 
15.11.17
11:15
(33) в этом случаем
"ГДЕ ДокументыЭДСрезПоследних.ВариантОбмена = &ВариантОбмена" - избыточное условие. оно уже выполнено тут "ВариантОбмена=&ВариантОбмена".

по итогу, вот это то что ты хотел?
35 h-sp
 
15.11.17
11:17
(34) всё-таки (27) он хотел. Наверное.
36 grandmaster
 
15.11.17
11:17
(34) ВЫБРАТЬ
    ДокументыЭДСрезПоследних.ИдентификаторЗапроса КАК ИдентификаторЗапроса,
    ДокументыЭДСрезПоследних.Период КАК Период,
    ДокументыЭДСрезПоследних.Документ КАК Документ,
    ДокументыЭДСрезПоследних.ВариантОбмена КАК ВариантОбмена
ИЗ
    РегистрСведений.ДокументыЭД.СрезПоследних(
            &ТекущаяДата,
            ВариантОбмена = &ВариантОбмена
                И Документ = &Документ) КАК ДокументыЭДСрезПоследних
ГДЕ
    ДокументыЭДСрезПоследних.ВариантОбмена = &ВЕТИС        
    И ДокументыЭДСрезПоследних.Документ = &РеализацияТоваровУслуг

возвращает 0 строк
37 h-sp
 
15.11.17
11:19
(36) ну наверно разные задаешь параметры &Документ и &РеализацияТоваровУслуг. Задай одинаково.
38 grandmaster
 
15.11.17
11:28
(37) где я задаю?
у меня &РеализацияТоваровУслуг это нужное значение поля ДокументыЭДСрезПоследних.Документ
39 Мимохожий Однако
 
15.11.17
11:29
Возьми консоль запросов. На ней и тренируй свои запросы
40 lodger
 
15.11.17
11:31
(36) пиши так:
ВЫБРАТЬ
    ДокументыЭДСрезПоследних.ИдентификаторЗапроса КАК ИдентификаторЗапроса,
    ДокументыЭДСрезПоследних.Период КАК Период,
    ДокументыЭДСрезПоследних.Документ КАК Документ,
    ДокументыЭДСрезПоследних.ВариантОбмена КАК ВариантОбмена
ИЗ
    РегистрСведений.ДокументыЭД.СрезПоследних(
            &ТекущаяДата,
            ВариантОбмена = &ВЕТИС
                И Документ = &РеализацияТоваровУслуг) КАК ДокументыЭДСрезПоследних
41 azernot
 
15.11.17
11:31
Мне просто интересно, как ТС понимает параметеры:
&ВариантОбмена
&Документ

И почему заводит отдельные параметры
&ВЕТИС
&РеализацияТоваровУслуг
42 grandmaster
 
15.11.17
11:34
(41)
&ВЕТИС
&РеализацияТоваровУслуг

Это значения параметров по которым я делаю срез
43 grandmaster
 
15.11.17
11:34
(39) так в ней и работаю
44 h-sp
 
15.11.17
11:36
(42) ну и пиши как в (40) это как раз срез.

а то что ты пишешь

ГДЕ
    ДокументыЭДСрезПоследних.ВариантОбмена = &ВЕТИС        
    И ДокументыЭДСрезПоследних.Документ = &РеализацияТоваровУслуг

это уже не срез. Это бред какой-то. Выкинь это ГДЕ.
45 azernot
 
15.11.17
11:36
(42) А что такое
&ВариантОбмена
&Документ
?
И почему это не
&ВЕТИС
&РеализацияТоваровУслуг
?


И таки не совсем последняя запись тебе нужна, а последняя по конкретному документу и варианту обмена? ;)
46 grandmaster
 
15.11.17
11:40
(45) ну у меня и так и так вы водит строки
47 Мимохожий Однако
 
15.11.17
11:41
(7) Регистр подчинён регистратору?
48 grandmaster
 
15.11.17
13:15
(45)
&ВариантОбмена И &Документ - это параметры
А ВЕТИС и РеализацияТоваровУслуг - это значения этих параметров по которым идёт отбор

(44) Почему же бред. Если я пишу условие параметров, по которым надо найти строку
49 Мимохожий Однако
 
15.11.17
13:19
(48) Сначала получи таблицу без отбора, потом добавляй, если не удаётся разобраться.
Повторяю вопрос: Регистр подчинён регистратору?
50 h-sp
 
15.11.17
13:20
(48) в этом ваша ошибка. Потому что &ВариантОбмена И &Документ тоже значения.
51 Сти
 
15.11.17
13:21
(48) бред - потому что в условии самого среза (которое внутри скобок) оно уже отобрано по этим условиям
52 azernot
 
15.11.17
13:22
(48) Вы попробовали запрос из (40)? Он выдал то, что вы хотели?
53 grandmaster
 
15.11.17
13:26
(49) не подченён регистру

(52) нет не выдал, ничего не выдал

ИЗ
    РегистрСведений.ДокументыЭД.СрезПоследних(
            &ТекущаяДата,
            ВариантОбмена = &ВЕТИС
                И Документ = &РеализацияТоваровУслуг) КАК ДокументыЭДСрезПоследних

Тут значения параметров записаны в виде параметра т.к.  стоит амперсант. Вроде так нельзя писать
54 azernot
 
15.11.17
13:28
(53) Давайте весь код, как вы инициируете запрос, какие параметры устанавливаете, как запрос выполняете. Похоже это единственный способ вам помочь

Запрос в (40) безупречен, он не может не сработать, если у вас есть в регистре записи по варианту обмена &ВЕТИС и по документу &РеализацияТоваровУслуг
55 h-sp
 
15.11.17
13:31
(54) получается, что не получится. ему надо

Документ ССЫЛКА РеализацияТоваровУслуг
56 grandmaster
 
15.11.17
13:32
(54)     Запрос = Новый Запрос();
    Запрос.Текст = "ВЫБРАТЬ
                   |    ДокументыЭДСрезПоследних.ИдентификаторЗапроса КАК ИдентификаторЗапроса,
                   |    ДокументыЭДСрезПоследних.Период КАК Период,
                   |    ДокументыЭДСрезПоследних.Документ КАК Документ,
                   |    ДокументыЭДСрезПоследних.ВариантОбмена КАК ВариантОбмена
                   |ИЗ
                   |    РегистрСведений.ДокументыЭД.СрезПоследних(
                   |            &ТекущаяДата,
                   |            ВариантОбмена = &ВариантОбмена
                   |                И Документ = &Документ)
                   | КАК ДокументыЭДСрезПоследних";
    Запрос.УстановитьПараметр("ВариантОбмена", "ВЕТИС");
    Запрос.УстановитьПараметр("Документ",      "РеализацияТоваровУслуг");
    Запрос.УстановитьПараметр("ТекущаяДата",   ТекущаяДата());
    
    Результат = Запрос.Выполнить().Выгрузить();
57 azernot
 
15.11.17
13:33
(56) Этот запрос не сработает точно.
Возвращаемся к началу.
Что вам нужно?
Пробовали ли вы запрос из (27)? Чем он вас не устроил?
58 grandmaster
 
15.11.17
13:36
(57) возвращать последнее значение с отбором "ВариантОбмена", "ВЕТИС");
"Документ",      "РеализацияТоваровУслуг");
59 azernot
 
15.11.17
13:37
(56) Далее.
Какой тип имеет измерение "ВариантОбмена" регистра "ДокументыЭД"?

Что будет если вместо "И Документ = &Документ" написать
"И Документ ССЫЛКА Документ.РеализацияТоваровУслуг"
60 azernot
 
15.11.17
13:37
(58) Таких записей в регистре нет (если конечно, измерение "Документ" не имеет тип "Строка")
61 azernot
 
15.11.17
13:39
(58) Давайте зайдём с другого конца. Какую задачу вы решаете? Для чего вам эти записи, что вы с ними будете делать? И вообще, это какая-то типовая конфигурация или полная самописка?
62 grandmaster
 
15.11.17
13:40
(59) Тип измерения "ВариантОбмена"
ПеречислениеСсылка.ВариантыУниверсальногоОбмена
63 azernot
 
15.11.17
13:41
(62) Так
попробуйте
64 grandmaster
 
15.11.17
13:41
(61) по последней данной записи мне нужно вытягивать из поля идентификатор - значение
65 azernot
 
15.11.17
13:41
Запрос.УстановитьПараметр("ВариантОбмена", Перечисление.ВариантыУниверсальногоОбмена.ВЕТИС);
66 azernot
 
15.11.17
13:42
Короче, вот так попробуйте, вообще без параметров, кроме даты

ВЫБРАТЬ
    ДокументыЭДСрезПоследних.ИдентификаторЗапроса КАК ИдентификаторЗапроса,
    ДокументыЭДСрезПоследних.Период КАК Период,
    ДокументыЭДСрезПоследних.Документ КАК Документ,
    ДокументыЭДСрезПоследних.ВариантОбмена КАК ВариантОбмена
ИЗ
    РегистрСведений.ДокументыЭД.СрезПоследних(
            &ТекущаяДата,
            ВариантОбмена = Значение(Перечисление.ВариантыУниверсальногоОбмена.ВЕТИС)
                И Документ ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ДокументыЭДСрезПоследних
67 grandmaster
 
15.11.17
13:47
(66) слава яйцам
прошу за грубость))
возвращает теперь все значения с ВЕТИС и Документом реализация товаров и услуг
Осталось теперь получать только последнее по текущей дате
68 azernot
 
15.11.17
13:48
(67) Пи...ц (прошу за грубость).

Чем не устроил этот запрос?

ВЫБРАТЬ ПЕРВЫЕ 1
    ДокументыЭД.Документ КАК Документ ,
    ДокументыЭД.ВариантОбмена КАК ВариантОбмена ,
    ДокументыЭД.Файл КАК Файл ,
    ДокументыЭД.Статус КАК Статус,
    ДокументыЭД.ИдентификаторЗапроса КАК ИдентификаторЗапроса
ИЗ
    РегистрСведений.ДокументыЭД КАК ДокументыЭД
ГДЕ
    ДокументыЭД.Период <= &НужнаяДата

УПОРЯДОЧИТЬ ПО
    Период УБЫВ
69 azernot
 
15.11.17
13:51
Если проблема в том, что даёт не по ВЕТИС, и не по РеализацииТоваровУслуг, то надо просто дописать условия:

ВЫБРАТЬ ПЕРВЫЕ 1
    ДокументыЭД.Документ КАК Документ ,
    ДокументыЭД.ВариантОбмена КАК ВариантОбмена ,
    ДокументыЭД.Файл КАК Файл ,
    ДокументыЭД.Статус КАК Статус,
    ДокументыЭД.ИдентификаторЗапроса КАК ИдентификаторЗапроса
ИЗ
    РегистрСведений.ДокументыЭД КАК ДокументыЭД
ГДЕ
    ДокументыЭД.Период <= &НужнаяДата
       И ДокументыЭД.ВариантОбмена = Значение(Перечисление.ВариантыУниверсальногоОбмена.ВЕТИС)
       И ДокументыЭД.Документ ССЫЛКА Документ.РеализацияТоваровУслуг

УПОРЯДОЧИТЬ ПО
    Период УБЫВ
70 grandmaster
 
15.11.17
13:51
(68) Ну потому что здесь берёт последнюю запись из регистра. Без отбора.
Тоесть последней может быть с другим документом и статусом и запрос её выберет
71 grandmaster
 
15.11.17
13:52
(69) щас попробую
72 grandmaster
 
15.11.17
13:52
(69) вместо &НужнаяДата я так понял писать ТекущаяДата()?
73 azernot
 
15.11.17
13:53
Запрос.УстановитьПараметр("НужнаяДата",   ТекущаяДата());
74 grandmaster
 
15.11.17
13:54
(73) ну да я это и имел ввиду
75 azernot
 
15.11.17
13:58
(74) А вы можете предположить, почему я написал именно "НужнаяДата", а не "ТекущаяДата"?
76 grandmaster
 
15.11.17
14:03
(73) а не подскажете как теперь вытянуть из запроса поле (идентификатор запроса). управляемая форма. не находит идентификаторзапроса

    Запрос = Новый Запрос();
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                   |    ДокументыЭД.Документ КАК Документ,
                   |    ДокументыЭД.ВариантОбмена КАК ВариантОбмена,
                   |    ДокументыЭД.Файл КАК Файл,
                   |    ДокументыЭД.Статус КАК Статус,
                   |    ДокументыЭД.ИдентификаторЗапроса КАК ИдентификаторЗапроса
                   |ИЗ
                   |    РегистрСведений.ДокументыЭД КАК ДокументыЭД
                   |ГДЕ
                   |    ДокументыЭД.Период <= &НужнаяДата
                   |    И ДокументыЭД.ВариантОбмена = ЗНАЧЕНИЕ(Перечисление.ВариантыУниверсальногоОбмена.ВЕТИС)
                   |    И ДокументыЭД.Документ ССЫЛКА Документ.РеализацияТоваровУслуг
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    ДокументыЭД.Период УБЫВ";
    Запрос.УстановитьПараметр("НужнаяДата",   ТекущаяДата());
    
    Результат = Запрос.Выполнить().Выгрузить();  
      
    receiveRequestXDTO.applicationId    = Результат.ИдентификаторЗапроса;
77 grandmaster
 
15.11.17
14:04
(75) честно не знаю даже
78 h-sp
 
15.11.17
14:04
receiveRequestXDTO.applicationId    = Результат[0].ИдентификаторЗапроса;
79 grandmaster
 
15.11.17
14:09
azernot и  h-sp - огромное вам спасибо добрые люди! +1 вам к карме. Всё вышло что хотел. Впредь буду более аккуратен, в первую очередь в постановки вопрос
80 azernot
 
15.11.17
14:09
Результат = Запрос.Выполнить().Выгрузить();  
Выборка = Результат.Выбрать();
Если Выборка.Следующий() ТОгда
      
    receiveRequestXDTO.applicationId    = Результат.ИдентификаторЗапроса;
Иначе
    receiveRequestXDTO.applicationId    = "Нет записей!";
КОнецЕсли;
81 azernot
 
15.11.17
14:10
Т.е. так:
    
Результат = Запрос.Выполнить().Выгрузить();  
Выборка = Результат.Выбрать();
Если Выборка.Следующий() ТОгда
      
    receiveRequestXDTO.applicationId    = Выборка.ИдентификаторЗапроса;
Иначе
    receiveRequestXDTO.applicationId    = "Нет записей!";
КОнецЕсли;
82 azernot
 
15.11.17
14:11
А-а, там Выгрузить() уже есть.. тогда (78). ТОлько может быть там нет ни одной строки, и будет ошибка.
83 grandmaster
 
15.11.17
14:15
(82) не будет, оно сначала выгружает ответ сервера в регистр, затем по идентификатору выполняется запрос на сервер. Вообще м ошибки в любом случае не будет!
Ещё раз спасибо
84 azernot
 
15.11.17
14:16
(77) А всё просто. Потому, что там не обязательно именно Текущая дата. Запрос сработает с любой датой.
Захотите вы получить последнюю запись по Вентису, по реализации за прошлый год - просто передадите туда конец прошлого года.
85 lodger
 
15.11.17
15:15
почитал ветку с начала - слов нет.
ыыы.