Обусловленное Проведение

Тема в разделе "1C и всё что с ней связано", создана пользователем Greml1N, 17 сен 2010.

  1. Greml1N

    Greml1N Гость

    Всем доброго времени. Прошу помочь с такой вот вещью. Сделал обусловленное проведение(fifo),и списание по партиям Расходной накладной.Вот что вышло.

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Исходный код если кому-то интересно</div></div><div class="sp-body"><div class="sp-content">
    Код ( (Unknown Language)):
    Процедура ОбработкаПроведения(Отказ, Режим)

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

    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    // регистр Остатки Расход
    Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
    //Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаПартий.Номенклатура;
    Движение.Партия=ВыборкаПартий.Партия;
    Движение.Количество =КоличествоСп;
    Движение.Сумма =СебестоимостьСП;

    Движение.Склад=Склад;


    Если НадоСписать=0 Тогда
    Прервать;
    КонецЕсли;
    КонецЦикла;

    КонецЕсли;
    КонецЦикла;


    КонецПроцедуры
    Но он проверяет остатки не беря в расчёт склады. Т.е надо что бы он проверял нехватку на том складе,который указан в расходной.
    Оприходование товара то же идёт по складам.
    склад указан в качестве измерение в регистре накопления(Остатки номенклатуры)
    Склад-реквизит документа расходная. Типа имеет ссылку на справочник Склады.
    Вот так вот)
     
  2. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Много лишнего кода привели. Во-первых: где вы проверяете склад? Правильно, нигде. Получая остатки запросом, необходимо итоги брать по складу, а не по номенклатуре. Во-вторых: выборку отсортировать по убыванию, по регистратору.
     
  3. boris

    boris Гость

    В регистр ОстаткиНоменклатуры добавь измерение Склад и при списывании товара отбирай по этому значению. (При оприходовании заноси )))
     
Загрузка...

Поделиться этой страницей