[Специалист профессионал 1С 8.2 8.3 ]

14:45
Задача 1.4 Оперативный учет
  списание товара в расходной не по средней будет .а согласно учетной политике 

1) в Приходной код:

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

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

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


2) В Расходной  код:



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

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

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




Отчеты: Остатки также как в 1 .1 1. 2 1 .3

в Продажах:  

ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
ПродажиОбороты.СуммаПродажОборот КАК Продажа,
ПродажиОбороты.СуммаПродажОборот - ПродажиОбороты.СебестоимостьОборот КАК Прибыль
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты



Просмотров: 2975 | Добавил: moshefoo | Рейтинг: 5.0/2
Всего комментариев: 0
Имя *:
Email *:
Код *: