Имя: Пароль:
1C
1С v8
ФИФО
Ø (Волшебник 08.05.2018 16:47)
,
0 skupidom
 
08.05.18
09:12
Есть регистр накопления «Партии товаров» (остатки):
Измерения: Номенклатура,Партия.
Ресурсы: Количество,Сумма.
Самописный документ "Расходная накладная" должен делать списание партий по методу ФИФО.
Все правильно написано:
Процедура ОбработкаПроведения(Отказ,Режим)
    
    Движения.ПартииТоваров.Записывать = Истина;
    
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если ПеремКолвоКСписанию = 0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = ВыборкаПартия.Количество;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры
1 Fragster
 
гуру
08.05.18
09:15
по крайней мере вывод ошибки не по БСПшному
2 Fragster
 
гуру
08.05.18
09:15
количество и сумма неправильно списываются
3 Fragster
 
гуру
08.05.18
09:15
да и вообще, запустить, да проверить
4 Ненавижу 1С
 
гуру
08.05.18
09:18
1. количество надо списывать необходимое, а не остаток партии
2. себестоимость списывать пропорционально списываемому количеству к общему остатку партии
5 rabbidX
 
08.05.18
09:27
+ Блокировку данных бы добавить.
6 Buster007
 
08.05.18
09:29
так автор, вроде, утверждает, а не спрашивает... Что вы тут со своими советами?
7 skupidom
 
08.05.18
09:44
как это в коде правильно написать:
1. количество надо списывать необходимое, а не остаток партии
2. себестоимость списывать пропорционально списываемому количеству к общему остатку партии
8 DrShad
 
08.05.18
09:48
а где момент документа?
9 Ненавижу 1С
 
гуру
08.05.18
09:49
(7)
1. списывать надо у тебя РезультатКол
проверять, что прекратить списывать надо:
Если РезультатКол=0 Тогда

2. Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Количество;
10 skupidom
 
08.05.18
09:52
а количество?
11 Ненавижу 1С
 
гуру
08.05.18
09:53
(10) внимательно прочитал в (9)?
12 Любопытная
 
08.05.18
09:56
(0) Количество из ТЧ документа вообще не участвует в списании, т.е. что вы списываете - непонятно.
Остатки в запросе всегда получаются на текущий момент времени, т.е. при проведении документа задним числом списываться будут всё равно партии, актуальный на сейчас, а не на тогда.
Это что - задача в институте? Или тест при приеме на работу?
13 DrShad
 
08.05.18
09:58
а если его повторно провести вообще шикарно будет
14 skupidom
 
08.05.18
10:01
Процедура ОбработкаПроведения(Отказ,Режим)
    
    Движения.ПартииТоваров.Записывать = Истина;
    
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если ПеремКолвоКСписанию = 0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = РезультатКол;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры
15 skupidom
 
08.05.18
10:02
исправил
16 DrShad
 
08.05.18
10:03
(14) списывать нужно количество из документа, а не из партии
17 Любопытная
 
08.05.18
10:03
> ПеремКолвоКСписанию = ВыборкаНомен.Остаток; - вы списываете весь остаток товара, а не количество, указанное в ТЧ.
Или так и задумано?
18 Любопытная
 
08.05.18
10:04
Есть же у Чистова расписанный алгоритм списания по партиям, там чуть не каждая строка прокомментирована, что и зачем делается
19 skupidom
 
08.05.18
10:09
20 Ненавижу 1С
 
гуру
08.05.18
10:10
(14) условие выхода из цикла не исправил
ну и предыдущие движения надо очистить и записать
21 skupidom
 
08.05.18
10:13
Процедура ОбработкаПроведения(Отказ,Режим)
    
    Движения.ПартииТоваров.Записывать = Истина;
    
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |    И ПартииТоваровОстатки.Партия.Дата <= &ТекДата
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата);
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если ПеремКолвоКСписанию = 0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = РезультатКол;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры

как правильно? что дописать? проверка на дату в запросе по документу списания правильная?
22 DrShad
 
08.05.18
10:14
да выкинь ты его нафиг
23 Любопытная
 
08.05.18
10:15
Про параметры виртуальной таблицы не в курсе?
24 Любопытная
 
