Имя: Пароль:
1C
1С v8
Списание по ФИФО
,
0 FuriKuri
 
13.03.13
14:49
Такой вопрос. Есть Регистр накопление "ЗаявкиМатСклада". Документ "Заявки материального склада" делает приход по нему. Документ "перемещение товара" делает по нему расход. Например 12 числа было заявлено 3 заготовки, а потом 14 числа было заявлено 4 заготовки. 15 числа было перемещено, например 6 заготовок. Нужно чтоб она сначало списало первые 3 заготовки, а потом еще 3 со следующей заявки.

Я делаю это так: вырезка из Обработки проведения документа "Перемещение товара" где "Товары" - табличная часть документа

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

Запрос.УстановитьПараметр("СкладПолучатель",СкладПолучатель);
Запрос.УстановитьПараметр("Номенклатура",Товары.ВыгрузитьКолонку("Номенклатура"));
Результат = Запрос.Выполнить();
ВыборкаТоваров=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаТоваров.Следующий() цикл

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

Но в итоге у меня списывает просто 6 заготовок. Подскажите пожалуйста в чем я ошибся?
1 lxndr
 
13.03.13
14:56
во-первых тебе наверняка нужно измерение "Заявка" в регистр
2 GLazNik
 
13.03.13
14:58
(0) "потом еще 3 со следующей заявки" и где у тебя в регистра заявка?
3 FuriKuri
 
13.03.13
15:01
(1)  В регистре у меня у меня измерения "СкладЗаявитель" и "Номенклатура" и ресурс - "Количество". Зачем нужна еще заявка?
4 lxndr
 
13.03.13
15:02
(3)
> Нужно чтоб она сначало списало первые 3 заготовки, а потом еще 3 со следующей заявки.

Это же твое требование
5 shuhard
 
13.03.13
15:02
(3) попробуй сделать без измерения
хотя на куя делать из оборотов остатки , когда это умеет платформа ?
6 FuriKuri
 
13.03.13
15:07
(4) Немного не понимаю.
например в регистре такие записи:
+ 12.03 Перемещение Склад Заготовка 3
+ 13.03 Перемещение Склад Заготовка 4

И нужно чтоб добавило расход
- 14.03 Перемещение Склад Заготовка 3
- 14.03 Перемещение Склад Заготовка 3 (если другой остаток(1 2 3 4) зависящий от количества перемещенных товаров)
7 GLazNik
 
13.03.13
15:10
(6) не мучайся. добавь измерение "Заявка". или хотя б дату заявки.
8 FuriKuri
 
13.03.13
15:11
(7) и в это измерение поместить ссылку на документ поступления?
9 FuriKuri
 
13.03.13
15:11
(8) ой, то есть заявки
10 GLazNik
 
13.03.13
15:13
(9) да
11 FuriKuri
 
13.03.13
15:13
(10) а в чем смысл, если в регистре есть автоматически ссылки на регистратор и на период
12 lxndr
 
13.03.13
15:14
(6)
Как ты поймешь, закрыта по какой заявке расход из одинаковых строк?
- 14.03 Перемещение Склад Заготовка 3
- 14.03 Перемещение Склад Заготовка 3

Как понять какая заявка закрыта/не закрыта?
13 GLazNik
 
13.03.13
15:14
(11) смысл в том, что для определения Заявки не надо перебирать все движения по регистру
14 FuriKuri
 
13.03.13
15:18
(13) Добавил, но что то не очень понимаю каким образом мне отбор делать сейчас.
15 FuriKuri
 
13.03.13
15:28
Никто не подскажет?
16 GLazNik
 
13.03.13
15:29
(14) запрос по остаткам, плюс сортировка по заявке.
17 FuriKuri
 
13.03.13
15:37
(16)сейчас попробую.
18 FuriKuri
 
13.03.13
15:42
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ЗаявкиМатСкладаОстатки.СкладЗаявитель КАК СкладЗаявитель,
|    ЗаявкиМатСкладаОстатки.Номенклатура КАК Номенклатура,
|    ЗаявкиМатСкладаОстатки.Заявка КАК Заявка,
|    ЗаявкиМатСкладаОстатки.ОстатокОстаток
|ИЗ
|    РегистрНакопления.ЗаявкиМатСклада.Остатки(
|            ,
|            СкладЗаявитель = &СкладПолучатель
|                И Номенклатура = &Номенклатура) КАК ЗаявкиМатСкладаОстатки
|
|СГРУППИРОВАТЬ ПО
|    ЗаявкиМатСкладаОстатки.Номенклатура,
|    ЗаявкиМатСкладаОстатки.СкладЗаявитель,
|    ЗаявкиМатСкладаОстатки.Заявка,
|    ЗаявкиМатСкладаОстатки.ОстатокОстаток
|
|УПОРЯДОЧИТЬ ПО
|    Заявка УБЫВ";

Как то так да?
19 lxndr
 
13.03.13
15:59
(18)
1. Отбор лучше делать не по одной номенклатуре, а по всей из документа перемещения.
2. Группировать ничего не надо.
3. Удобнее обходить результат запроса, когда будут итоги по номенклатуре и детальные записи с заявками.

п.с. Реши (или найди решение) любую задачу со спеца по платформе на оперативный учет.
20 FuriKuri
 
13.03.13
18:10
Сделал так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ЗаявкиМатСкладаОстаткиИОбороты.ОстатокПриход,
|    ЗаявкиМатСкладаОстаткиИОбороты.СкладЗаявитель,
|    ЗаявкиМатСкладаОстаткиИОбороты.Номенклатура КАК Номенклатура,
|    ЗаявкиМатСкладаОстаткиИОбороты.Заявка КАК Заявка,
|    ЗаявкиМатСклада.Остаток
|ИЗ
|    РегистрНакопления.ЗаявкиМатСклада.ОстаткиИОбороты(
|            ,
|            ,
|            ,
|            ,
|            Номенклатура В (&Номенклатура)
|                И СкладЗаявитель = &Склад) КАК ЗаявкиМатСкладаОстаткиИОбороты,
|    РегистрНакопления.ЗаявкиМатСклада КАК ЗаявкиМатСклада
|
|СГРУППИРОВАТЬ ПО
|    ЗаявкиМатСкладаОстаткиИОбороты.ОстатокПриход,
|    ЗаявкиМатСкладаОстаткиИОбороты.СкладЗаявитель,
|    ЗаявкиМатСкладаОстаткиИОбороты.Номенклатура,
|    ЗаявкиМатСкладаОстаткиИОбороты.Заявка,
|    ЗаявкиМатСклада.Остаток
|
|УПОРЯДОЧИТЬ ПО
|    Заявка";

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

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

Если проводить одним документом, то раскидвает хорошо, но если остальную часть перемещать следующим документом, то криво выводятся остатки. Не понимаю как закрывать именно один приход расходом.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс