Имя: Пароль:
1C
1С v8
Контроль остатков при проведении
,
0 xupypg
 
18.11.18
04:02
Подскажите пожалуйста, сделал запрос на контроль остатков, он не работает, в чём ошибка?
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "ВЫБРАТЬ
                                |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
                        |    ТоварыНаСкладахОстатки.Товар КАК Товар,
                        |    РасходнаяНакладнаяТовары.Склад КАК Склад
                        |ИЗ
                        |    РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |            ,
                        |            Товар В
                        |                (ВЫБРАТЬ
                        |                    НоменклатураДокумента.Номенклатура
                        |                ИЗ
                        |                    НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                        |        ПО ТоварыНаСкладахОстатки.Склад = РасходнаяНакладнаяТовары.Склад
                        |ГДЕ
                        |    ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
1 MSOliver
 
18.11.18
04:05
Кто такое НоменклатураДокумента?
2 runoff_runoff
 
18.11.18
04:08
(Товар, Склад) В (
ВЫБРАТЬ
   НоменклатураДокумента.Номенклатура,
   НоменклатураДокумента.Склад
ИЗ                                            
   НоменклатураДокумента)
3 xupypg
 
18.11.18
04:10
Номенклатура Документа- временная таблица, Руноф, я добавил склад, не получилось.... может отправить как-то вам выгрузку?
4 xupypg
 
18.11.18
04:11
Вот весь блок

Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        
        //проверим отрицательные остатки
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
                        |    ТоварыНаСкладахОстатки.Товар КАК Товар,
                        |    РасходнаяНакладнаяТовары.Склад КАК Склад
                        |ИЗ
                        |    РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |            ,
                        |            Товар, Склад В
                        |                (ВЫБРАТЬ
                        |                    НоменклатураДокумента.Номенклатура,
                        |                   НоменклатураДокумента.Склад
                        |                ИЗ
                        |                    НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                        |        ПО ТоварыНаСкладахОстатки.Склад = РасходнаяНакладнаяТовары.Склад
                        |            И ТоварыНаСкладахОстатки.КоличествоОстаток = РасходнаяНакладнаяТовары.Склад
                        |ГДЕ
                        |    ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
        
                
                РезультатЗапроса = Запрос3.Выполнить();
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            
             Сообщение = Новый СообщениеПользователю();
             Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток)
                                +" единиц материала """ + ВыборкаДетальныеЗаписи.Товар + """";
             Сообщение.Сообщить();
            
             Отказ = Истина;
         КонецЦикла;
              
    КонецЕсли;
5 hhhh
 
18.11.18
08:08
(4) а Движения.Записать() есть перед этим блоком?
6 РусКомп
 
18.11.18
08:36
Проведение оперативное, раз дата остатков не указана?
7 xupypg
 
18.11.18
08:45
Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.ТоварыНаСкладах.Записывать = Истина;
    
    МенеджерВТ = Новый МенеджерВременныхтаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
        |    СУММА(РасходнаяНакладнаяТовары.Количество) КАК КоличествоВДокументе,
        |    СУММА(РасходнаяНакладнаяТовары.Сумма) КАК СуммаВДокументе
        |ПОМЕСТИТЬ НоменклатураДокумента
        |ИЗ
        |    Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
        |ГДЕ
        |    РасходнаяНакладнаяТовары.Номенклатура.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    РасходнаяНакладнаяТовары.Номенклатура";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
            
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВт;
    Запрос2.Текст = "ВЫБРАТЬ
                    |    РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
                    |    РасходнаяНакладнаяТовары.Склад КАК Склад,
                    |    СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество
                    |ИЗ
                    |    Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                    |ГДЕ
                    |    РасходнаяНакладнаяТовары.Ссылка = &Ссылка
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    РасходнаяНакладнаяТовары.Номенклатура,
                    |    РасходнаяНакладнаяТовары.Склад";
    
    
     Запрос2.УстановитьПараметр("Ссылка", Ссылка);
    Движения.ТоварыНаСкладах.Записать();
    РезультатЗапроса = Запрос2.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        
    
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Товар = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад = ВыборкаДетальныеЗаписи.Склад;
        Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
    

    КонецЦикла;
       Движения.Записать();
        
        
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        
        //проверим отрицательные остатки
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
                        |    ТоварыНаСкладахОстатки.Товар КАК Товар,
                        |    РасходнаяНакладнаяТовары.Склад КАК Склад
                        |ИЗ
                        |    РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |            ,
                        |            (Товар, Склад) В
                        |                (ВЫБРАТЬ
                        |                    НоменклатураДокумента.Номенклатура,
                        |                    НоменклатураДокумента.Склад
                        |                ИЗ
                        |                    НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                        |        ПО ТоварыНаСкладахОстатки.КоличествоОстаток = РасходнаяНакладнаяТовары.Склад
                        |ГДЕ
                        |    ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
        
                
                РезультатЗапроса = Запрос3.Выполнить();
                
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            
             Сообщение = Новый СообщениеПользователю();
             Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток)
                                +" единиц материала """ + ВыборкаДетальныеЗаписи.Товар + """";
             Сообщение.Сообщить();
            
             Отказ = Истина;
         КонецЦикла;
              
    КонецЕсли;
    


    КонецПроцедуры
8 xupypg
 
18.11.18
08:46
Попытался выгрузить результат 3 запроса в таблицу, он не выгружается, как я понял процедура просто сюда не попадает, а почему я понятия не имею, вроде всё по Радченко делал....
9 hhhh
 
18.11.18
09:26
режим неоперативный
10 xupypg
 
18.11.18
10:01
а как сделать оперативный?
11 xupypg
 
18.11.18
10:15
У меня в документе оперативное проведение документа разрешено
12 _Дайвер_
 
18.11.18
11:04
Почему в условии у тебя КоличествоОстаток = Склад?
13 _Дайвер_
 
18.11.18
11:12
Пробуй:
Запрос3.Текст = "ВЫБРАТЬ
                |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
                |    ТоварыНаСкладахОстатки.Товар КАК Товар
                |ИЗ
                |    РегистрНакопления.ТоварыНаСкладах.Остатки(
                |            ,
                |            Товар В
                |                (ВЫБРАТЬ
                |                    НоменклатураДокумента.Номенклатура
                |                ИЗ
                |                    НоменклатураДокумента)
                |                И Склад = &Склад) КАК ОстаткиТоваров
                |ГДЕ
                |    ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
14 xupypg
 
18.11.18
11:18
Дайвер, так не получится, потому, что у меня "Склад" не в реквизитах документа, а в таблице) в том-то и проблема))))
15 hhhh
 
18.11.18
11:26
(14) дата документа сегодня?
16 Остап Сулейманович
 
18.11.18
11:26
(0) Все здесь :
ГДЕ ТоварыНаСкладахОстатки.КоличествоОстаток < 0
у вас разрешены отрицательные остатки? Или это контроль по новой методике уже после записи движений?
17 xupypg
 
18.11.18
11:33
Если перепровожу уже готовый документ, тогда он проводится левым числом, если создаю новый, то он проводится оперативно....  Это методика контроля остатков после проведения документа... по крайней мере попытка этой методики)
18 hhhh
 
18.11.18
11:44
(17) ну вот это

|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                        |        ПО ТоварыНаСкладахОстатки.КоличествоОстаток = РасходнаяНакладнаяТовары.Склад
                      

какая-то невероятная хрень. Может, чего покурил? Потому что в адекватном состоянии такое невозможно придумать.
19 xupypg
 
18.11.18
11:51
как правильно будет? я не догоняю прост
20 hhhh
 
18.11.18
11:58
|        ЛЕВОЕ СОЕДИНЕНИЕ НоменктатураДокумента КАК НоменктатураДокумента
                        |        ПО НоменктатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура И НоменктатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад
21 xupypg
 
18.11.18
12:14
не работает так)) думешь я не пробовал))) я уже неделю с этим разбираюсь) логически думал- не прокатило, начал всё подряд пробовать, тоже не прокатило) в моих глазах безнадёжность) я не уверен даже в том, что у меня выборка правильно составлена)
22 hhhh
 
18.11.18
12:20
(21) не работает, значит надо найти где ошибка. а не бросаться сразу писать откровенный бред.
23 xupypg
 
18.11.18
12:37
не могу ошибку найти, думал тут помогут
24 hhhh
 
18.11.18
12:55
(23) нашли же

КоличествоОстаток = Склад написал
25 azernot
 
18.11.18
12:56
ВЫБРАТЬ
    РасходнаяНакладнаяТовары.Склад КАК Склад,
    РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
    СУММА(РасходнаяНакладнаяТовары.Количество) КАК КоличествоВДокументе,
    СУММА(РасходнаяНакладнаяТовары.Сумма) КАК СуммаВДокументе
ПОМЕСТИТЬ НоменклатураДокумента
ИЗ
    Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
ГДЕ
    РасходнаяНакладнаяТовары.Ссылка = &Ссылка

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НоменклатураДокумента.Номенклатура,
    НоменклатураДокумента.КоличествоВДокументе,
    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНаОстатке,
    НоменклатураДокумента.КоличествоВДокументе - ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНедостаточно
ИЗ
    НоменклатураДокумента КАК НоменклатураДокумента
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                ,
                (Склад, Номенклатура) В
                    (ВЫБРАТЬ
                        НоменклатураДокумента.Склад,
                        НоменклатураДокумента.Номенклатура
                    ИЗ
                        НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
        ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
            И НоменклатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад
ГДЕ
    НоменклатураДокумента.КоличествоВДокументе > ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)
26 xupypg
 
19.11.18
03:32
Азернот, не получилось, документ проводится...
27 xupypg
 
19.11.18
03:35
Даже если удалить приходную накладную с определённым товаром, то всё равно в расходной он будет списываться, хотя по факту прихода даже не было
28 xupypg
 
19.11.18
03:42
Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.ТоварыНаСкладах.Записывать = Истина;
    
    МенеджерВТ = Новый МенеджерВременныхтаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   РасходнаяНакладнаяТовары.Склад КАК Склад,
        |    РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
        |    СУММА(РасходнаяНакладнаяТовары.Количество) КАК КоличествоВДокументе,
        |    СУММА(РасходнаяНакладнаяТовары.Сумма) КАК СуммаВДокументе
        |ПОМЕСТИТЬ НоменклатураДокумента
        |ИЗ
        |    Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
        |ГДЕ
        |    РасходнаяНакладнаяТовары.Номенклатура.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    РасходнаяНакладнаяТовары.Номенклатура,
        |   РасходнаяНакладнаяТовары.Склад";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
            
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВт;
    Запрос2.Текст = "ВЫБРАТЬ
                    |    РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
                    |    РасходнаяНакладнаяТовары.Склад КАК Склад,
                    |    СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество
                    |ИЗ
                    |    Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                    |ГДЕ
                    |    РасходнаяНакладнаяТовары.Ссылка = &Ссылка
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    РасходнаяНакладнаяТовары.Номенклатура,
                    |    РасходнаяНакладнаяТовары.Склад";
    
    
     Запрос2.УстановитьПараметр("Ссылка", Ссылка);
    Движения.ТоварыНаСкладах.Записать();
    РезультатЗапроса = Запрос2.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        
    
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Товар = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад = ВыборкаДетальныеЗаписи.Склад;
        Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
    

    КонецЦикла;
       Движения.Записать();
        
        
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        
        //проверим отрицательные остатки
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНаОстатке,
                        |    НоменклатураДокумента.КоличествоВДокументе - ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНедостаточно
                        |ИЗ
                        |    НоменклатураДокумента КАК НоменклатураДокумента
                        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |                ,
                        |                (Склад, Номенклатура) В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Склад,
                        |                        НоменклатураДокумента.Товар
                        |                    ИЗ
                        |                        НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Товар
                        |            И НоменклатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад
                        |ГДЕ
                        |    НоменклатураДокумента.КоличествоВДокументе > ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)";
        
        
                        РезультатЗапроса = Запрос3.Выполнить();
                
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            
             Сообщение = Новый СообщениеПользователю();
             Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток)
                                +" единиц материала """ + ВыборкаДетальныеЗаписи.Товар + """";
             Сообщение.Сообщить();
            
             Отказ = Истина;
         КонецЦикла;
              
    КонецЕсли;
    


    КонецПроцедуры
29 xupypg
 
19.11.18
03:46
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |                ,
                        |                (Склад, Товар) В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Склад,
                        |                        НоменклатураДокумента.Номенклатура
30 xupypg
 
19.11.18
03:47
исправил третий запрос вот так, потому. что если в скобках указать "Номенклатура" то пишет поле не найдено, точки остановки проходят по всем строкам, но ошибку не выдаёт
31 hhhh
 
19.11.18
05:27
(30) А куда далась самая основная строчка КоличествоОстаток < 0 ?? Ты самую главную проверку выбросил.
32 xupypg
 
19.11.18
05:57
Вернул строчку, ничего не изменилось, документ по прежнему проводится
33 hhhh
 
19.11.18
06:03
(32) дата документа сегодня? Потому что если вчера, то считается, что не оперативное.
34 xupypg
 
19.11.18
06:16
Проведение оперативное, дата и время изменяется на дату и время на компьютере
35 hhhh
 
19.11.18
06:21
(34) какой запрос в итоге получился?
36 xupypg
 
19.11.18
06:32
Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНаОстатке,
                        |    НоменклатураДокумента.КоличествоВДокументе - ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНедостаточно
                        |ИЗ
                        |    НоменклатураДокумента КАК НоменклатураДокумента
                        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |                ,
                        |                (Склад, Товар) В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Склад,
                        |                        НоменклатураДокумента.Номенклатура
                        |                    ИЗ
                        |                        НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Товар
                        |            И НоменклатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад
                        |ГДЕ
                        |    НоменклатураДокумента.КоличествоВДокументе > ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)
                        |    И ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
        
        
                        РезультатЗапроса = Запрос3.Выполнить();
                
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
37 hhhh
 
19.11.18
08:01
(36) Вроде нормально. Отладчиком заходит внутрь цикла? И точно есть отрицательный остаток? Расход больше прихода?
38 xupypg
 
19.11.18
08:06
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        
        //проверим отрицательные остатки
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНаОстатке,
                        |    НоменклатураДокумента.КоличествоВДокументе - ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНедостаточно
                        |ИЗ
                        |    НоменклатураДокумента КАК НоменклатураДокумента
                        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |                ,
                        |                (Склад, Товар) В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Склад,
                        |                        НоменклатураДокумента.Номенклатура
                        |                    ИЗ
                        |                        НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Товар
                        |            И НоменклатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад
                        |ГДЕ
                        |    НоменклатураДокумента.КоличествоВДокументе > ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)
                        |    И ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
        
        
                        РезультатЗапроса = Запрос3.Выполнить();
                
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            
             Сообщение = Новый СообщениеПользователю();
             Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток)
                                +" единиц материала """ + ВыборкаДетальныеЗаписи.Товар + """";
             Сообщение.Сообщить();
            
             Отказ = Истина;
         КонецЦикла;
              
    КонецЕсли;
    


    КонецПроцедуры
39 xupypg
 
19.11.18
08:07
Попадает в запрос, после запроса в результат, потом в выборку, после выборки в "Пока ВыборкаДетальныеЗаписи...." и после этой строки сразу в "КонецЕсли"
40 xupypg
 
19.11.18
08:08
в сообщение пользователю он вообще не попадает, остатки точно отрицательные
41 Мимохожий Однако
 
19.11.18
08:10
(40) Отладчик включил?
42 xupypg
 
19.11.18
08:11
в смысле? точку остановки поставил и вот так проверил
43 hhhh
 
19.11.18
08:19
(40) вот в самом первом запросе откровенная хрень

|ГДЕ
        |    РасходнаяНакладнаяТовары.Номенклатура.Ссылка = &Ссылка

Как обычно ваш фирменный стиль: сравнивает номенклатуру с расходной накладной. Ну с какого бодуна вдруг номенклатура будет равной расходной накладной?
44 xupypg
 
19.11.18
08:24
(43) СРАБОТАЛО)))
45 xupypg
 
19.11.18
08:24
Спасибо всем огромное, где тут лайк ставить?)
46 Мимохожий Однако
 
19.11.18
08:25
(45) Фломастером на экране )
47 xupypg
 
19.11.18
08:27
Я несмываемым поставлю))))
48 xupypg
 
19.11.18
09:04
А как сделать чтоб не только по количеству, но и по сумме учёт шёл?
49 Мимохожий Однако
 
19.11.18
09:06
(48) Добавь ресурс Сумма
50 xupypg
 
19.11.18
09:18
в условиях тоже? и в какой регистр добавлять?
51 Мимохожий Однако
 
19.11.18
09:22
(50) регистр Товары на складах. Но обычно используют другой регистр Товары организаций, в которых есть измерение Организация. Какая у тебя типовая конфигурация пока не известно. Возможно, велосипед с суммой уже существует
52 xupypg
 
19.11.18
09:26
всё что есть в коде написано, у меня 2 документа, 2 справочника и 1 регистр накоплений
53 xupypg
 
19.11.18
09:26
в какой запрос, а не регистр*)
54 Мимохожий Однако
 
19.11.18
09:29
(53) Если у тебя один регистр, то добавь  в него ресурс Сумма.
Потом добавь аналогичное поле в запрос.
55 xXeNoNx
 
19.11.18
10:35
(4) а зачем:
Если Режим = РежимПроведенияДокумента.Оперативный Тогда ??
56 xXeNoNx
 
19.11.18
10:36
Это задачи подготовки к спецу
57 xXeNoNx
 
19.11.18
10:37
(29) Соединение с подзапросом - плохая практика
58 xXeNoNx
 
19.11.18
10:40
Без указания периода будешь читать же свои остатки...
59 xXeNoNx
 
19.11.18
10:42
(36) Хреновый подход решения, а именно: решение можно сделать по новой методике проведения, сначала пишем, потом читаем.
60 azernot
 
19.11.18
10:57
(28)         |ГДЕ
        |    РасходнаяНакладнаяТовары.Номенклатура.Ссылка = &Ссылка

    Запрос.УстановитьПараметр("Ссылка", Ссылка);

Что за бред?!

У тебя ВТ НоменклатураДокумента всегда будет пустая!
Надо так

|ГДЕ
        |    РасходнаяНакладнаяТовары.Ссылка = &Ссылка
61 azernot
 
19.11.18
10:59
А, в (43) уже написали...
62 xXeNoNx
 
19.11.18
11:03
(38) яб не принял такое решение и экзаменатор не примет
63 xupypg
 
19.11.18
12:05
Процедура ОбработкаПроведения(Отказ, Режим)

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

    РезультатЗапроса = Запрос.Выполнить();
            
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВт;
    Запрос2.Текст = "ВЫБРАТЬ
                    |    РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
                    |    РасходнаяНакладнаяТовары.Склад КАК Склад,
                    |    СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество
                    |ИЗ
                    |    Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                    |ГДЕ
                    |    РасходнаяНакладнаяТовары.Ссылка = &Ссылка
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    РасходнаяНакладнаяТовары.Номенклатура,
                    |    РасходнаяНакладнаяТовары.Склад";
    
    
     Запрос2.УстановитьПараметр("Ссылка", Ссылка);
    Движения.ТоварыНаСкладах.Записать();
    РезультатЗапроса = Запрос2.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        
    
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Товар = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад = ВыборкаДетальныеЗаписи.Склад;
        Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
    

    КонецЦикла;
       Движения.Записать();
        
        
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        
        //проверим отрицательные остатки
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНаОстатке,
                        |    НоменклатураДокумента.КоличествоВДокументе - ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНедостаточно,
                        |    ТоварыНаСкладахОстатки.СуммаОстаток КАК СуммаОстаток
                        |ИЗ
                        |    НоменклатураДокумента КАК НоменклатураДокумента
                        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |                ,
                        |                (Склад, Товар) В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Склад,
                        |                        НоменклатураДокумента.Номенклатура
                        |                    ИЗ
                        |                        НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Товар
                        |            И НоменклатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад
                        |ГДЕ
                        |    НоменклатураДокумента.КоличествоВДокументе > ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)
                        |    И ТоварыНаСкладахОстатки.КоличествоОстаток < 0
                        |    И ТоварыНаСкладахОстатки.СуммаОстаток < 0";
        
        
                        РезультатЗапроса = Запрос3.Выполнить();
                
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            
             Сообщение = Новый СообщениеПользователю();
             Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоНаОстатке)
                                +" единиц материала """;
             Сообщение.Сообщить();
            
             Отказ = Истина;
         КонецЦикла;
              
    КонецЕсли;
    


    КонецПроцедуры
64 xupypg
 
19.11.18
12:06
Добавил сумму, в последнем регистре установил условие, вообще перестало работать)
65 xupypg
 
19.11.18
12:06
Суммовой учёт надо добавить, реквизит создал
66 azernot
 
19.11.18
12:47
(65) А что значит "суммовой учёт"?
В учёте обычно сумму списания ТМЦ рассчитывается по какой-то методике (ФИФО, Средняя). Если есть количественный остаток, как может не быть суммового?
67 xupypg
 
19.11.18
13:09
Вот я в смысле так же подумал, но экзаменатор сказал сделать...
68 xupypg
 
19.11.18
13:09
я себе этот суммовой учёт в принципе не особо представляю
69 xupypg
 
20.11.18
03:26
//проверим отрицательные остатки
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНаОстатке,
                        |    НоменклатураДокумента.КоличествоВДокументе - ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоНедостаточно,
                        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
                        |    НоменклатураДокумента.Склад КАК Склад,
                        |    НоменклатураДокумента.КоличествоВДокументе - ЕСТЬNULL(ТоварыНаСкладахОстатки.СуммаОстаток, 0) КАК КоличествоВДокументе1
                        |ИЗ
                        |    НоменклатураДокумента КАК НоменклатураДокумента
                        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |                ,
                        |                (Склад, Товар) В
                        |                    (ВЫБРАТЬ
                        |                        НоменклатураДокумента.Склад,
                        |                        НоменклатураДокумента.Номенклатура
                        |                    ИЗ
                        |                        НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |        ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Товар
                        |            И НоменклатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад
                        |            И НоменклатураДокумента.КоличествоВДокументе = ТоварыНаСкладахОстатки.СуммаОстаток
                        |ГДЕ
                        |    НоменклатураДокумента.КоличествоВДокументе > ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)
                        |    И ТоварыНаСкладахОстатки.КоличествоОстаток < 0
                        |    И ТоварыНаСкладахОстатки.СуммаОстаток < 0
                        |    И НоменклатураДокумента.КоличествоВДокументе > ЕСТЬNULL(ТоварыНаСкладахОстатки.СуммаОстаток, 0)";
70 xupypg
 
20.11.18
03:27
Добавил реквизит "Сумма" построил запрос по примеру количества, документ вообще перестал проводиться оперативно... он проводится, ошибка не выходит о недостаточном количестве и дата со временем не меняется на текущее, а остаётся прежней....
71 azernot
 
20.11.18
10:32
И ТоварыНаСкладахОстатки.КоличествоОстаток < 0
                        |    И ТоварыНаСкладахОстатки.СуммаОстаток < 0

Зачем это?
72 azernot
 
20.11.18
10:39
Вообще же, если уж это учебная задача - надо уточнять у экзаменатора, что же нужно сделать.
С точки зрения прикладной логики учётных задач контроль суммового остатка (и уж тем более сравнение суммового остатка с количеством из документа) - бред.

P.S. Мне кажется, что я оказываю медвежью услугу... Поэтому рекомендую автору всё же сначала подумать самостоятельно, что он хочет, сформулировать, а уж потом, если возникнут именно технические вопросы - задавать их.
73 xupypg
 
20.11.18
12:45
Экзаменатор по поводу суммового учёта сказал: "Да там в 2 местах склад поменять, всё что нужно переделать". В каких местах я чё-то не вдупляю.....
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн