Имя: Пароль:
1C
 
Искусственный срез последних
0 Demetres
 
14.11.14
09:46
Добрый день! Нужно получить искусственный срез последних. В одну и туже секунду может быть несколько документов. Нужно выбрать тот который был проведен последним. После группировки по периоду делаю группировку по регистратору, это правильно?

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_ПраваПользователей.Сотрудник,
    ВТ_ПраваПользователей.Физлицо,
    ИмяРегистраПоКоторомуНуженСрез.Период,
    ИмяРегистраПоКоторомуНуженСрез.Регистратор,
    ИмяРегистраПоКоторомуНуженСрез.Состояние
ПОМЕСТИТЬ ВТ_СостоянияПользователей
ИЗ
    ВТ_ПраваПользователей КАК ВТ_ПраваПользователей
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ИмяРегистраПоКоторомуНуженСрез КАК ИмяРегистраПоКоторомуНуженСрез
        ПО ВТ_ПраваПользователей.Сотрудник= ИмяРегистраПоКоторомуНуженСрез.Сотрудник
            И ВТ_ПраваПользователей.ПериодКонец >= ИмяРегистраПоКоторомуНуженСрез.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_СостоянияПользователей.Сотрудник,
    МАКСИМУМ(ВТ_СостоянияПользователей.Период) КАК Период
ПОМЕСТИТЬ ВТ_ГруппировакаСостоянийПериод
ИЗ
    ВТ_СостоянияПользователей КАК ВТ_СостоянияПользователей

СГРУППИРОВАТЬ ПО
    ВТ_СостоянияПользователей.ПользовательРесурсов
;

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

СГРУППИРОВАТЬ ПО
    ВТ_СостоянияПользователей.Сотрудник,
    ВТ_СостоянияПользователей.Период
;

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

Или нужно делать после группировки по периоду делать соединение по регистратору и сравнивать момент времени, и выбирать там где ЕСТЬ NULL

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_ПраваПользователей.Сотрудник,
    ВТ_ПраваПользователей.Физлицо,
    ИмяРегистраПоКоторомуНуженСрез.Период,
    ИмяРегистраПоКоторомуНуженСрез.Регистратор,
    ИмяРегистраПоКоторомуНуженСрез.Состояние,
    ИмяРегистраПоКоторомуНуженСрез.МоментВремени
ПОМЕСТИТЬ ВТ_СостоянияПользователей
ИЗ
    ВТ_ПраваПользователей КАК ВТ_ПраваПользователей
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ИмяРегистраПоКоторомуНуженСрез КАК ИмяРегистраПоКоторомуНуженСрез
        ПО ВТ_ПраваПользователей.Сотрудник= ИмяРегистраПоКоторомуНуженСрез.Сотрудник
            И ВТ_ПраваПользователей.ПериодКонец >= ИмяРегистраПоКоторомуНуженСрез.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_СостоянияПользователей.Сотрудник,
    МАКСИМУМ(ВТ_СостоянияПользователей.Период) КАК Период
ПОМЕСТИТЬ ВТ_ГруппировакаСостоянийПериод
ИЗ
    ВТ_СостоянияПользователей КАК ВТ_СостоянияПользователей

СГРУППИРОВАТЬ ПО
    ВТ_СостоянияПользователей.ПользовательРесурсов
;

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

;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_СостоянияПользователей.Сотрудник,
    ВТ_СостоянияПользователей.Физлицо,
    ВТ_ГруппировакаСостоянийСсылка.Регистратор
ИЗ
    ВТ_СостоянияПользователей КАК ВТ_СостоянияПользователей
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ГруппировакаСостоянийСсылка КАК ВТ_ГруппировакаСостоянийСсылка
        ПО ВТ_СостоянияПользователей.Сотрудник= ВТ_ГруппировакаСостоянийСсылка.Сотрудник
            И ВТ_СостоянияПользователей.Регистратор = ВТ_ГруппировакаСостоянийСсылка.Регистратор
            И ВТ_СостоянияПользователей.Период = ВТ_ГруппировакаСостоянийСсылка.Период
1 СвинТуз
 
14.11.14
09:48
купи себе книгу и почитай
в учебниках это есть
сотри тот толмуд где регистры описываются
2 Demetres
 
14.11.14
09:51
(1) спасибо за совет, не совсем понял что нужно СТИРАТЬ
3 hhhh
 
14.11.14
09:52
(2) буква М выпала
4 Demetres
 
14.11.14
09:56
(3) да я понял :) просто шутка (лопата)
Ну так что подскажите или придется книжку искать и ковырять, если честно лень немного.
5 manti
 
14.11.14
10:09
(4) база самокат? У Вас при выполнении какого из запросов выбираются более-менее актуальные данные?
6 Salimbek
 
14.11.14
10:09
(4) Тут посмотри "Что есть срез последних в платформе?": http://helpf.pro/faq82/view/1499.html
7 ДемонМаксвелла
 
14.11.14
10:11
если регистраторы разных типов, то в пределах секунды ты их не отсортируешь
8 Demetres
 
14.11.14
10:17
(7) Почему не отсортирую, второй вариант вполне жизнеспособен
9 Demetres
 
14.11.14
10:25
(7) хотя наверное да, сейчас базу какую-нибудь сделаю проверю.
10 ДемонМаксвелла
 
14.11.14
10:27
я имею в виду, что повторяемость и предсказуемость сортировки не гарантирована
11 Gantoha
 
