Имя: Пароль:
1C
1С v8
Работа запроса
0 ComradeKite
 
27.11.14
14:43
Всем привет!

Пытаюсь реализовать бронирование товаров из букваря по 1С.
Делаю простой запрос.
Формирую данные из документа, соединяю их с остатками номенклатуры параметры(моментвремени и Склад-Номенклатура) и соединяю с регистром бронирование товаров НО дату оставляю пустой и фильтрую по Склад-Номенклатура. В консоли все выполняется и данные те что хочу. В коде 1с не работает. Остатки забронированного всегда 0.

Чувствую что то с параметром момент времени, но что не понимаю.
Подскажите в чем глюк то.
Спасибо

Сам запрос такой:
"ВЫБРАТЬ
|ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
|СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
|ПродажаТоваровТовары.Ссылка.Склад КАК Склад
|ПОМЕСТИТЬ ТабДок
|ИЗ
|Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|ГДЕ
|ПродажаТоваровТовары.Ссылка = &Ссылка
|И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
|
|СГРУППИРОВАТЬ ПО
|    ПродажаТоваровТовары.Номенклатура,
|    ПродажаТоваровТовары.Ссылка.Склад
|
|ИНДЕКСИРОВАТЬ ПО
|    Номенклатура,
|    Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ТабДок.Номенклатура,
|    ТабДок.Количество,
|    ТабДок.Склад,
|    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
|    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
|    ЕСТЬNULL(БронированиеТоваровОстатки.КоличествоЗабронированногоОстаток, 0) КАК КоличествоЗабронированного
|ИЗ
|    ТабДок КАК ТабДок
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
|                &Момент,
|                (Номенклатура, Склад) В
|                    (ВЫБРАТЬ
|                        ТабДок.Номенклатура,
|                        ТабДок.Склад
|                    ИЗ
|                        ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
|        ПО ТабДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.БронированиеТоваров.Остатки(
|                &Момент,
|                (Номенклатура, Склад) В
|                    (ВЫБРАТЬ
|                        ТабДок.Номенклатура,
|                        ТабДок.Склад
|                    ИЗ
|                        ТабДок КАК ТабДок)) КАК БронированиеТоваровОстатки
|        ПО ТабДок.Номенклатура = БронированиеТоваровОстатки.Номенклатура";
1 shuhard
 
27.11.14
14:45
(0) форум должен угадать, что ты запихиваешь в Момент ?
2 18_plus
 
27.11.14
14:45
у тебя что-то с параметром момент времени
3 ComradeKite
 
27.11.14
14:45
Если Режим = РежимПроведенияДокумента.Оперативный Тогда            
        Запрос.УстановитьПараметр("Момент", Неопределено);
    Иначе            
        Запрос.УстановитьПараметр("Момент", МоментВремени());
    КонецЕсли;
4 spero
 
27.11.14
14:46
(0) Что за букварь по 1С?
5 Alex S D
 
27.11.14
14:46
(1) первый раз чтоли?
6 ComradeKite
 
27.11.14
14:47
При обучении на курсах выдают.
7 pessok
 
27.11.14
14:48
вангую
МоментВремени = ТекущаяДата();
Запрос.УстановитьПараметр("Момент", Момент);
8 ComradeKite
 
27.11.14
14:49
Ну как то я не профи в 1с. Уже второй раз нарываюсь, должно работать, а не работает.

to pessok: Думаю не прокатит, так как момент это дата и ссылка.
9 pessok
 
27.11.14
14:50
(8) так о том и речь. мы _не_ знаем, что ты пихаешь в момент в параметре. самому запросу пофик, будет там дата или будет там моментвремени
10 pessok
 
27.11.14
14:50
+(9) установку параметров давай сюда, короче говоря
11 spero
 
27.11.14
14:50
В консоли ты что в параметр &Момент ставишь?
12 ComradeKite
 
27.11.14
14:54
Сегодняшнюю дату.

Вот правильный код, там во второй виртуальной таблице должен быть пустой параметр. В первом посте я экспериментировал и поставил его. Это не правильно.

"ВЫБРАТЬ
    |    ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
    |    СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
    |    ПродажаТоваровТовары.Ссылка.Склад КАК Склад
    |ПОМЕСТИТЬ ТабДок
    |ИЗ
    |    Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
    |ГДЕ
    |    ПродажаТоваровТовары.Ссылка = &Ссылка
    |    И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПродажаТоваровТовары.Номенклатура,
    |    ПродажаТоваровТовары.Ссылка.Склад
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура,
    |    Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТабДок.Номенклатура,
    |    ТабДок.Количество,
    |    ТабДок.Склад,
    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
    |    ЕСТЬNULL(БронированиеТоваровОстатки.КоличествоЗабронированногоОстаток, 0) КАК КоличествоЗабронированного
    |ИЗ
    |    ТабДок КАК ТабДок
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |                &Момент,
    |                (Номенклатура, Склад) В
    |                    (ВЫБРАТЬ
    |                        ТабДок.Номенклатура,
    |                        ТабДок.Склад
    |                    ИЗ
    |                        ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
    |        ПО ТабДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.БронированиеТоваров.Остатки(
    |                ,
    |                (Номенклатура, Склад) В
    |                    (ВЫБРАТЬ
    |                        ТабДок.Номенклатура,
    |                        ТабДок.Склад
    |                    ИЗ
    |                        ТабДок КАК ТабДок)) КАК БронированиеТоваровОстатки
    |        ПО ТабДок.Номенклатура = БронированиеТоваровОстатки.Номенклатура";
13 pessok
 
27.11.14
14:55
(12) пожалуйста
дай
нам
код
установки
параметров
14 ComradeKite
 
27.11.14
14:56
В первой виртуальной таблице ОстаткиНоменклатуры у меня в параметрах стоит Момент-параметр.

Во второй виртуальной БронированиеТоваров дата пустая, хочу получить все остатки.

Кажется мне механизм запросов подсовывает и во вторую виртуальную первый параметр.
15 ComradeKite
 
27.11.14
14:57
3 пост, установка параметров.
16 ComradeKite
 
27.11.14
14:58
Если Режим = РежимПроведенияДокумента.Оперативный Тогда            
        Запрос.УстановитьПараметр("Момент", Неопределено);
    Иначе            
        Запрос.УстановитьПараметр("Момент", МоментВремени());
    КонецЕсли;
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
17 pessok
 
27.11.14
14:58
(15) а, извини.
ну да, ошибка тут
Момент = Новый МоментВремени(Док.Дата, Док.Ссылка);
18 ComradeKite
 
27.11.14
14:59
to pessok
Полный в посте 16, там еще ссылка.
19 pessok
 
27.11.14
15:00
+(17) но вобоще твоему запросу наплевать на момент, относительно регистра БронированиеТоваров, у тебя остатки по нему берутся на текущий момент.
+ убери из параметров виртуальной таблицы (Номенклатура, Склад) В
    |                    (ВЫБРАТЬ
    |                        ТабДок.Номенклатура,
    |                        ТабДок.Склад
    |                    ИЗ
    |                        ТабДок КАК ТабДок)

и сделай это в соединении
20 ComradeKite
 
27.11.14
15:04
пост 17 не работает.

По поводу 19 поста, тут в букваре говорят что так делать не желательно. Потому что надо по максимому фильтрануть вирт таблицу. Типа оптимизация производительности. А если убрать то веся виртуалка затянется на комп, а потом будет обработка.
21 ComradeKite
 
27.11.14
15:08
Вот самый простой запрос на регистр бронирования
Все работает, параметров нет вообще.
А в связке не работает.


Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    БронированиеТоваровОстатки.Номенклатура,
        |    БронированиеТоваровОстатки.Склад,
        |    БронированиеТоваровОстатки.КоличествоЗабронированногоОстаток
        |ИЗ
        |    РегистрНакопления.БронированиеТоваров.Остатки КАК БронированиеТоваровОстатки";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Сообщить(ВыборкаДетальныеЗаписи.КоличествоЗабронированногоОстаток);
        Сообщить(ВыборкаДетальныеЗаписи.Номенклатура);
        Сообщить(ВыборкаДетальныеЗаписи.Склад);
    КонецЦикла;
22 pessok
 
27.11.14
15:36
(20) _такая_ фильтрация не ускорит работу запроса, поверь мне. можешь проверить профайлером. ну или просто замером производительности
23 ComradeKite
 
27.11.14
15:49
Да бог с ней этой фильтрацией. Убрав ее вообще все равно не работает(((
24 Salimbek
 
27.11.14
15:56
(23) Напиши вместо
---
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |                &Момент,
...
просто
---
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |                ,
...
и не ставь Параметр вообще
25 ComradeKite
 
27.11.14
16:04
Так мне момент в этом соединении нужен. Мне остатки нужны из регистра ОстаткиНоменклатуры на момент времени.

А вот остатки из регистра БронированиеТоваров мне нужны за весь период.

Я вообще переписал запрос так, разбил на мелкие подзапросы. Думаю что то не в моменте а в связях.


"ВЫБРАТЬ
    |    ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
    |    СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
    |    ПродажаТоваровТовары.Ссылка.Склад КАК Склад
    |ПОМЕСТИТЬ ТабДок
    |ИЗ
    |    Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
    |ГДЕ
    |    ПродажаТоваровТовары.Ссылка = &Ссылка
    |    И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПродажаТоваровТовары.Номенклатура,
    |    ПродажаТоваровТовары.Ссылка.Склад
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура,
    |    Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ОстаткиНоменклатурыОстатки.Номенклатура,
    |    ОстаткиНоменклатурыОстатки.Склад,
    |    ОстаткиНоменклатурыОстатки.КоличествоОстаток,
    |    ОстаткиНоменклатурыОстатки.СуммаОстаток
    |ПОМЕСТИТЬ ОстНом
    |ИЗ
    |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |            &Момент,
    |            (Номенклатура, Склад) В
    |                (ВЫБРАТЬ
    |                    ТабДок.Номенклатура,
    |                    ТабДок.Склад
    |                ИЗ
    |                    ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    БронированиеТоваровОстатки.Номенклатура,
    |    БронированиеТоваровОстатки.Склад,
    |    БронированиеТоваровОстатки.КоличествоЗабронированногоОстаток
    |ПОМЕСТИТЬ ЗабрТов
    |ИЗ
    |    РегистрНакопления.БронированиеТоваров.Остатки(
    |            ,
    |            (Номенклатура, Склад) В
    |                (ВЫБРАТЬ
    |                    ТабДок.Номенклатура,
    |                    ТабДок.Склад
    |                ИЗ
    |                    ТабДок КАК ТабДок)) КАК БронированиеТоваровОстатки
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТабДок.Номенклатура,
    |    ТабДок.Количество,
    |    ТабДок.Склад,
    |    ЕСТЬNULL(ОстНом.КоличествоОстаток, 0) КАК КоличествоОстаток,
    |    ЕСТЬNULL(ОстНом.СуммаОстаток, 0) КАК СуммаОстаток,
    |    ЕСТЬNULL(ЗабрТов.КоличествоЗабронированногоОстаток, 0) КАК КоличествоЗабронированного
    |ИЗ
    |    ТабДок КАК ТабДок
    |        ЛЕВОЕ СОЕДИНЕНИЕ ОстНом КАК ОстНом
    |        ПО ТабДок.Номенклатура = ОстНом.Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ ЗабрТов КАК ЗабрТов
    |        ПО ТабДок.Номенклатура = ЗабрТов.Номенклатура";
26 ComradeKite
 
27.11.14
16:06
Глючная эта 1С до безумия, надо алгоритм менять, но а как же букварь.......
27 DrWatson
 
27.11.14
17:02
Вот не верю, что дело в 1С.
А во внутренних таблицах записи есть? Выполните вместо последнего запроса:
Выбрать * ИЗ ТабДок КАК ТабДок
и тоже самое для ОстНом и ЗабрТов
28 ComradeKite
 
27.11.14
17:06
Эсть конечно, в консоли все же показывает правильно.
29 DrWatson
 
27.11.14
17:10
Ну, в консоли и полный запрос работает. Значит дело не в запросе, а в коде. Поэтому это нужно проверить в коде.
30 H A D G E H O G s
 
27.11.14
17:20
(26) Конечно глючная, тебе нужно сменить профессию.
31 ComradeKite
 
27.11.14
17:22
Ватсон, не врублюсь куда воткнуть этот текст.
В чем суть эксперимента? Все по отдельности работают, а в едином запросе не срабатывают.
32 ComradeKite
 
27.11.14
17:23
to 26 Этот вариант ответа предсказуем и банален.
33 ComradeKite
 
27.11.14
17:23
to 30 Этот вариант ответа предсказуем и банален.
34 Зеленый пень
 
27.11.14
17:29
(25) А соединение по складу где?
35 DrWatson
 
27.11.14
17:30
(31) найти с какого места не работает.
Нужно 3 запроса на виртуальные таблицы оставить, а вместо последнего запроса на выборку написать простую выборку из вирт. таблицы, которую я привел. Результат потом смотреть в отладчике после
РезультатЗапроса = Запрос.Выполнить();
36 DrWatson
 
27.11.14
17:31
(34) причина траблы не в этом
37 ComradeKite
 
27.11.14
17:43
Ватсон, мощный таблшутинг. Из регистра бронирования данных нет, а в других данные есть.

Делал вот так.
"ВЫБРАТЬ
    |    ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
    |    СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
    |    ПродажаТоваровТовары.Ссылка.Склад КАК Склад
    |ПОМЕСТИТЬ ТабДок
    |ИЗ
    |    Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
    |ГДЕ
    |    ПродажаТоваровТовары.Ссылка = &Ссылка
    |    И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПродажаТоваровТовары.Номенклатура,
    |    ПродажаТоваровТовары.Ссылка.Склад
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура,
    |    Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ОстаткиНоменклатурыОстатки.Номенклатура,
    |    ОстаткиНоменклатурыОстатки.Склад,
    |    ОстаткиНоменклатурыОстатки.КоличествоОстаток,
    |    ОстаткиНоменклатурыОстатки.СуммаОстаток
    |ПОМЕСТИТЬ ОстНом
    |ИЗ
    |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |            &Момент,
    |            (Номенклатура, Склад) В
    |                (ВЫБРАТЬ
    |                    ТабДок.Номенклатура,
    |                    ТабДок.Склад
    |                ИЗ
    |                    ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    БронированиеТоваровОстатки.Номенклатура,
    |    БронированиеТоваровОстатки.Склад,
    |    БронированиеТоваровОстатки.КоличествоЗабронированногоОстаток
    |ПОМЕСТИТЬ ЗабрТов
    |ИЗ
    |    РегистрНакопления.БронированиеТоваров.Остатки(
    |            ,
    |            (Номенклатура, Склад) В
    |                (ВЫБРАТЬ
    |                    ТабДок.Номенклатура,
    |                    ТабДок.Склад
    |                ИЗ
    |                    ТабДок КАК ТабДок)) КАК БронированиеТоваровОстатки
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ * ИЗ ЗабрТов";
38 H A D G E H O G s
 
27.11.14
17:45
(22) Ускорит, если задана &ДатаОстатков, иначе замедлит некритично.
39 ComradeKite
 
27.11.14
17:47
Вот есть выгрузка. Можно проверить и в консоли и так.
Документ продажа товара, процедура проведения.
Консоль запускается из режима пользователя.
40 ComradeKite
 
27.11.14
17:47
41 H A D G E H O G s
 
27.11.14
17:49
Кстати, в теме
v8: Индексация колонок ВременныхТаблиц
я негодовал по поводу индексации колонок ВТ и говорил, что это нужно чуть менее, чем никогда.
Беру слова назад, индексация ВТ отлично годиться для засовываемых ВТ в параметры ВиртТ.
42 H A D G E H O G s
 
27.11.14
17:50
Опять таки, когда &Дата не задана (оперативные остатки) - фильтр на ВТ накладывать не надо, если эта ВТ является Правой таблицей.
43 H A D G E H O G s
 
27.11.14
17:51
Интересно, как экзаменаторы 1С отнесутся к такому решению. :-)
44 ComradeKite
 
27.11.14
17:54
to 38 В данном случае остатки мне нужны за весь период. Но в условии я фильтрую номенклатуру и склад, чтобы снизить количество данных.

Можно еще о B деревьях поговорить, а потом до уровня страниц сиквела дойти, но от этого запрос мой не заработает)))
45 H A D G E H O G s
 
27.11.14
17:55
(44) Не грузится твой dt
46 H A D G E H O G s
 
27.11.14
17:56
(45) Все, норм.
47 H A D G E H O G s
 
27.11.14
18:15
Документ
Продажа товаров 000000003 от 27.11.2014 0:00:00
делает движуху по забронированным.

В момент проведения движуха отменятется, и на остатках =0 по ном. Ardo TL 1000 EX-1
48 H A D G E H O G s
 
27.11.14
18:15
Глючная 1С,ага
49 H A D G E H O G s
 
27.11.14
18:17
Правда документ не проведен, но это косяк либо от смены режима проведения документа, либо от программной записи набора регистра накопления, а которого регистратор непроведен.
50 H A D G E H O G s
 
27.11.14
18:17
Я уж в SQL лазал, запросы сравнивал...
51 DrWatson
 
27.11.14
18:24
(47) Да, тоже докопался то такого. Залез в регистр, а там регистратор сам документ!
52 ComradeKite
 
27.11.14
18:26
HADGEHOG ну ты и сказочник)))))
Рассмешил так рассмешил)))

