Имя: Пароль:
1C
1С v8
Запрос в КД по 7ке
0 ejiki
 
22.09.14
10:20
Не пойму что не так передаю в параметре. Передаю параметрами Дату и МПЗ, С датой работало все прекрасно. Вот с МПЗ что-то не так. Передаю ссылку на элемент справочника. В 7ке дуб дубом. Может кто подскажет где я накосячил?



        ТаблицаМПЗПоПартиям = Параметры.ПараметрыАлгоритмов.Получить("ТаблицаМПЗПоПартиям");
        Если ПустоеЗначение(ТаблицаМПЗПоПартиям) = 0 Тогда
            ТаблицаМПЗПоПартиям.ВыбратьСтроки();
            
            Пока ТаблицаМПЗПоПартиям.ПолучитьСтроку()=1 Цикл
                
            Запрос = СоздатьОбъект("Запрос");
    
            ТекстЗапроса =
            "//{{ЗАПРОС(Сформировать)
            |Период с ДатаОстатков по ДатаОстатков;
            |МПЗ = Регистр.МестаХранения.МПЗ;
            |ВидМПЗ = Регистр.МестаХранения.ВидМПЗ;
            |МестоХранения = Регистр.МестаХранения.МестоХранения;        
            |Количество = Регистр.Партии.Количество;
            |Функция КоличествоКонОст = КонОст(Количество);
            |Группировка МестоХранения без групп;            
            |Группировка МПЗ без групп;        
            |Условие(ВидМПЗ = ТекВидМПЗ);
            |Условие(МПЗ = ТекМПЗ);        
            |";//}}ЗАПРОС
        
            ТекМПЗ = ТаблицаМПЗПоПартиям.Номенклатура;
            ДатаОстатков = Параметры.ДатаВводаОстатков;
            Сообщить("" + ТекМПЗ + " выгружен!");
            
            Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
                Сообщить("Не удалось выполнить запрос по складам МПЗ !");
            КонецЕсли;
            
            //Проверям результаты по запросу
            Сообщить("МПЗ = " + Запрос.МПЗ);
            Сообщить("ВидМПЗ = " + Запрос.ВидМПЗ);
            Сообщить("МестоХранения = " + Запрос.МестоХранения);
            Сообщить("Количество = " + Запрос.Количество);
            Сообщить("КоличествоКонОст = " + Запрос.КоличествоКонОст);
            
            Пока Запрос.Группировка(1) = 1 Цикл
                Пока Запрос.Группировка(2) = 1 Цикл
                    Если Запрос.КоличествоКонОст <= 0 Тогда
                        Продолжить;
                    КонецЕсли;
                    Если ПустоеЗначение(Запрос.МПЗ)=0 ТОгда
                        Если Запрос.МПЗ.Вид() = "Материалы" Тогда
                            Если Запрос.МПЗ.СубСчет<>СчетУчета Тогда
                                Продолжить;
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;



В результате естественно не ныряет в цикл по группировкам.

На что следует обратить внимание? Параметр ТекМПЗ я получаю запросом ранее.
1 ДенисЧ
 
22.09.14
10:21
На предыдущий запрос обрати внимание...
2 ejiki
 
22.09.14
10:22
(1) Поясни? Типы одинаковые у элемнта из 1го запроса и у текущего
3 ejiki
 
22.09.14
10:23
К тому же в Сообщить() выдает все правильно.
4 ejiki
 
22.09.14
10:29
Выручайте, есть идеи хоть какие-то?!?!
5 GreyK
 
22.09.14
10:41
(4) Расчитай Регистр.МестаХранения на ДатаОстатков и получай из него сводныйостаток. Запросы в цикле замучаешься ждать.

По запросу один вопрос: Почему у тебя условие "Если Запрос.МПЗ.Вид() = "Материалы" Тогда Если Запрос.МПЗ.СубСчет<>СчетУчета Тогда" проверяется до запроса!? Зачем выполнять запрос, если ты и до него можешь проверить эти параметры? Почему просто не выгрузить из ТаблицаМПЗПоПартиям все МПЗ в список, проверить список на соответствие отбору, а потом сделать один запрос по всем отобранным МПЗ?
6 ДенисЧ
 
22.09.14
10:45
(2) покажи запрос предыдущий
7 ejiki
 
22.09.14
10:50
(6)



