Имя: Пароль:
1C
1С v8
Как понять что запрос работает правильно?
,
0 Kris_Tina7252
 
23.01.15
22:38
Процедура ОбработкаПроведения(Отказ, Режим)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
     "ВЫБРАТЬ
     |    СписаниеТоваровТовары.Номенклатура,
     |    СписаниеТоваровТовары.Количество,
     |    ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток КАК КоличествоНаСкладе
     |ИЗ
     |    Документ.СписаниеТоваров.Товары КАК СписаниеТоваровТовары
     |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровНаСкладах.Остатки(
     |                &МоментВремени,
     |                Номенклатура В (&СписокНоменклатурыДокумента)
     |                    И Склад = &СкладВДокументе) КАК ОстаткиТоваровНаСкладахОстатки
     |        ПО СписаниеТоваровТовары.Номенклатура = ОстаткиТоваровНаСкладахОстатки.Номенклатура
     |ГДЕ
     |    СписаниеТоваровТовары.Номенклатура.Ссылка = &Ссылка";
     Запрос.УстановитьПараметр("СкладВДокументе", Склад);
     Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("СписокНоменклатурыДокумента", Товары.ВыгрузитьКолонку("Номенклатура"));
Запрос.УстановитьПараметр("Ссылка", Ссылка);
    ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();
        Сообщить("10");
        Сообщить(ВыборкаРезультатаЗапроса.Количество);
        Сообщить (ВыборкаРезультатаЗапроса.КоличествоНаСкладе);
    Пока ВыборкаРезультатаЗапроса.Следующий()   Цикл
            

               Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоНаСкладе = Null, 0, ВыборкаРезультатаЗапроса.КоличествоНаСкладе);
             Сообщить(Остаток);
            
    Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда
                Сообщить("Материала " + СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + "имеется только" + Остаток);
                Отказ = Истина;
                Возврат;  
            КонецЕсли;
            Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.ОстаткиТоваровНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура;
        Движение.Склад = Склад;
        Движение.Количество = ВыборкаРезультатаЗапроса.КоличествоНаСкладе;
    КонецЦикла;

            КонецЦикла;
            Движения.ОстаткиТоваровНаСкладах.Записать();
                    КонецПроцедуры
1 Kris_Tina7252
 
23.01.15
22:39
по отладчику доходит до строки Пока ВыборкаРезультатаЗапроса.Следующий()   Цикл
и сразу перескапивает на  Движения.ОстаткиТоваровНаСкладах.Записать();
2 Fragster
 
гуру
23.01.15
22:41
неправильно. при оперативном перепроведении лажа.

ну и вообще через пердь... null какой-то, цикл в цикле...
3 Kris_Tina7252
 
23.01.15
22:41
+ сообщения
Сообщить(ВыборкаРезультатаЗапроса.Количество);
        Сообщить (ВыборкаРезультатаЗапроса.КоличествоНаСкладе);
просто пустые строки
4 Kris_Tina7252
 
23.01.15
22:42
так мне нужно чтобы и при оперативном и при не оперативном не проводилось если нет товара
5 Fragster
 
гуру
23.01.15
22:42
(3) логично
6 Fragster
 
гуру
23.01.15
22:43
(4) сейчас в тренде - записываешь движения, потом проверяешь, что минусов не получилось...
7 zulu_mix
 
23.01.15
22:45
посмотреть как в типовых сделано не предлагать?
8 Kris_Tina7252
 
23.01.15
22:45
так а лажа хоть в том что в конструкторе запроса напортачила или в остальном??
9 zulu_mix
 
23.01.15
22:45
(6) это транзакция со всеми вытекающими
10 Fragster
 
гуру
23.01.15
22:47
(9) а? дяденька, я же не настоящий сварщик!
11 zulu_mix
 
23.01.15
22:55
(10) ну как словишь нежданчик при мгновенном обмене, так и заваришь
12 Fragster
 