08.05.18
10:16
Вообще, зачем вам весь этот огород? Это во-первых.
А во-вторых, запустите и проверьте, правильно ли оно работает)
25 skupidom
 
08.05.18
10:22
Процедура ОбработкаПроведения(Отказ,Режим)
    
    Движения.ПартииТоваров.Записывать = Истина;
    
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата);
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если ПеремКолвоКСписанию = 0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = РезультатКол;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры
26 skupidom
 
08.05.18
10:23
условие выхода из цикла не исправил
ну и предыдущие движения надо очистить и записать

поправь пожалуйста; где это исправить нужно
27 skupidom
 
08.05.18
10:42
Процедура ОбработкаПроведения(Отказ,Режим)
    
    НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей();
    НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка);
    НаборЗаписейПартииТоваров.Записать();
    
    Движения.ПартииТоваров.Записывать = Истина;
           
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата);
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если ПеремКолвоКСписанию = 0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = РезультатКол;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры
28 skupidom
 
08.05.18
10:43
подправил с очисткой движений,
где это: условие выхода из цикла не исправил ?
29 Любопытная
 
08.05.18
10:43
Вы думаете, что если 100 раз скопипастить один и тот же текст, народ сдастся и признает, что это правильно?
30 Ненавижу 1С
 
гуру
08.05.18
10:45
(27)
вместо: Если ПеремКолвоКСписанию = 0 Тогда
надо: Если РезультатКол=0 Тогда
31 skupidom
 
08.05.18
10:49
еще нужно что-то исправить?
32 skupidom
 
08.05.18
10:49
Процедура ОбработкаПроведения(Отказ,Режим)
    
    НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей();
    НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка);
    НаборЗаписейПартииТоваров.Записать();
    
    Движения.ПартииТоваров.Записывать = Истина;
           
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата);
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если РезультатКол=0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = РезультатКол;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры
33 skupidom
 
08.05.18
10:50
спасибо (27)
34 skupidom
 
08.05.18
10:59
не вот так должно быть:

Процедура ОбработкаПроведения(Отказ,Режим)
    
    НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей();
    НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка);
    НаборЗаписейПартииТоваров.Записать();
    
    Движения.ПартииТоваров.Записывать = Истина;
           
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата);
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если ПеремКолвоКСписанию < 0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = РезультатКол;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры
35 skupidom
 
08.05.18
10:59
?
36 Любопытная
 
08.05.18
11:05
Вы всё еще списываете остатки в регистре, а не количество из ТЧ. Это нормально для вашей задачи?
Список номенклатуры тоже можно заложить в параметры виртуальной таблицы.
Вместо даты лучше использовать момент времени документа.

Дальше не вчитывалась, но просто я лично не люблю прерывания в тел цикла. Некрасиво это. Но это уже наверное дело вкуса.
37 skupidom
 
08.05.18
11:14
Подскажите пожалуйста как мне правильно скорректировать списание,чтобы списывалось кол-во из тч документа и сделать условие на Момент времени документа ?
38 Ненавижу 1С
 
гуру
08.05.18
11:16
ах да...

вот это:
ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
бред да

надо брать из документа количество
39 skupidom
 
08.05.18
11:17
с моментом времени сделал так:
Процедура ОбработкаПроведения(Отказ,Режим)
    
    НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей();
    НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка);
    НаборЗаписейПартииТоваров.Записать();
    
    Движения.ПартииТоваров.Записывать = Истина;
           
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ЗапросТоварыРасход.УстановитьПараметр("МоментВр",Ссылка.МоментВремени());
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание
            ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол;
            Если ПеремКолвоКСписанию < 0 Тогда
                Прервать;
            Иначе         
                Движение = Движения.ПартииТоваров.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;                
                Движение.Номенклатура = ВыборкаПартия.Номенклатура;
                Движение.Партия = ВыборкаПартия.Партия;
                Движение.Количество = РезультатКол;
                Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток;
            КонецЕсли;    
        КонецЦикла; // Партия <--
        
        Если ПеремКолвоКСписанию <> 0 Тогда
            Отказ = Истина;
            ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию;
            Сообщить(ТекстСообщения,СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЦикла; // Номенклатура    <--
        
КонецПроцедуры
40 skupidom
 
08.05.18
11:17
как - надо брать из документа количество ?
41 Любопытная
 
08.05.18
11:17
(37) В запрос передавайте не список номенклатуры, а таблицу - номенклатура, количество.
Чтобы на выходе у вас была таблица Номенклатура, Количество к списанию, Остаток. Таким образом вы сможете контролировать, хватает ли у вас вообще остатков, а после уже списывать по партиям.
42 skupidom
 
08.05.18
11:20
В запрос передавайте не список номенклатуры, а таблицу - номенклатура, количество - это сделать через временную таблицу?
43 Любопытная
 
08.05.18
11:23
Стаж 7 лет...
Всё, мне стало скучно, да и конфа обновилась.
Дальше сама
44 Buster007
 
08.05.18
11:29
Насколько я помню, в книге Радченко, по основам программирования, есть сквозной пример с фифо.
Еще есть пример задачи из экзамена на спеца по платформе с фифо.
В общем в инете полно примеров.
P.S. примеров на все случаи жизни в интернете нет.
45 skupidom
 
08.05.18
12:14
ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество");
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст =
    "ВЫБРАТЬ
    |    ВнешняяТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    ВнешняяТаблицаНоменклатуры.Количество КАК Количество
    |ПОМЕСТИТЬ ВТТаблицаНоменклатуры
    |ИЗ
    |    &ТЗ КАК ВнешняяТаблицаНоменклатуры
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    ВТТаблицаНоменклатуры.Количество КАК Количество,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    ПартииТоваровОстатки.КоличествоОстаток КАК КоличествоОстаток,
    |    ПартииТоваровОстатки.СуммаОстаток КАК СуммаОстаток
    |ИЗ
    |    ВТТаблицаНоменклатуры КАК ВТТаблицаНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки
    |        ПО ВТТаблицаНоменклатуры.Номенклатура = ПартииТоваровОстатки.Номенклатура";
    ЗапросТоварыРасход.УстановитьПараметр("ТЗ",ТЗТовары);
    ЗапросТоварыРасход.УстановитьПараметр("МоментВр",Ссылка.МоментВремени());
46 skupidom
 
08.05.18
12:15
правильно ?
47 DrShad
 
08.05.18
12:15
(46) нет
48 skupidom
 
08.05.18
12:17
в чем ошибся?
49 Ненавижу 1С
 
гуру
08.05.18
12:18
ну нельзя же вот так кодить онлайн
50 skupidom
 
08.05.18
12:19
я понимаю,но надо правильно составить запрос..
51 DrShad
 
08.05.18
12:19
ВТ  неправильно собрал
забываешь о характеристике, серии, качестве и складе
52 Ненавижу 1С
 
гуру
08.05.18
12:22
(51) согласно описанию в (0) нет таких измерений
53 skupidom
 
08.05.18
12:24
таблица примитивна, этого: характеристике, серии, качестве и складе - нет
54 Fragster
 
гуру
08.05.18
12:24
странно, в (48) мужской род, а в личной карточке - женский...
55 triviumfan
 
08.05.18
12:27
(54) транс
56 Fragster
 
гуру
08.05.18
12:29
57 mistеr
 
08.05.18
12:31
Бесплатный сервис коллективной отладки на Мисте. Волшебнику пора уже деньги брать с ленивых студентов.
58 skupidom
 
08.05.18
12:52
"ВЫБРАТЬ
    |    ВнешняяТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    ВнешняяТаблицаНоменклатуры.Количество КАК Количество
    |ПОМЕСТИТЬ ВТТаблицаНоменклатуры
    |ИЗ
    |    &ТЗ КАК ВнешняяТаблицаНоменклатуры
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    СУММА(ВТТаблицаНоменклатуры.Количество) КАК Количество,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК КоличествоОстаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    ВТТаблицаНоменклатуры КАК ВТТаблицаНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки
    |        ПО ВТТаблицаНоменклатуры.Номенклатура = ПартииТоваровОстатки.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    ВТТаблицаНоменклатуры.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";
59 skupidom
 
08.05.18
12:52
что не так я делаю в запросе ?
Независимо от того, куда вы едете — это в гору и против ветра!