//приходуем сразу на нужный склад
        Запрос = СоздатьОбъект("Запрос");
    
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Период с ДатаОстатков по ДатаОстатков;
        |МПЗ = Регистр.Партии.МПЗ;
        |ВидМПЗ = Регистр.Партии.ВидМПЗ;
        |Качество = Регистр.Партии.Качество;
        |Количество = Регистр.Партии.Количество;
        |Сумма = Регистр.Партии.Сумма;
        |Функция КоличествоКонОст = КонОст(Количество);
        |Функция СуммаКонОст = КонОст(Сумма);
        |Группировка МПЗ без групп;
        |Условие(ВидМПЗ = ТекВидМПЗ);
        |";//}}ЗАПРОС
            
        ДатаОстатков = Параметры.ДатаВводаОстатков;
    
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Сообщить("Не удалось выполнить запрос по партиям !");
        КонецЕсли;
    
        Пока Запрос.Группировка(1) = 1 Цикл
                Если Запрос.КоличествоКонОст <= 0 Тогда
                    Продолжить;
                КонецЕсли;
                Если ПустоеЗначение(Запрос.МПЗ)=0 ТОгда
                    Если Запрос.МПЗ.Вид() = "Материалы" Тогда
                        Если Запрос.МПЗ.СубСчет<>СчетУчета Тогда
                            Продолжить;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
                
                // Заполнение полей Номенклатура
                ТабТовары.НоваяСтрока();
                ТабТовары.Номенклатура = Запрос.МПЗ;
                ТабТовары.Количество = Запрос.КоличествоКонОст;
                ТабТовары.Сумма = Запрос.СуммаКонОст;
                Если Запрос.КоличествоКонОст<>0 Тогда
                    ТабТовары.Цена = Окр(ТабТовары.Сумма/ТабТовары.Количество,2,1);
                КонецЕсли;
                Сообщить("Выгрузили По Партиям "+Запрос.МПЗ+" ОК");
                
            Если ТабТовары.КоличествоСтрок()>0 Тогда
                Параметры.ПараметрыАлгоритмов.Установить("ТаблицаМПЗПоПартиям",ТабТовары);

8 ejiki
 
22.09.14
10:51
(5) Если бы было достаточно информации то и не заморачивался. просто в Местах хранения не ведется сумовой учет, а мне нужны остатки по скаладам и в количественном и в сумовом выражении.
9 GreyK
 
22.09.14
11:18
(8) Примерно так:
СписокМпз = создатьОбъект("СписокЗначений");            
ТаблицаМПЗПоПартиям.ВыбратьСтроки();
Пока ТаблицаМПЗПоПартиям.ПолучитьСтроку()=1 Цикл
Если ТаблицаМПЗПоПартиям.Номенклатура.Вид() = "Материалы" Тогда
Если ТаблицаМПЗПоПартиям.Номенклатура.СубСчет = СчетУчета  Тогда// Можно добавить ещё кучу условий
СписокМпз.ДобавитьЗначение(ТаблицаМПЗПоПартиям.Номенклатура);
КонецЕсли;

КонецЕсли;
КонецЦикла;
                
            Запрос = СоздатьОбъект("Запрос");
    
            ТекстЗапроса =
            "//{{ЗАПРОС(Сформировать)
            |Период с ДатаОстатков по ДатаОстатков;
            |МПЗ = Регистр.МестаХранения.МПЗ;
            |ВидМПЗ = Регистр.МестаХранения.ВидМПЗ;
            |МестоХранения = Регистр.МестаХранения.МестоХранения;        
            |Количество = Регистр.Партии.Количество;
            |Функция КоличествоКонОст = КонОст(Количество);
            |Группировка МестоХранения без групп;            
            |Группировка МПЗ без групп;        
            |Условие(ВидМПЗ = ТекВидМПЗ);
            |Условие(МПЗ в СписокМпз);        
            |";//}}ЗАПРОС


           Пока Запрос.Группировка(1) = 1 Цикл
                Пока Запрос.Группировка(2) = 1 Цикл
                    Если Запрос.КоличествоКонОст <= 0 Тогда
                        Продолжить;
                    КонецЕсли;
                    ТСтрока = 0;
                    ТаблицаМПЗПоПартиям.НайтиЗначение(Запрос.МПЗ,ТСтрока,"Номенклатура");
                    Цена = ТаблицаМПЗПоПартиям.ПолучитьЗначение(ТСтрока,"Цена");
10 ejiki
 
22.09.14
11:21
(9) Идея классная, возьму на заметку. Просто мне сейчас главное не красота. А главное собрать данные. Не могу понять почему запрос ничего не выдет и в какую сторону рыть..
11 ejiki
 
22.09.14
11:22
(9) Т.е. в цикл

Пока Запрос.Группировка(1) = 1 Цикл
                Пока Запрос.Группировка(2) = 1 Цикл

вообще ни одной ного не заходит. Не понимаю где нагрешил я тут.
12 ejiki
 
22.09.14
11:24
Кажется нашел. Сейчас проверю и отпишусь ;)
13 ejiki
 
22.09.14
11:35
Действительно. В самом первом запросе я пытался получить данные по двум регистрам. А когда изменил ход мыслей и переделал на 2а запроса то первый из первого не удалил запись по другому регистру. Теперь все работает и выводит как надо) единственное что не удобно так это то что Запрос в Запросе)) ну да ладно. Мб позже разберусь как делать запрос сразу по двум регистрам.
2 + 2 = 3.9999999999999999999999999999999...