гуру
23.01.15
23:05
(11) а что иль кто есть "мгновенный обмен", советник?
13 Kris_Tina7252
 
23.01.15
23:05
ну я брала за основу пример с другого форума, и там все работает. так у меняж блин слово в слово как там кроме текста из конструктора. вот текст


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

ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();

Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
      Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null,0,ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе);
            Сообщить (Остаток);
                  Если Остаток < ВыборкаРезультатаЗапроса.Кои Тогда
                        Сообщить ("Материала "+ СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) +
                        " имеется только "+ Остаток);
                        Отказ = Истина;
                        Возврат;
                  КонецЕсли;    
       Для Каждого ТекСтрокаНоменклатура Из Номенклатура Цикл
            Движение = Движения.ОстаткиМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура;
            Движение.Склад = Склад;
            Движение.Количество = ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе;
      КонецЦикла;
КонецЦикла;


      Движения.ОстаткиМатериалов.Записать();
      КонецПроцедуры
14 zulu_mix
 
23.01.15
23:07
(12) у всех по разному. некоторые на запись регистров вешают
15 Fragster
 
гуру
23.01.15
23:35
(14) да, есть много способов выстрелить себе в ногу. но подход из (6), например, позволяет переключить на управляемые блокировки вообще без дополнительного кода. а дятлы, которые на подписку у регистра вешают обмен - должны это учитывать.
16 zulu_mix
 
23.01.15
23:41
(15) ты это всегда проверяешь когда работу меняешь?
17 Escander
 
24.01.15
06:52
(6) уже хз как давно так в тренде
18 GANR
 
24.01.15
10:39
(0) Я сразу понимаю, что неправильно:
1. Что за СписаниеТоваровТовары.Номенклатура.Ссылка = &Ссылка? Такой запрос всегда вернет пустой результат, так как параметр Ссылка имеет тип ДокументСсылка.СписаниеТоваров, а фильтруемое поле СписаниеТоваровТовары.Номенклатура.Ссылка - номенклатура.
2. Нет группировки строк документа по номенклатуре с суммированием по полям "Сумма", "Количество", либо проверки на дубли.
19 Kris_Tina7252
 
28.01.15
12:44
если кому интересно
строку
СписаниеТоваровТовары.Номенклатура.Ссылка = &Ссылка";
нужно заменить на
СписаниеТоваровТовары.Ссылка = &Ссылка";
Спасибо  GANR навели на мысль из-за чего ошибка
20 H A D G E H O G s
 
28.01.15
12:50
Никому не интересно
21 Kris_Tina7252
 
28.01.15
12:55
я за вас рада
22 ktvladimir
 
28.01.15
12:59
ну и до кучи если используете единицы измерения и коэффициенты не забудьте пересчитать количество в единицах хранения остатков
23 ktvladimir
 
28.01.15
13:02
Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.ОстаткиТоваровНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура;
        Движение.Склад = Склад;
        Движение.Количество = ВыборкаРезультатаЗапроса.КоличествоНаСкладе;
    КонецЦикла

и вот это совсем непонятно...
те у вас N строк в ТЧ и соответсвенно на каждую запись будет по N движений.. зачем?
24 sapphire
 
28.01.15
13:02
Жуть...
25 ktvladimir
 
28.01.15
13:05
Вместо Возврат ставьте Продолжить
а после завершения цикла
Если Отказ Тогда
Возврат;
КонецЕсли;

иначе будет такая лажа допустим у вас по 3 позициям не хватает остатка. Вы запускаете проведение прогамма Вам выдает, что нет остатка по товару 1 и завершает процедуру. Далее вы исправляете ТЧ нажимаете провести
Программа дает не хватает остатка по товару 2
на N ом сообщении пользователь Вас порвет
26 ktvladimir
 
28.01.15
13:06
Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоНаСкладе = Null, 0, ВыборкаРезультатаЗапроса.КоличествоНаСкладе);
почему сразу в запросе не сделать?
ЕстьNULL(ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоНаСкладе
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн