Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Партионный учет (Проведение расходной)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bodka
Что-то я запутался... Почему при проведении расходной у меня списывается только одна единица по регистру ОстаткиТоваров? Списать = Мин(ОсталосьСписать,ВыборкаПартии.КоличествоОстаток); - Здесь я все правильно написал?


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

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

    Результат = Запрос.Выполнить();

    Выборка  = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

    
КонецПроцедуры
Vofka
Это из книги Радченко?
bodka
Нет
Flexy
Очень похоже на практическое задание которое дает работодатель wink.gif
А вообще структура кода напоминает Курс Чистова, где рассматривалось списание партий товара.
В Радченко по моему не рассматривались задачи такого плана.если ошибаюсь - поправьте, т.к. нет книги под рукой.
bodka
Да, это из курса Чистова...

Радченко в книге "Практ. Пос. Разр." не рассматривал партионный

Нужно вот так:
ОсталосьСписать = Выборка.Количество;

Когда набирал код после точки нажал ввод для выбора "Количество()"
Batchir
Не хватает движения если в конце ОсталосьСписать <> 0, но есть в остатках. В данном случае означает что у Вас проблемы с партиями, т.е. по партиям меньше чем в остатках
В вашем примере стоит, например ОсталосьСписать=2, а остаток по партиям равен 1. После выполнения циклов ОсталосьСписать = 1. Это количество тоже нужно списать, но не в разрезе партий.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.