Имя: Пароль:
1C
 
Помогите задать условие при списании товаров
0 Beginner girl
 
06.07.16
10:26
Всем привет!
У меня возникла проблема при списании товаров.
Когда списываю больше, чем поступило, тогда выводится сообщение с количеством товара, которого не хватает и это правильно.

Но если я списываю товар ровно столько, сколько поступило, то потом я могу списывать его еще хоть сколько, даже если его и нет на складе.

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

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

                        Сообщение = Новый СообщениеПользователю;
                            Сообщение.Текст = "Не хватает "+ (ТекСтрокаСписанныеТовары.Количество-ВыборкаДетальныеЗаписи.К_КоличествоОстаток) +
                              " позиций номенклатуры " + ВыборкаДетальныеЗаписи.К_Товары + ".";
                        Сообщение.Сообщить();
            КонецЕсли;
            
               Если Отказ Тогда
                            Продолжить;
            КонецЕсли;    
                    
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
1 FIXXXL
 
06.07.16
10:32
второй запрос кривой
если нет остатка, он вернет "урезанный" список товара
тебе нужно или левое соединение, по старой методе
или записать движ в регистр, а потом запросом посмотреть минуса, это по-новой методе
2 Beginner girl
 
06.07.16
10:42
FIXXXL, где можно посмотреть/почитать, чтобы более менее понятно было про левое соединение?
3 FIXXXL
 
06.07.16
10:48
(2) полный список номенклатуры из ТЧ, левым соединением таб.остатков с ЕСТЬNULL(КолвоОстаток,0)
тогда получишь что хочешь
4 FIXXXL
 
06.07.16
10:48
(3) + у тебя же выбирается только номенклатура, которая есть на остатках
5 ovrfox
 
06.07.16
10:49
Нужен примерно такой запрос
Запрос3.Текст = "ВЫБРАТЬ
                             |    НоменклатураДокумента.Товар КАК К_Товары,
                             |    К_ОстаткиОстатки.К_КоличествоОстаток,
                             |    К_ОстаткиОстатки.К_Склад,
                             |    НоменклатураДокумента.Количество
                             |ИЗ
                             |    НоменклатураДокумента КАК НоменклатураДокумента
                             |    ЛЕВОЕ СОЕДИНЕНИЕ
                             |    РегистрНакопления.К_Остатки.Остатки(
                             |            ,
                             |            К_Товары В
                             |                    (ВЫБРАТЬ
                             |                        НоменклатураДокумента.Товар
                             |                    ИЗ
                             |                        НоменклатураДокумента)
                             |                И К_Склад = &Склад) КАК К_ОстаткиОстатки
                             | ПО  НоменклатураДокумента.Товар = К_ОстаткиОстатки.К_Товары
                             |ГДЕ
                             |    К_ОстаткиОстатки.К_КоличествоОстаток > 0";
6 ovrfox
 
06.07.16
10:50
(5) Только вместо "ГДЕ" должно быть "И"
7 FIXXXL
 
06.07.16
10:54
(6) а зачем вообще условие на КолвоОстаток?

(2) почитай про новую методу лучше
http://catalog.mista.ru/public/195591/
8 Beginner girl
 
06.07.16
12:18
ovrfox, FIXXXL, (5) (7)  
Спасибо Вам, ребята, постараюсь разобраться)