Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

ФИФО

Ø [Волшебник, 08.05.18 - 16:47]
ФИФО
Я
   skupidom
 
08.05.18 - 09:12
Есть регистр накопления «Партии товаров» (остатки):
Измерения: Номенклатура,Партия.
Ресурсы: Количество,Сумма.
Самописный документ "Расходная накладная" должен делать списание партий по методу ФИФО.
Все правильно написано:
Процедура ОбработкаПроведения(Отказ,Режим)
    
    Движения.ПартииТоваров.Записывать = Истина;
    
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст = 
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            // Списание

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

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

        
КонецПроцедуры
 
 
   Fragster
 
1 - 08.05.18 - 09:15
по крайней мере вывод ошибки не по БСПшному
   Fragster
 
2 - 08.05.18 - 09:15
количество и сумма неправильно списываются
   Fragster
 
3 - 08.05.18 - 09:15
да и вообще, запустить, да проверить
   Ненавижу 1С
 
4 - 08.05.18 - 09:18
1. количество надо списывать необходимое, а не остаток партии
2. себестоимость списывать пропорционально списываемому количеству к общему остатку партии
   rabbidX
 
5 - 08.05.18 - 09:27
+ Блокировку данных бы добавить.
   Buster007
 
6 - 08.05.18 - 09:29
так автор, вроде, утверждает, а не спрашивает... Что вы тут со своими советами?
   skupidom
 
7 - 08.05.18 - 09:44
как это в коде правильно написать:
1. количество надо списывать необходимое, а не остаток партии
2. себестоимость списывать пропорционально списываемому количеству к общему остатку партии
   DrShad
 
8 - 08.05.18 - 09:48
а где момент документа?
   Ненавижу 1С
 
9 - 08.05.18 - 09:49
(7)
1. списывать надо у тебя РезультатКол
проверять, что прекратить списывать надо:
Если РезультатКол=0 Тогда

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

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

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

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

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

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

        
КонецПроцедуры

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

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

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

        
КонецПроцедуры
   skupidom
 
26 - 08.05.18 - 10:23
условие выхода из цикла не исправил 
ну и предыдущие движения надо очистить и записать

поправь пожалуйста; где это исправить нужно
   skupidom
 
27 - 08.05.18 - 10:42
Процедура ОбработкаПроведения(Отказ,Режим)
    
    НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей();
    НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка);
    НаборЗаписейПартииТоваров.Записать();
    
    Движения.ПартииТоваров.Записывать = Истина;
           
    ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество,Сумма");
    
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст = 
    "ВЫБРАТЬ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки
    |ГДЕ
    |    ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен)
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";    
    ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура"));
    ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата);
    ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНомен.Следующий() Цикл  
        ПеремКолвоКСписанию = ВыборкаНомен.Остаток;
        ВыборкаПартия = ВыборкаНомен.Выбрать();
        Пока ВыборкаПартия.Следующий() Цикл  
            ОстатокПартии = ВыборкаПартия.Остаток;            
            РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии);
            Если РезультатКол = 0 Тогда
                Продолжить;
            КонецЕсли;    
            // Списание

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

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

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

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

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

        
КонецПроцедуры
   skupidom
 
33 - 08.05.18 - 10:50
спасибо (27)
 
 
   skupidom
 
34 - 08.05.18 - 10:59
не вот так должно быть:

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

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

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

        
КонецПроцедуры
   skupidom
 
35 - 08.05.18 - 10:59
?
   Любопытная
 
36 - 08.05.18 - 11:05
Вы всё еще списываете остатки в регистре, а не количество из ТЧ. Это нормально для вашей задачи?
Список номенклатуры тоже можно заложить в параметры виртуальной таблицы.
Вместо даты лучше использовать момент времени документа.

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

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

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

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

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

        
КонецПроцедуры
   skupidom
 
40 - 08.05.18 - 11:17
как - надо брать из документа количество ?
   Любопытная
 
41 - 08.05.18 - 11:17
(37) В запрос передавайте не список номенклатуры, а таблицу - номенклатура, количество.
Чтобы на выходе у вас была таблица Номенклатура, Количество к списанию, Остаток. Таким образом вы сможете контролировать, хватает ли у вас вообще остатков, а после уже списывать по партиям.
   skupidom
 
42 - 08.05.18 - 11:20
В запрос передавайте не список номенклатуры, а таблицу - номенклатура, количество - это сделать через временную таблицу?
   Любопытная
 
43 - 08.05.18 - 11:23
Стаж 7 лет...
Всё, мне стало скучно, да и конфа обновилась.
Дальше сама
   Buster007
 
44 - 08.05.18 - 11:29
Насколько я помню, в книге Радченко, по основам программирования, есть сквозной пример с фифо.
Еще есть пример задачи из экзамена на спеца по платформе с фифо.
В общем в инете полно примеров.
P.S. примеров на все случаи жизни в интернете нет.
   skupidom
 
45 - 08.05.18 - 12:14
ТЗТовары = Товары.Выгрузить();
    ТЗТовары.Свернуть("Номенклатура","Количество");
    ЗапросТоварыРасход = Новый Запрос;
    ЗапросТоварыРасход.Текст = 
    "ВЫБРАТЬ
    |    ВнешняяТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    ВнешняяТаблицаНоменклатуры.Количество КАК Количество
    |ПОМЕСТИТЬ ВТТаблицаНоменклатуры
    |ИЗ
    |    &ТЗ КАК ВнешняяТаблицаНоменклатуры
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    ВТТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    ВТТаблицаНоменклатуры.Количество КАК Количество,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    ПартииТоваровОстатки.КоличествоОстаток КАК КоличествоОстаток,
    |    ПартииТоваровОстатки.СуммаОстаток КАК СуммаОстаток
    |ИЗ
    |    ВТТаблицаНоменклатуры КАК ВТТаблицаНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки
    |        ПО ВТТаблицаНоменклатуры.Номенклатура = ПартииТоваровОстатки.Номенклатура";
    ЗапросТоварыРасход.УстановитьПараметр("ТЗ",ТЗТовары);
    ЗапросТоварыРасход.УстановитьПараметр("МоментВр",Ссылка.МоментВремени());
   skupidom
 
46 - 08.05.18 - 12:15
правильно ?
   DrShad
 
47 - 08.05.18 - 12:15
(46) нет
   skupidom
 
48 - 08.05.18 - 12:17
в чем ошибся?
   Ненавижу 1С
 
49 - 08.05.18 - 12:18
ну нельзя же вот так кодить онлайн
 
 Рекламное место пустует
   skupidom
 
50 - 08.05.18 - 12:19
я понимаю,но надо правильно составить запрос..
   DrShad
 
51 - 08.05.18 - 12:19
ВТ  неправильно собрал
забываешь о характеристике, серии, качестве и складе
   Ненавижу 1С
 
52 - 08.05.18 - 12:22
(51) согласно описанию в (0) нет таких измерений
   skupidom
 
53 - 08.05.18 - 12:24
таблица примитивна, этого: характеристике, серии, качестве и складе - нет
   Fragster
 
54 - 08.05.18 - 12:24
странно, в (48) мужской род, а в личной карточке - женский...
   triviumfan
 
55 - 08.05.18 - 12:27
(54) транс
   Fragster
 
56 - 08.05.18 - 12:29
   mistеr
 
57 - 08.05.18 - 12:31
Бесплатный сервис коллективной отладки на Мисте. Волшебнику пора уже деньги брать с ленивых студентов.
   skupidom
 
58 - 08.05.18 - 12:52
"ВЫБРАТЬ
    |    ВнешняяТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    ВнешняяТаблицаНоменклатуры.Количество КАК Количество
    |ПОМЕСТИТЬ ВТТаблицаНоменклатуры
    |ИЗ
    |    &ТЗ КАК ВнешняяТаблицаНоменклатуры
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    ВТТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    |    СУММА(ВТТаблицаНоменклатуры.Количество) КАК Количество,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК КоличествоОстаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
    |ИЗ
    |    ВТТаблицаНоменклатуры КАК ВТТаблицаНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки
    |        ПО ВТТаблицаНоменклатуры.Номенклатура = ПартииТоваровОстатки.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    ВТТаблицаНоменклатуры.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ ПО
    |    Номенклатура";
   skupidom
 
59 - 08.05.18 - 12:52
что не так я делаю в запросе ?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует