Имя: Пароль:
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 Тогда
       Если СуммаОстаток<СуммаСписать тогда
           СуммаСписать=СуммаОстаток;
            Движение = Движения.ЗаявкиМатСклада.Добавить();
           Движение.ВидДвижения = ВидДвиженияНакопления.Расход;    
           Движение.Период=Дата;
           Движение.Регистратор=Ссылка;
           Движение.Номенклатура=стр.Номенклатура;
           Движение.СкладЗаявитель=СкладПолучатель;
           Движение.Остаток=СуммаСписать;
           Индекс= Индекс+СуммаСписать;
       Иначе
           Движение = Движения.ЗаявкиМатСклада.Добавить();
           Движение.ВидДвижения = ВидДвиженияНакопления.Расход;    
           Движение.Период=Дата;
           Движение.Регистратор=Ссылка;
           Движение.Номенклатура=стр.Номенклатура;
           Движение.СкладЗаявитель=СкладПолучатель;
           Движение.Остаток=СуммаСписать;
           
       Индекс=Индекс+СуммаСписать;
       КонецЕсли;
   Иначе    
       
       Сообщить("Все");
       Продолжить;

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

Если проводить одним документом, то раскидвает хорошо, но если остальную часть перемещать следующим документом, то криво выводятся остатки. Не понимаю как закрывать именно один приход расходом.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn