Имя: Пароль:
1C
 
Двойное списание номенклатуры
0 myr4ik07
 
10.09.14
14:48
Процедура ОбработкаПроведения(Отказ, Режим)
    
    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
    
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
    |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе,
    |    ОказаниеУслугиПереченьНоменклатуры.НаборСвойств
    |ПОМЕСТИТЬ НоменклатураДокумента
    |ИЗ
    |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
    |ГДЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры,
    |    ОказаниеУслугиПереченьНоменклатуры.НаборСвойств";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст =          
    "ВЫБРАТЬ
    |    НоменклатураДокумента.Номенклатура,
    |    НоменклатураДокумента.ВидНоменклатуры,
    |    НоменклатураДокумента.КоличествоВДокументе,
    |    НоменклатураДокумента.СуммаВДокументе,
    |    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
    |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество,
    |    ОстаткиМатериаловОстатки.НаборСвойств
    |ИЗ
    |    НоменклатураДокумента КАК НоменклатураДокумента
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
    |                ,
    |                Материал В
    |                    (ВЫБРАТЬ
    |                        НоменклатураДокумента.Номенклатура
    |                    ИЗ
    |                        НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
    |        ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
    |                ,
    |                Материал В
    |                    (ВЫБРАТЬ
    |                        НоменклатураДокумента.Номенклатура
    |                    ИЗ
    |                        НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
    |        ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал";
    
    Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
    Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;
    Движения.СтоимостьМатериалов.Записать();
    Движения.ОстаткиМатериалов.Записать();
    
    Результат = Запрос2.Выполнить();
    ТЗ = Результат.Выгрузить();
    
    
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
            СтоимостьМатериала = 0;
        Иначе
            СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
        КонецЕсли;                                                                                            
        
        Если ВыборкаДетальныеЗаписи.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
            
            Движение = Движения.ОстаткиМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
            Движение.Склад = Склад;
            Движение.НаборСвойств = ВыборкаДетальныеЗаписи.НаборСвойств;
            Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
            
            Движение = Движения.СтоимостьМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
            Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе  * СтоимостьМатериала;
            
        КонецЕсли;
        
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Клиент = Клиент;
        Движение.Мастер = Мастер;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
        Движение.Стоимость = СтоимостьМатериала * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        
    КонецЦикла;
    
    Движения.Записать();
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст =   "ВЫБРАТЬ
                          |    ОстаткиМатериаловОстатки.Материал,
                          |    ОстаткиМатериаловОстатки.КоличествоОстаток
                          |ИЗ
                          |    РегистрНакопления.ОстаткиМатериалов.Остатки(
                          |            ,
                          |            Материал В
                          |                    (ВЫБРАТЬ
                          |                        НоменклатураДокумента.Номенклатура
                          |                    ИЗ
                          |                        НоменклатураДокумента)
                          |                И Склад = &Склад) КАК ОстаткиМатериаловОстатки
                          |ГДЕ
                          |    ОстаткиМатериаловОстатки.КоличествоОстаток < 0";        
         Запрос3.УстановитьПараметр("Склад", Склад);
         Результат = Запрос3.Выполнить();
        
         ВыборкаДетальныеЗаписи = Результат.Выбрать();
        
         Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            
             Сообщение = Новый СообщениеПользователю();
             Сообщение.Текст = "Не хватает   " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + "   единиц материала" + """"
                                                     + ВыборкаДетальныеЗаписи. Материал + """";
            Сообщение.Сообщить();
            Отказ = Истина;
         КонецЦикла;;
    
    КонецЕсли;
КонецПроцедуры


почему при реализации товара списывается одна номенклатура два раза?
1 Wobland
 
10.09.14
14:50
предлагаешь почувствовать себя в роли отладчика?
2 myr4ik07
 
10.09.14
14:52
та не могу разобраться (1)
3 myr4ik07
 
10.09.14
14:53
в регистр попадает два количества одной номенклатуры
4 Wobland
 
10.09.14
14:54
(2) тебе хорошо, у тебя всё под руками. а мне конфигурацию под это делать надо. так думать лениво
5 myr4ik07
 
10.09.14
14:55
ясно (4)
6 Ёпрст
 
10.09.14
15:11
(0) в регистре Номенклатура - не единственное измерение, тебе при левом соединении будет столько записей, сколько уникальных наборов по всем измерениям с данной номенклатурой... отсюда и задвоение, затроение..и т.д.
7 Ёпрст
 
10.09.14
15:12
+6 видать помимо номенклатуры и склада, есть еще измерения в
ОстаткиМатериалов, не так ли ?
8 myr4ik07
 
10.09.14
15:25
капец, в запросе дело, во втором

нужно брать с
    | НоменклатураДокумента.НаборСвойств,

а брал с
|    ОстаткиМатериаловОстатки.НаборСвойств
9 Ёпрст
 
10.09.14
15:28
(8) не спасёт
10 myr4ik07
 
10.09.14
15:30
не знаю... , сейчас работает как надо(9)
11 Ёпрст
 
10.09.14
15:31
(10) в регистре сколько измерений ?
12 Ёпрст
 
10.09.14
15:31
в этом сколько ?
СтоимостьМатериалов
и в этом сколько?
ОстаткиМатериалов ?
13 myr4ik07
 
10.09.14
15:32
стоимость - 1
остатки -3
14 Ёпрст
 
10.09.14
15:33
(13) вот из-за остатков - будет задвоение, затроение..
ибо в фильтре ты указываешь только 2 из 3-х..
15 Ёпрст
 
10.09.14
15:35
пример

в табличке у тебя
валенки

а в ОстаткиМатериалов

валенки склад1  измерение3
валенки склад1  измерение1212

при фильтре на склад1 вернет тебе пару валенок..
16 myr4ik07
 
10.09.14
15:35
буду знать коль пойдет что то не так, благодарю (14)
17 Ёпрст
 
10.09.14
15:37
ну и раньше - ты фильтр даже по складу не устанавливаешь.. вообще - только по номенклатуре, тоже будет "подарок"
18 sf
 
10.09.14
16:33
(15) а вроде отец. до сих пор клюшками балуешься?
19 Ёпрст
 
10.09.14
16:34
(18) у нас есть всё
20 sf
 
10.09.14
17:14
(19) ну так чейто она две записи вернет? это ж 8ка. Таблица Остатки, она сама сгруппирует по полям выборки. т.е. если выбираешь только одно измерение, то и строка будет одна
21 Ёпрст
 
10.09.14
17:28
(20)ааа..
в клюшках надо спецом было указывать
22 myr4ik07
 
10.09.14
18:26
вернулся назад )) действительно  троиться запись, так где там что там поправить нужно?
23 myr4ik07
 
10.09.14
18:31
не могу понять, что подразумеваете под словом "фильтр"? (17)