Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Убрать контроль отрицательных остатков
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
alexkhua
Подскажите что исправить в этом коде что б видеть отрицательные остатки ?
     Запрос.УстановитьПараметр("Ссылка",Ссылка);
        Результат=Запрос.Выполнить();
            ВыборкаНоменклатура=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            
            Пока ВыборкаНоменклатура.Следующий() Цикл
                
                
                Если  ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество Тогда
                    
                    //Контроль отрицательных остатков
                    //Отказ=Истина;
                    Сообщение = Новый СообщениеПользователю;
                    Нехватка = ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток;
                    Сообщение.Текст="В документе № "  +Номер+  " от "  +Дата+  " Не хватает "  +Нехватка+ " Единиц материала " +ВыборкаНоменклатура.Материал;
                    Сообщение.Сообщить();
                Иначе
                    //Вычисление себестоимости списываемых партий
                    КоличествоНадоСписать=ВыборкаНоменклатура.Количество;
                    
                    ВыборкаДетальныеЗаписи=ВыборкаНоменклатура.Выбрать();
                    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                        Если ВыборкаДетальныеЗаписи.КоличествоОстаток <=
                                             КоличествоНадоСписать Тогда
                                            
                    //Списываем всю партию
                    
                    КоличествоКСписанию=
                      ВыборкаДетальныеЗаписи.КоличествоОстаток;
                    СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                    //Уменьшаем количество к списанию
                    
                    КоличествоНадоСписать =
                      КоличествоНадоСписать-
                          КоличествоКСписанию;
                          
                      Иначе
                          
                     //Списываем часть партии
                    
                     КоличествоКСписанию=КоличествоНадоСписать;
                    
                    
                     Если ВыборкаДетальныеЗаписи.КоличествоОстаток<>0 Тогда
                        
                СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток/
                       ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию;
                      
                   Иначе
                       СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                   КонецЕсли;
                  
                   //Обнуляем количество к списанию
                  
                   КоличествоНадоСписать=0;
                  
               КонецЕсли;
alex040269
наверно так:
Цитата(alexkhua @ 31.01.13, 11:30) необходимо зарегистрироваться для просмотра ссылки
Подскажите что исправить в этом коде что б видеть отрицательные остатки ?
     Запрос.УстановитьПараметр("Ссылка",Ссылка);
        Результат=Запрос.Выполнить();
            ВыборкаНоменклатура=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            
            Пока ВыборкаНоменклатура.Следующий() Цикл
                
                
                //Если  ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество Тогда
                //    
                //    //Контроль отрицательных остатков
                //    //Отказ=Истина;
                //    Сообщение = Новый СообщениеПользователю;
                //    Нехватка = ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток;
                //    Сообщение.Текст="В документе № "  +Номер+  " от "  +Дата+  " Не хватает "  +Нехватка+ " Единиц материала " //+ВыборкаНоменклатура.Материал;
//                    Сообщение.Сообщить();
//                Иначе
                    //Вычисление себестоимости списываемых партий
                    КоличествоНадоСписать=ВыборкаНоменклатура.Количество;
                    
                    ВыборкаДетальныеЗаписи=ВыборкаНоменклатура.Выбрать();
                    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                        Если ВыборкаДетальныеЗаписи.КоличествоОстаток <=
                                             КоличествоНадоСписать Тогда
                                            
                    //Списываем всю партию
                    
                    КоличествоКСписанию=
                      ВыборкаДетальныеЗаписи.КоличествоОстаток;
                    СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                    //Уменьшаем количество к списанию
                    
                    КоличествоНадоСписать =
                      КоличествоНадоСписать-
                          КоличествоКСписанию;
                          
                      Иначе
                          
                     //Списываем часть партии
                    
                     КоличествоКСписанию=КоличествоНадоСписать;
                    
                    
                     Если ВыборкаДетальныеЗаписи.КоличествоОстаток<>0 Тогда
                        
                СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток/
                       ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию;
                      
                   Иначе
                       СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                   КонецЕсли;
                  
                   //Обнуляем количество к списанию
                  
                   КоличествоНадоСписать=0;
                  
              // КонецЕсли;

alexkhua
Цитата(alex040269 @ 31.01.13, 11:37) необходимо зарегистрироваться для просмотра ссылки
наверно так:


Не работает. Я уже уйму вариантов перепробовал. И примеров нигде нет why.gif . Только на контроль ОО.
Vofka
Кнопки "выкл" нигде нету?

По теме: что не работает, почему не работает? Или гадалок вызывать?
alexkhua
Цитата(Vofka @ 31.01.13, 11:55) необходимо зарегистрироваться для просмотра ссылки
Кнопки "выкл" нигде нету?

По теме: что не работает, почему не работает? Или гадалок вызывать?

Кнопки нет. Мне нужно по последней списуемойСПИСЫВАЕМОЙ партии получить отрицательный остаток, а он не получается. В лудшемЛУЧШЕМ случае списуетсяСПИСЫВАЕТСЯ вся партия.


 ! 

Правила, п.24
 
Vofka
Честно говоря, я до сих пор не пойму, что вам надо bn.gif
reneval
какой еще отрицетельный остаток по партии? Нет товара - нет партии.
alexkhua
Цитата(reneval @ 31.01.13, 13:18) необходимо зарегистрироваться для просмотра ссылки
какой еще отрицетельный остаток по партии? Нет товара - нет партии.

Хорошо, тогда без партии.

Цитата(Vofka @ 31.01.13, 12:58) необходимо зарегистрироваться для просмотра ссылки
Честно говоря, я до сих пор не пойму, что вам надо bn.gif

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

Если Режим = РежимПроведенияДокумента.Оперативный Тогда
    Запрос.УстановитьПараметр("Момент",Неопределено);
Иначе
    Запрос.УстановитьПараметр("Момент",МоментВремени());
    КонецЕсли;
    
         Запрос.УстановитьПараметр("Ссылка",Ссылка);
        Результат=Запрос.Выполнить();
            ВыборкаНоменклатура=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            
            Пока ВыборкаНоменклатура.Следующий() Цикл
                
                
                Если  ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество Тогда
                    
                    //Контроль отрицательных остатков
                    Отказ=Истина;
                    Сообщение = Новый СообщениеПользователю;
                    Нехватка = ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток;
                    Сообщение.Текст="В документе № "  +Номер+  " от "  +Дата+  " Не хватает "  +Нехватка+ " Единиц материала " +ВыборкаНоменклатура.Материал;
                    Сообщение.Сообщить();
                    
                    
                    
                Иначе
                    //Вычисление себестоимости списываемых партий
                    КоличествоНадоСписать=ВыборкаНоменклатура.Количество;
                    
                    ВыборкаДетальныеЗаписи=ВыборкаНоменклатура.Выбрать();
                    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                        Если ВыборкаДетальныеЗаписи.КоличествоОстаток <=
                                             КоличествоНадоСписать Тогда
                                            
                    //Списываем всю партию
                    
                    КоличествоКСписанию=
                      ВыборкаДетальныеЗаписи.КоличествоОстаток;
                    СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                    //Уменьшаем количество к списанию
                    
                    КоличествоНадоСписать =
                      КоличествоНадоСписать-
                          КоличествоКСписанию;
                          
                      Иначе
                          
                     //Списываем часть партии
                    
                     КоличествоКСписанию=КоличествоНадоСписать;
                    
                    
                     Если ВыборкаДетальныеЗаписи.КоличествоОстаток<>0 Тогда
                        
                СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток/
                       ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию;
                      
                   Иначе
                       СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                   КонецЕсли;
                  
                   //Обнуляем количество к списанию
                  
                   КоличествоНадоСписать=0;
                  
               КонецЕсли;
Vofka
Цитата(alexkhua @ 31.01.13, 13:56) необходимо зарегистрироваться для просмотра ссылки
Как сделать без контроля?

Выпилить контроль из того места где он есть.

Цитата(alexkhua @ 31.01.13, 13:56) необходимо зарегистрироваться для просмотра ссылки
Что нигде нет примера как реализовать метод ФИФО с отрицательными остатками? Что тут непонятного?

Непонятно откуда у людей такие мысли берутся. faceoff.gif
alexkhua
Цитата(Vofka @ 31.01.13, 14:09) необходимо зарегистрироваться для просмотра ссылки
Выпилить контроль из того места где он есть.


Непонятно откуда у людей такие мысли берутся. faceoff.gif

Выпилил. Не помогло. Списывается все, что есть на остатке, но в "минус" не уходит. Например, есть на остатке 5 дверных ручек нужно списать 8, 3-должны быть красным в отчете по остаткам регистра. По регистру накопления должно пройти 8 шт. проходит 5.
Vofka
Ладно, зайду с другой стороны. Что такое партионный учет (как вы понимаете)?
alexkhua
Цитата(Vofka @ 31.01.13, 14:30) необходимо зарегистрироваться для просмотра ссылки
Ладно, зайду с другой стороны. Что такое партионный учет (как вы понимаете)?