14.11.14
10:31
да, да ..если на тестовых данных получишь что работает, то это не значит что это будет всегда работать. Вообще в конечном счете если есть упорядочивающий признак , то время хорошо упорядочивает события, но если они происходят одновременно и все таки упорядочены между собой, то значит не хватает какого то еще атрибута который этот порядок описывает.
12 Demetres
 
14.11.14
10:38
Ребята так как же отобрать последний проведенный документ в одной секунде?
13 Михаил Козлов
 
14.11.14
10:40
(12) В каком смысле последний? (Последний предполагает упорядочивание).
14 Demetres
 
14.11.14
10:51
(13) В смысле если сделать срез последних регистра сведений то получить те же данные
15 ДемонМаксвелла
 
14.11.14
10:53
(14) ну и сделай срез последних регистра сведений
16 Demetres
 
14.11.14
11:04
(15) Так как это сделать??? Если тебе нужно сединиться с таблицей и для каждой строки срез на свою дату должен быть?

Если регистраторы разных типов то ни 1 ни 2 вариант в шапке не работает. Если есть идеи милости просим :)
17 Demetres
 
14.11.14
11:16
(1) Можете что-то предложить, если честно то по моему нельзя это сделать в запросе (при условии что регистраторы разных типов).
18 ДемонМаксвелла
 
14.11.14
11:18
(16) тебе видимо нужен "срез последних на каждую дату в запросе" а не то что ты пишешь? ну так поищи в поиске, сто раз решалось.

для определенного набора измерений найти срез последних не проблема, а абстрактная задача "кто последний двинул регистр в эту секунду, и пофиг на измерения" - такая задача никому не нужна, и не решаема

может я просто не понимаю, что ты хочешь. Но видимо не только я
19 Demetres
 
14.11.14
11:26
(18) Так я и писал, искусственный срез последних, разве это не одно и тоже что срез последних на каждую дату в запросе? Нужно получить аналогичные данные как РегистрСведений.ИмяРегистра.СрезПоследних(&ТекДата) только для каждой строки, а в каждой строке &ТекДата разные.
Простите если плохо объяснил.
20 ДемонМаксвелла
 
14.11.14
11:28
21 Demetres
 
14.11.14
11:29
(18) Во всех источниках там регистратор одного типа. И можно группировать по периоду и потом по ссылке, а у меня регистраторы разных типов.
(20) нет там такого
22 Salimbek
 
14.11.14
11:30
(19) Цитирую первый абзац из ссылки в (6)
"1С 8.2 УП : Срез последних (остатки) на каждую дату
Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).

Существует несколько способов получить нужные данные.
..."
и т.д.
23 Salimbek
 
14.11.14
11:31
хм... в (20) то же самое
24 ДемонМаксвелла
 
14.11.14
11:32
(23) думаю миста первична, там авторы указаны
25 Demetres
 
14.11.14
11:37
(24) (22) Я только что попробовал вариант из (20) для запроса, не работаю они для регистратора с разными типами.
Группировки возвращают разные данные с данными если брать РегистрСведений.ИмяРегистра.СрезПоследних(&ТекДата)
26 Salimbek
 
14.11.14
11:42
(25) х.з. я для себя делал так (пришлось потому, что Цены могут быть заданы как на конкретный магазин, так и на всю сеть разом):

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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    СтруктурнаяЕдиница
;
27 Demetres
 
14.11.14
11:47
(26) Это понятно, а у меня в одни Период может несколько регистраторов (разных типов) записать для одного и того же набор разные Цены.
28 ДемонМаксвелла
 
14.11.14
11:48
(27) по одному и тому же полному набору измерений?
29 Salimbek
 
14.11.14
11:50
(27) А ты у меня в запросе увидел где-то привязку к типу Регистратора?
30 Demetres
 
14.11.14
11:50
(28) Да, но конфликта нет так как в регистре стоит Режим записи: "Подчинение регистратору".
31 Demetres
 
14.11.14
11:52
(28) Регистратор тоже получается измерение
32 Demetres
 
14.11.14
11:53
(29) нет, в (27) я дописал как в моем случае
33 ДемонМаксвелла
 
14.11.14
11:53
(30) и я о том же
34 Demetres
 
14.11.14
11:54
(33) Режим записи нет возможности менять
35 Demetres
 
14.11.14
11:55
(33) имел ввиду периодичность, простите. Периодичность должна быть по позиции регистратор.
36 Demetres
 
14.11.14
11:58
(28) Периодичность по позиции регистратора, нет ошибки при проведении в одну и ту же секунду.
37 ДемонМаксвелла
 
14.11.14
11:58
ладно, разбирайся. я на обед.
38 Demetres
 
14.11.14
12:00
(37) приятного аппетита :)
39 Salimbek
 
14.11.14
12:09
(38) Кстати говоря - любопытный вопрос, вот сделал я Переоценкой цену в 100 руб. и в тот же момент другой пользователь документом ХитраяПереоценка ставит цену в 200 руб. Какая цена в итоге будет правильной и действующей?
40 Demetres
 
14.11.14
12:13
(39) Правильная будет та которую выдаст РегистрСведений.ИмяРегистра.СрезПоследних() они же все равно запишутся в какой-то последовательности
41 Salimbek
 
14.11.14
12:31
(40) Ну если хочешь 100% задублировать, то, как указано в (20):
"Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов "
т.е. посмотреть тут - какие запросы получаются на выходе и в своем запросе шлифовать до полного соответствия.
42 Demetres
 
14.11.14
13:10
(41) А как его включить :) подскажите нубу
43 Demetres
 
14.11.14
14:01
(41) на работе не получится, прав нет, дома попробую, спасибо за идею