Имя: Пароль:
1C
1С v8
При партийном учёте товар списывается с большего числа документов, чем должен
0 Персиваль
 
11.09.14
10:36
Здравствуйте. Я только начинаю изучать 1с и у меня, периодически, возникают вопросы.
Задача:
есть 2 документа (приход \ расход) и регистр накопления. После проведения документов прихода \ расхода, происходит списание товара с указанием партии.
Проблема в том, что товар в единственном числе списывается с нескольких приходных документов.
Партия указанна в регистре накопления, как ссылка на приходной документ.
Подскажите пожалуйста, как можно решить эту проблему ?


Код расходного документа:

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

    Выборка = РезультатЗапроса.Выбрать();    
     Пока Выборка.Следующий() Цикл        
        Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
            Сообщить("Не хватает товара "+Выборка.Номенклатура+" на складе "+Выборка.Склад);
            Отказ = истина;
            Возврат ;        
        КонецЕсли;            
                    
        Движение = Движения.ТоварыНаСкладе.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        ЗаполнитьЗначенияСвойств(Движение, Выборка);
        Движение.Сумма = Выборка.СуммаОстаток/Выборка.КоличествоОстаток*Выборка.Количество;    
        
     КонецЦикла;    
КонецЦикла;    
    
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
1 Поpyчик-4
 
11.09.14
10:58
(0) Партийный учёт был когда-то при советской власти и кровавой гэбне. В хозяйственной деятельности применяется учёт партионный. Запишите на бумажку и носите её с собой, если не сможете запомнить.
2 Персиваль
 
11.09.14
13:22
В данном форуме отсутствует функция редактирования сообщений. Или я её не нашёл. Извиняюсь за орфографию и безграмотность.
Поручик, может у вас будет что посоветовать по делу ?
3 alle68
 
11.09.14
14:07
(0) По алгоритму списывается весь остаток.
Обычно используют итоги (здесь, по складу и номенклатуре).
4 Персиваль
 
11.09.14
15:37
Использовал итоги(по складу и номенклатуре). В данном случае в регистре вообще возникает движения "расход" только по 1 наименованию, из 2-4, имеющихся в проведённом документе.

Так же я произвел подсчет товара, который я списал ранее. Ничего не изменилось.
5 sf
 
11.09.14
15:47
(4) 1. открой для себя пакетный запрос + консоль запросов
2. перепиши второй запрос - у тебя будет столько же строк по каждой номенклатуре, сколько и партий
3.
КонецЦикла;    
КонецЦикла;
где-то ты нас наеживаешь

p.s. а что сейчас все дипломы на 1с можно делать?
6 Персиваль
 
11.09.14
16:14
1) Ок
3) Забыл убрать. Я нашёл немножко похожее задание на "1с специалиста" и разбирал его.
4) Если тема подходит, то почему бы и нет.
7 Персиваль
 
13.09.14
14:02
Переписал 2-ой запрос. Ниже можно его посмотреть.
Теперь у меня ничего не отображается в столбце "Партия".

Почему, можете написать ?

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

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

Пока ВыборкаПартии.Следующий() Цикл
Если  ВыборкаПартии.КоличествоОстаток<СписатьКол Тогда
                        СписатьКоличествоЗаказа = ВыборкаПартии.КоличествоОстаток;
                        СуммаСписания = ВыборкаПартии.СуммаОстаток;
                    Иначе
                        СписатьКоличествоЗаказа=СписатьКол;
                        СуммаСписания = ВыборкаПартии.СуммаОстаток/ВыборкаПартии.КоличествоОстаток*ВыборкаПартии.Количество;
                    КонецЕсли;
            
        Движение = Движения.ТоварыНаСкладе.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        ЗаполнитьЗначенияСвойств(Движение, Выборка);
    Движение.Количество = СписатьКоличествоЗаказа;
        Движение.Сумма = СуммаСписания;    
        
     КонецЦикла;    
КонецЦикла;    
    
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
8 Мимохожий Однако
 
13.09.14
14:10
Поищи консоль запросов и в ней помучай свои запросы.
9 zak555
 
13.09.14
14:11
(7) зачем шаку соединять с тч товары ?
10 GROOVY
 
13.09.14
14:14
Вот тут есть классический простой партионный (партийный) учет: http://1c.chistov.pro/2013/07/blog-post_25.html ближе к середине статьи.

А вот тут есть запрос, который рассчитывает списываемое количество без объектной модели: http://1c.chistov.pro/2014/03/blog-post.html
11 alle68
 
13.09.14
14:23
(7) Так гораздо лучше, но не хватает выборки по складу.
Ошибка? Это не ошибка, это системная функция.