Как на экзамене. Учет материалов где каждой партии(документ поступления) соответствует свое количество и стоимость. Но какое это имеет отношение к теме? Мне казалось, что моя тема для опытных разработчиков ясна и понятна. Я работаю как пользователь в 1с-ке с отрицательными остатками очень давно и считаю, что работать с их запретом невозможно вообще. Поэтому механизмы реализации учета товара должны быть разными. И "отрицательные остатки" в проведении документа это самые основы. Разве не так? Поэтому я и говорю о примерах, которые должны быть в той же литературе.
Vofka
Цитата(alexkhua @ 31.01.13, 15:00) необходимо зарегистрироваться для просмотра ссылки
Как на экзамене.

Ну так у нас же все серьёзно.

Цитата(alexkhua @ 31.01.13, 15:00) необходимо зарегистрироваться для просмотра ссылки
Учет материалов где каждой партии(документ поступления) соответствует свое количество и стоимость.

Вот. Вопрос: как можно списать в минус стоимость, которая не известна?
sava1
Цитата(alexkhua @ 31.01.13, 13:56) необходимо зарегистрироваться для просмотра ссылки
Если  ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество Тогда
                    
                    //Контроль отрицательных остатков
                    Отказ=Истина;
                    Сообщение = Новый СообщениеПользователю;
                    Нехватка = ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток;
                    Сообщение.Текст="В документе № "  +Номер+  " от "  +Дата+  " Не хватает "  +Нехватка+ " Единиц материала " +ВыборкаНоменклатура.Материал;
                    Сообщение.Сообщить();
                    
                    
                    
                Иначе


все комментируем.
После первого конца списка все количество, что осталось списываем с нулевой стоимостью

Цитата(sava1 @ 31.01.13, 15:12) необходимо зарегистрироваться для просмотра ссылки
После первого конца списка

после первого цикла (вложенного)

Цитата(Vofka @ 31.01.13, 15:11) необходимо зарегистрироваться для просмотра ссылки
Вопрос: как можно списать в минус стоимость, которая не известна?

Элементарно. А закрыть минуса обработкой в конце месяца
alex040269
Цитата(alexkhua @ 31.01.13, 15:00) необходимо зарегистрироваться для просмотра ссылки
Как на экзамене. Учет материалов где каждой партии(документ поступления) соответствует свое количество и стоимость. Но какое это имеет отношение к теме? Мне казалось, что моя тема для опытных разработчиков ясна и понятна. Я работаю как пользователь в 1с-ке с отрицательными остатками очень давно и считаю, что работать с их запретом невозможно вообще. Поэтому механизмы реализации учета товара должны быть разными. И "отрицательные остатки" в проведении документа это самые основы. Разве не так? Поэтому я и говорю о примерах, которые должны быть в той же литературе.

По моему в любой типовой конфигурации можно отключить контроль ОО через интерфейс пользователя! В этом случае при проведении в минус каждый раз создается новая пария.
alexkhua
Цитата(alex040269 @ 31.01.13, 15:38) необходимо зарегистрироваться для просмотра ссылки
По моему в любой типовой конфигурации можно отключить контроль ОО через интерфейс пользователя! В этом случае при проведении в минус каждый раз создается новая пария.

Конфигурация не типовая.

Цитата(sava1 @ 31.01.13, 15:15) необходимо зарегистрироваться для просмотра ссылки
После первого конца списка все количество, что осталось списываем с нулевой стоимостью
после первого цикла (вложенного)

Вы не могли бы поподробнее.
sava1
1. Первую проверку убираем (комментируем)
2. Вторая часть сохраняется (в части списания наличных партий)
3. После списания существ. партий остается некоторое количество (КоличествоНадоСписать). Вот его списываем без партии и без стоимости - уходим в минуса по количеству. потом эту ситуацию можно найти анализом регистра или тупым перепроведением расходных документов.
Vofka
Цитата(alex040269 @ 31.01.13, 15:38) необходимо зарегистрироваться для просмотра ссылки
По моему в любой типовой конфигурации можно отключить контроль ОО через интерфейс пользователя! В этом случае при проведении в минус каждый раз создается новая пария.

Отключите контроль остатков в партионном учете в УТ.
sava1
УПП - дополнительные права - разрешить превышение остатка....
TipsyKID
alexkhua

Если Вам не помогли предыдущие советы (например alex040269 ), то проблема не в обработке запроса, а в самом запросе.
Коль конфигурация писалась с нуля, возможно в запросе уже сделали отбор на отрицательные остатки.
Для дальнейшего анализа - запрос в студию!
Vofka
Цитата(sava1 @ 31.01.13, 16:18) необходимо зарегистрироваться для просмотра ссылки
УПП - дополнительные права - разрешить превышение остатка....

Ну вот поставьте и посмотрите что будет.
alexkhua
Цитата(TipsyKID @ 31.01.13, 16:27) необходимо зарегистрироваться для просмотра ссылки
alexkhua
запрос в студию!

сообщение #8
alexkhua
До конца еще не проверил, но что-то вроде этого работает
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
    Запрос.УстановитьПараметр("Момент",Неопределено);
Иначе
    Запрос.УстановитьПараметр("Момент",МоментВремени());
    КонецЕсли;
    
         Запрос.УстановитьПараметр("Ссылка",Ссылка);
        Результат=Запрос.Выполнить();
            ВыборкаНоменклатура=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            
            Пока ВыборкаНоменклатура.Следующий() Цикл
                
                
                Если  ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество Тогда
    
                    
                    //Контроль отрицательных остатков
                    //Отказ=Истина;
                    Сообщение = Новый СообщениеПользователю;
                    Нехватка = ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток;
                    Сообщение.Текст="В документе № "  +Номер+  " от "  +Дата+  " Не хватает "  +Нехватка+ " Единиц материала " +ВыборкаНоменклатура.Материал;
                    Сообщение.Сообщить();
                    
    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаНоменклатура.Материал;
    Движение.Склад = СкладМатериалов;
    Движение.Количество=Нехватка;
    КонецЕсли;
    

                
                    //Вычисление себестоимости списываемых партий
                    КоличествоНадоСписать=ВыборкаНоменклатура.Количество;
                    
                    ВыборкаДетальныеЗаписи=ВыборкаНоменклатура.Выбрать();
                    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                        Если ВыборкаДетальныеЗаписи.КоличествоОстаток <=
                                             КоличествоНадоСписать Тогда
                                            
                    //Списываем всю партию
                    
                    КоличествоКСписанию=
                      ВыборкаДетальныеЗаписи.КоличествоОстаток;
                    СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                    //Уменьшаем количество к списанию
                    
                    КоличествоНадоСписать =
                      КоличествоНадоСписать-
                          КоличествоКСписанию;
                          
                      Иначе
                          
                     //Списываем часть партии
                    
                     КоличествоКСписанию=КоличествоНадоСписать;
                    
                    
                     Если ВыборкаДетальныеЗаписи.КоличествоОстаток<>0 Тогда
                        
                СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток/
                       ВыборкаДетальныеЗаписи.КоличествоОстаток*КоличествоКСписанию;
                      
                   Иначе
                       СтоимостьКСписанию=ВыборкаДетальныеЗаписи.СтоимостьОстаток;
                   КонецЕсли;
                  
                   //Обнуляем количество к списанию
                  
                   КоличествоНадоСписать=0;
                  
               КонецЕсли;
              
                             
    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаДетальныеЗаписи.Материал;
    Движение.Склад = ВыборкаДетальныеЗаписи.Склад;
    Движение.Партия=ВыборкаДетальныеЗаписи.Партия;
    Движение.Количество=КоличествоКСписанию;
    Движение.Стоимость=СтоимостьКСписанию;
    
        
    
        
    


            
        
    
                //Проверяем необходимость дальнейшего преребора партий
                
                Если КоличествоНадоСписать<=0 Тогда
                    Прервать;
                    
                КонецЕсли;
            КонецЦикла; //По партиям
        //КонецЕсли;
    КонецЦикла;// по материалам
sava1
Цитата(Vofka @ 31.01.13, 19:34) необходимо зарегистрироваться для просмотра ссылки
Ну вот поставьте и посмотрите что будет.

На что смотреть ?
У меня все ЧПники так работают - сначала продают, потом им отгружаем.
Zaval
Цитата(sava1 @ 31.01.13, 15:15) необходимо зарегистрироваться для просмотра ссылки
Элементарно. А закрыть минуса обработкой в конце месяца


smile.gif Какой тогда смысл вообще что-то двигать по партиям в течение месяца?
sava1
Чтобы не лезть в конфигурацию ;-))))

Безобразно, но однообразно...
Zaval
Цитата(sava1 @ 01.02.13, 8:49) необходимо зарегистрироваться для просмотра ссылки
Чтобы не лезть в конфигурацию ;-))))

Безобразно, но однообразно...


Хм... это в какой конфигурации нельзя отключить "Списывать партии при проведении документов" ?
Vofka
Цитата(sava1 @ 01.02.13, 7:55) необходимо зарегистрироваться для просмотра ссылки
На что смотреть ?
У меня все ЧПники так работают - сначала продают, потом им отгружаем.

Внимательней посмотрите. Остатки уходят в минус, а партии уходят в 0 и в минус не идут. Естественно, если вы не забыли, что мы про типовую конфигурацию, в данном случае, говорим. Отакэ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.