Из регистра Бронирования удалится запись только в самой последней строчке процедуры проведения вот здесь)))
// регистр БронированиеТоваров Приход
    Движения.БронированиеТоваров.Записывать = Истина;

Ну а так давай еще версии, в данном случае все версии, которые я не смог придумать, достойны рассмотрения.
53 ComradeKite
 
27.11.14
18:30
to 51 Да так и должно быть. Когда большая накладная набирается, можно после 20 го товара нажать кнопку забронировать. И записи из дока попадут в регистр бронирования. Чтобы потом на дать возможность провестись документу, а вот после проведения, можно их грохнуть в регистре бронирования.
54 H A D G E H O G s
 
27.11.14
18:40
(53)
1) Ставим точку останова на 1 строка обработки проведения Движения.ОстаткиНоменклатуры.Записывать = Истина;

2) Нажимаем "Провести"

3) Любуемся на запросы:

exec sp_executesql N'INSERT INTO #tt11 (_Period, _RecorderRRef, _RecordKind, _Fld203RRef, _Fld204RRef, _Fld205) SELECT
T1._Period,
T1._RecorderRRef,
T1._RecordKind,
T1._Fld203RRef,
T1._Fld204RRef,
-T1._Fld205
FROM _AccumRg202 T1
WHERE T1._RecorderRRef = P1 AND T1._Active = 0x01',N'P1 varbinary(16)',0xA81D002243A3789211DEC84CBFC4A801

INSERT INTO #tt12 (_Period, _Fld203RRef, _Fld204RRef, _Fld205) SELECT
{ts '3999-11-01 00:00:00'},
T1._Fld203RRef,
T1._Fld204RRef,
CAST(SUM(CASE WHEN T1._RecordKind = 0.0 THEN T1._Fld205 ELSE -T1._Fld205 END) AS NUMERIC(24, 8))
FROM #tt11 T1 WITH(NOLOCK)
GROUP BY T1._Fld203RRef,
T1._Fld204RRef

UPDATE T2 SET _Fld205 = T2._Fld205 + T1._Fld205
FROM #tt12 T1 WITH(NOLOCK)
INNER JOIN _AccumRgT206 T2
ON T1._Period = T2._Period AND T1._Fld203RRef = T2._Fld203RRef AND T1._Fld204RRef = T2._Fld204RRef AND T2._Splitter = 0.0
55 ComradeKite
 
27.11.14
18:47
Так вроде Delete нигде нет, или куда надо посмотреть ?
56 H A D G E H O G s
 
27.11.14
18:48
UPDATE T2 SET _Fld205 = T2._Fld205 + T1._Fld205
FROM #tt12 T1 WITH(NOLOCK)
INNER JOIN _AccumRgT206 T2
ON T1._Period = T2._Period AND T1._Fld203RRef = T2._Fld203RRef AND T1._Fld204RRef = T2._Fld204RRef AND T2._Splitter = 0.0

Обновление остатков.
57 H A D G E H O G s
 
27.11.14
18:48
(56) На дельту из tt11, которая сформирована по откатываемым движениям документа.
58 ComradeKite
 
27.11.14
18:52
HADGEHOG я думаю это мы сильно глубоко пытаемся копнуть, проблема где то выше. Я делаю это на обычной конфе в файловом режиме в пустой конфигурации. Мне не понятно до конца как движок 1С обрабатывает запросы. С одной стороны из регистра наакопления ОстаткиНоменклатуры он берет данные нормально, а из другого такого же регистра БронированиеТоваров он эти данные не берет и причем именно из кода. В консоли все работает нормально.
59 H A D G E H O G s
 
27.11.14
18:55
(58) Рекомендую найти стену.
А тебя у непроведенного документа есть движения. Избавься от них.
60 ComradeKite
 
27.11.14
18:57
Так это противоречит постановке задачи. Причем эту задачу я не сам придумал. Это из букваря 1с с курсов 1с.

У документа ПродажаТоваров должны быть движения до проведения по регистру БронированиеТоваров.
61 H A D G E H O G s
 
27.11.14
19:49
(60) Букварь курсов 1С такого не говорит.
Букварь курсов 1С говорит сделать движения документа, проконтролировать оперативный остаток по факту и откатить транзакцию, если остатка нет.
62 hhhh
 
27.11.14
20:24
(60) вроде всё правильно работает запрос. На момент документа нет забронированного.
63 ComradeKite
 
28.11.14
11:20
to hhhh Работает не правильно. Так как я хочу взять из регистра бронирования ЗА ВЕСЬ ПЕРИОД данные.
64 H A D G E H O G s
 
28.11.14
11:33
(63) Что значит за весь период?
65 H A D G E H O G s
 
28.11.14
11:33
(63) Остатки?
66 ComradeKite
 
28.11.14
12:11
Да, за весь период. Параметр Дата ставлю специально пустым, чтобы остатки были за весь период.

HADGEHOG ты был прав в плане того что глюк с проведением, мне вначале показалось это смешным, так я делал выводы на документации 1С, но после экспериментов вот что получается.

Выяснил такую штуку что документ не видит именно своих движений по регистру бронирования, поэтому у меня всегда ноль в количестве забронированного. Увидел это, когда просто попытался получить остатки из регистра бронирования данные. Хотя вроде вчера пробовал получать, данные были.

Что то я сам уже начал запутываться как оно работает.
67 hhhh
 
28.11.14
12:13
(66) не за весь период, а по точку актуальности. А точка актуальности у вас 27.11.2014 0ч 0мин. А бронирование у вас после этой даты. Не вешайте нам лапшу на уши.
68 ComradeKite
 
28.11.14
12:26
to hhhh заявил жестко, но не аргументировал. Вот аргументация из хелпа. Обрати внимание что такое параметр Период.
Период (необязательный)

Тип параметра: Дата; МоментВремени; Граница.
Указывается период, на значение которого рассчитываются остатки. Для расчета остатков по значение периода его необходимо задавать объектом Граница с включением граничного значения.
Если параметр не задан, итоги рассчитываются по самую последнюю запись.


РегистрНакопления.<Имя регистра>.Остатки (AccumulationRegister.<Имя регистра>.Balance)
Синтаксис

РегистрНакопления.<Имя регистра>.Остатки (AccumulationRegister.<Имя регистра>.Balance)
Поля

<Имя измерения>
<Имя общего реквизита> (<Common attribute name>)
<Имя ресурса>Остаток (<Имя ресурса>Balance)

Параметры

Период (Period)
Условие (Condition)

Описание:

Предназначена для получения остатков по регистру накопления. Данные представляют собой итоги ресурсов.
При расчете итогов учитываются только активные записи.
Таблица существует только для регистров остатков.
Агрегация производится по измерениям указанным в запросе.
Пример:

// Получение остатков по регистру остатков по указанному товару
// на указанный момент времени
ВЫБРАТЬ * ИЗ РегистрНакопления.УчетНоменклатуры.Остатки(&КонПериода,
    Номенклатура = &ПарНоменклатура)
69 ComradeKite
 
28.11.14
12:29
Если бы я хотел поставить точку актуальности, то я ее бы поставил. В данном случае я оставляю этот параметр ПУСТЫМ. Для чего? Чтобы получить остатки за весь период. Вроде все просто так ведь?
70 H A D G E H O G s
 
28.11.14
12:30
(66) Жесть.

"Выяснил такую штуку что документ не видит именно своих движений по регистру бронирования"

Потому что он удаляет свои движения в момент проведения, еще до выполнения твоего запроса, поэтому у тебя всегда ноль в количестве забронированного.


"Хотя вроде вчера пробовал получать, данные были."
Получал консолью.
71 ДенисЧ
 
28.11.14
12:30
(69) Нет. Если период пустой, то остатки берутся на конец рассчитанного периода
72 H A D G E H O G s
 
28.11.14
12:32
(69) Ты дятел. В 1с8 нет точки актуальности.
семерошникам нечего делать в восьмерке, вон тебе ДенисЧ подтвердит.
Есть
1) Остатки на дату
2) Оперативные остатки.
73 H A D G E H O G s
 
28.11.14
12:33
(71) Нет.
74 H A D G E H O G s
 
28.11.14
12:34
(71) Если период пустой - остатки берутся на 3999 год, они всегда есть и не зависят от рассчитанных периодов.
75 ДенисЧ
 
28.11.14
12:34
(74) Ну да, я ошибся. Извини, что нарушил спокойствие твоей тонкой ранимой души.
76 ComradeKite
 
28.11.14
12:35
Так прошел еще на один шаг, уже как гАварится теплее.
Поставил в свойствах документа движения "Не удалять автоматически", регистр подцепился и попали остатки нормально. Теперь вопрос, что происходит)))
77 H A D G E H O G s
 
28.11.14
12:35
(71) Рассчитанный период как раз используется для расчета остатков на дату, когда к итогам на конец месяца добавляется дельта движений.
78 H A D G E H O G s
 
28.11.14
12:36
(76) Документ не удалил свое ошибочное движение по забронированным.
79 H A D G E H O G s
 
28.11.14
12:37
(75) Ты просто рановато родился и черпанул мозгом семерку. Этого не смыть.
80 ComradeKite
 
28.11.14
12:39
HADGEHOG есть какая нить инфа как оно проводится, мож букварь какой или ссылка на умный источник. Когда оно удаляется то и как проходит процедура проведения?
81 ComradeKite
 
28.11.14
12:40
А мож его в коде как то можно заставить чтобы процедура проведения регистр бронирования не трогала все таки?
82 H A D G E H O G s
 
28.11.14
12:44
(80) Там все интуитивно понятно.
83 ComradeKite
 
28.11.14
12:57
Параметр "Удалять автоматически при отмене проведения" тоже все работает нормально.

Итак резюмируем:

Все дело было в параметре движений документа "Удаление движений". Если этот параметр выставлен в "Удалять автоматически" то процедура проведения жестко удаляет все движения при старте транзакции и соответственно данные из регистра бронирования удалялись. При ошибке транзакции все откатывалось назад.

Вывод, если надо работать с данными регистра при "хитрых" задачах надо ставить параметр "Удаление движений" в "Удалять автоматически при отмене проведения".

Всем спасибо, особенно HADGEHOG.

Тему можно закрывать.
84 H A D G E H O G s
 
28.11.14
13:11
(83) Плохо.
85 H A D G E H O G s
 
28.11.14
13:13
Надо:
1) использовать режим "Не удалять движения"
2) писать все в регистры сразу
3) запросом получать оперативные остатки и смотреть, есть ли отрицалово.
86 ComradeKite
 
28.11.14
13:25
Ну как бы ты сделал бронирование товаров?
Вот простая задача.
Набирают большие накладные по 100 позиций. Когда набирали 30 позицию товар еще был на складе. Набрали через час 100 позиций, начали проводить. Провести не могут, потому что за час уже продали 30-ю позицию и ее на складе нет. Как быть удалять эту 30 позицию для проведения? Но клиент сказал что ему не нужны все товары без этой позиции.
87 Зеленый пень
 
28.11.14
17:23
Нужны товары клиенту - продавать. Не нужны - не продавать.
Если очень долго идет подбор без проведения - сами себе буратины.
Подобрали 10 позиций - провели докумет. Подобрали еще 10 - снова провели.
Основная теорема систематики: Новые системы плодят новые проблемы.