Имя: Пароль:
1C
1C 7.7
v7: Не правильно работает запрос
0 vadim777
 
01.06.16
13:28
Древняя конфа АБТ, отчет Взаиморасчеты. Текст запроса:
Если ДатаПо>=ПолучитьДатуТА() Тогда
  ДатаПо=ПолучитьДатуТА();
КонецЕсли;
Пер = "";
Если Не(ДатаПо=0) Тогда
  Пер=Пер+" По ДатаПо;";
Иначе
  Пер=Пер+";";
КонецЕсли;
    
ТекстЗапроса =
"//{{ЗАПРОС(Взаиморасчеты)
|Период с ДатаС" + Пер + "
|Клиент = Регистр.Взаиморасчеты.Клиент;
|ВалВз = Регистр.Взаиморасчеты.Клиент.ВалютаВзаиморасчетов;
|СуммаГРН = Регистр.Взаиморасчеты.СуммаВал;
|СуммаВал = Регистр.Взаиморасчеты.СуммаОсн;
|СуммаНДС = Регистр.Взаиморасчеты.СуммаНДС;
|Условие(Клиент в ВыбКлиент);
|Группировка ВалВз;
|Группировка Клиент;
|Функция НачГРН = НачОст(СуммаГРН);
|Функция НачНДС = НачОст(СуммаНДС);
|Функция НачВал = НачОст(СуммаВал);

|Функция РасхГРН = Расход(СуммаГРН);
|Функция РасхНДС = Расход(СуммаНДС);
|Функция РасхВал = Расход(СуммаВал);

|Функция ПрихГРН = Приход(СуммаГРН);
|Функция ПрихНДС = Приход(СуммаНДС);
|Функция ПрихВал = Приход(СуммаВал);

|Функция КонГРН = КонОст(СуммаГРН);
|Функция КонВал = КонОст(СуммаВал);
|Функция КонНДС = КонОст(СуммаНДС);
|"//}}ЗАПРОС
;
С мая 2016 никаких движений не было.
Период отчета: с 01.05.2016 по 05.05.2016.
Если в диалоге отчета не задавать Клиента, то отчет пуст.
Если задать Клиента, то по нему будут начальные и конечные остатки, без движения, что правильно.
Почему этого нет по всем клиентам?
1 ДенисЧ
 
01.06.16
13:30
Проверяй пустоту клиента и убирай условие из текста...
2 пипец
 
01.06.16
13:31
|Условие(Клиент в ВыбКлиент);
группировка валюты нафига ?
3 vadim777
 
01.06.16
13:31
(1) Убирал - то же самое.
4 vadim777
 
01.06.16
13:32
(2) у клиентов разная валюта взаиморасчетов.
5 Amra
 
01.06.16
13:32
(3) "Не верю"
6 пипец
 
01.06.16
13:33
группировка валюты первая ))) еще раз группировка валюты нафига ?
7 пипец
 
01.06.16
13:33
(4) ичо ? это реквизит клиента у тя в данном случае а не регистра
8 vadim777
 
01.06.16
13:34
ПС: если ДатаС берется достаточно глубоко назад, то начинают появляться строки отчета. Причем чем глубже назад ДатаС - тем больше строк отчета.
9 vadim777
 
01.06.16
13:36
(6)(7) как оправдание - это не мой отчет, стандартный. Обратил внимание, что врет он. Ты думаешь, что в этом причина? Счас попробую без валюты...
10 vadim777
 
01.06.16
13:39
Убрал группировку по валюте - все то-же самое. Даже с учетом (8).
11 пипец
 
01.06.16
13:40
ну не знаю кто так писАл и когда ))) но убрать группировку по валюте и убрать условие по клиенту и показать как выводит - де цикл то ?
12 vadim777
 
01.06.16
13:43
Вот текст вывода:
//!Пока Запрос.Группировка("ВалВз") = 1 Цикл
        Пока Запрос.Группировка("Клиент") = 1 Цикл
            Если Запрос.Клиент.ЭтоГруппа() = 1 Тогда
                Если ТолькоОстатки = Да Тогда
                    Таб.ВывестиСекцию("Группа|База");
                    Таб.ПрисоединитьСекцию("Группа|Остаток");
                Иначе
                    Таб.ВывестиСекцию("Группа");
                КонецЕсли;
                Оживить(1);
                Продолжить;
            КонецЕсли;
    
            ЗаписатьПерем();
            Если (Режим="Свод") Тогда
                Если (Отбор = Перечисление.ВариантыВзаиморасчетов.НамДолжны) и (Число(КонГРН)>0) Тогда
                    Продолжить;
                КонецЕсли;
                Если (Отбор = Перечисление.ВариантыВзаиморасчетов.МыДолжны) и (Число(КонГРН)<0)  Тогда
                    Продолжить;
                   КонецЕсли;
            КонецЕсли;
               Валюта = ?(вВал = 1,Запрос.Клиент.ВалютаВзаиморасчетов.Кратко,Константа.ОсновнаяВалюта.Кратко);
            Если ТолькоОстатки = Да Тогда
                Таб.ВывестиСекцию("Клиент|База");
                Таб.ПрисоединитьСекцию("Клиент|Остаток");
            Иначе
                Таб.ВывестиСекцию("Клиент");
            КонецЕсли;
            Оживить(1);
    
            Если Режим = "Свод" Тогда
                Продолжить; // Если свод, так он уже есть...
            КонецЕсли;
    
            Пока Запрос.Группировка("Заказ") = 1 Цикл
                ЗаписатьПерем();
                Если (Отбор = Перечисление.ВариантыВзаиморасчетов.НамДолжны) и (Число(КонГРН)>0) Тогда
                    Продолжить;
                КонецЕсли;
                Если (Отбор = Перечисление.ВариантыВзаиморасчетов.МыДолжны) и (Число(КонГРН)<0)  Тогда
                    Продолжить;
                   КонецЕсли;
                Если ТолькоОстатки = Да Тогда
                    Таб.ВывестиСекцию("Заказ|База");
                    Таб.ПрисоединитьСекцию("Заказ|Остаток");
                Иначе
                    Таб.ВывестиСекцию("Заказ");
                КонецЕсли;
                Оживить(1);
    
                Если Режим = "Заказы" Тогда
                    Продолжить;
                КонецЕсли;
    
                Пока Запрос.Группировка("Док") = 1 Цикл
                        Если Запрос.Док.Выбран() = 0 Тогда
                            Продолжить;
                        КонецЕсли;
    
                        ПрихГРН = ФРМВал(Запрос.ПрихГРН, Запрос.Клиент.ВалютаВзаиморасчетов);
                        ПрихВал = ФРМВал(Запрос.ПрихВал, Константа.ОсновнаяВалюта);
                        ПрихНДС = ФРМВал(Запрос.ПрихНДС, Запрос.Клиент.ВалютаВзаиморасчетов);
    
                        РасхГРН = ФРМВал(Запрос.РасхГРН, Запрос.Клиент.ВалютаВзаиморасчетов);
                        РасхВал = ФРМВал(Запрос.РасхВал, Константа.ОсновнаяВалюта);
                        РасхНДС = ФРМВал(Запрос.РасхНДС, Запрос.Клиент.ВалютаВзаиморасчетов);
    
                        Если сНДС = 1 Тогда
                            Прих = ПрихГРН + "
                            |" + ПрихНДС;
                            Расх = РасхГРН + "
                            |" + РасхНДС;
                        ИначеЕсли вВал = 1 Тогда
                            Прих = ПрихГРН;
                            Расх = РасхГРН;
                        иначе
                            Прих = ПрихВал;
                            Расх = РасхВал;
                        КонецЕсли;
    
                        Таб.ВывестиСекцию("Движение");
                        Оживить(1);
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
        Если ( ( ВыбКлиент.ЭтоГруппа() = 1 ) или ( ПустоеЗначение(ВыбКлиент) = 1 ) ) и ( вВал = 1 ) Тогда
            ЗаписатьПерем();
            Если ТолькоОстатки = Да Тогда
                Таб.ВывестиСекцию("ИтогоПоВал|База");
                Таб.ПрисоединитьСекцию("ИтогоПоВал|Остаток");
            Иначе
                Таб.ВывестиСекцию("ИтогоПоВал");
            КонецЕсли;
        КонецЕсли;
    //!КонецЦикла;

В отладчике видно, что в цикл по самой первой группировке не входит. То есть результат запроса пустой.
13 пипец
 
01.06.16
13:45
жесть ))))
14 vadim777
 
01.06.16
13:51
(13)Да вот и правда жесть. Сравниваю с подобным запросом из ТиС, здесь все правильно работает:

ТекстЗапроса =
        "//{{ЗАПРОС(КредитыПокупатели)                  
        |ПЕРИОД С Дата1 По Дата2;
        |Контрагент     = Регистр.ВзаиморасчетыПокупателей.Контрагент,         Регистр.ВзаиморасчетыПоставщиков.Контрагент;
        |Договор     = Регистр.ВзаиморасчетыПокупателей.Договор,         Регистр.ВзаиморасчетыПоставщиков.Договор;
        |Докум         = Регистр.ВзаиморасчетыПокупателей.ТекущийДокумент, Регистр.ВзаиморасчетыПоставщиков.ТекущийДокумент;
        |Фирма          = Регистр.ВзаиморасчетыПокупателей.Фирма,             Регистр.ВзаиморасчетыПоставщиков.Фирма;
        |СтавкаНДС     = Регистр.ВзаиморасчетыПокупателей.СтавкаНДС,         Регистр.ВзаиморасчетыПоставщиков.СтавкаНДС;
        |ДолгПокуп     = Регистр.ВзаиморасчетыПокупателей.Долг;
        |ДолгПост     = Регистр.ВзаиморасчетыПоставщиков.Долг;
        |КодОперации = Регистр.ВзаиморасчетыПокупателей.КодОперации;
        |Условие (Фирма=ВыбФирма);
        |Группировка Контрагент упорядочить по Контрагент.Наименование;";
        
    Если ДеталПоСтавкамНДС<>0 Тогда    
        ТекстЗапроса = ТекстЗапроса + "Группировка СтавкаНДС;";
    КонецЕсли;
    Если ДеталПоДоговорам<>0 Тогда    
        ТекстЗапроса = ТекстЗапроса + "Группировка Договор;";
    КонецЕсли;
    Если ДеталПоВсемДокументам<>0 Тогда    
        ТекстЗапроса = ТекстЗапроса + "Группировка Докум;";    
    КонецЕсли;
        
    ТекстЗапроса = ТекстЗапроса + "    
        |Функция НачДолг = НачОст(ДолгПокуп);
        |Функция КонДолг = КонОст(ДолгПокуп);
        
        |Функция РасхДолг = Расход(ДолгПокуп);
        |Функция ПрихДолг = Приход(ДолгПокуп);
        
        |Функция НачДолгПост = НачОст(ДолгПост);
        |Функция КонДолгПост = КонОст(ДолгПост);
        
        |Функция РасхДолгПост = Расход(ДолгПост);
        |Функция ПрихДолгПост = Приход(ДолгПост);
        |"//}}ЗАПРОС
        ;
15 Ёпрст
 
01.06.16
13:56
(0) пересчитай итоги, и базу переиндексируй.
16 vadim777
 
01.06.16
13:58
(15) на копии базы уже делается ТИИ, вторые сутки идут.
17 Ёпрст
 
01.06.16
14:08
(16) не надо делать ТиИ.
18 Ёпрст
 
01.06.16
14:09
Прерви и сделай (15).
19 Ёпрст
 
01.06.16
14:09
Итоги, можно и по одному регистру пересчитать, который , еще поди и не закрытый.
20 vadim777
 
01.06.16
14:31
(18) Прервал. В диалоге ТИИ оставил только галки Реиндексация и Пересчет итогов.
21 Злопчинский
 
01.06.16
14:35
(20) ну, на бесхозных базах - пересчет итогов обычно самая длительная операция - есть шанс не дождаться
22 Ёпрст
 
01.06.16
14:35
(20) нет.
23 Ёпрст
 
01.06.16
14:37
Прерви, удали все cdx из каталога базы, зайди монопольно и ТА взад-вперёд подвигай.

+ открой словарик, найди название своего регистра и огласи размер табличек RA и RG от этого регистра.
При желании, можно штатно пересчитать итоги только по этому регистру.
24 trdm
 
01.06.16
15:20
(23) > При желании, можно штатно пересчитать итоги только по этому регистру.

На dbf? Как?
25 Злопчинский
 
01.06.16
15:22
(24) в полпинка.
существующие регистры скидываем в бэкап. удаляем все регистры кроме нужного для пересчета. далее как обычно. после завершения пересчета - из бэкапа возвращаем взад
26 vadim777
 
01.06.16
15:34
(23) Удалил cdx, индексы сейчас восстанавливаются.
Регистр Взаиморасчеты: RG1060 - 8089 Кб, RA1060 - 4907 Кб.
27 Злопчинский
 
01.06.16
15:36
(26) незакрытый регистр.
28 trdm
 
01.06.16
15:40
(25) елки-палки.... я дятел..
29 trdm
 
01.06.16
15:41
Вот что значит тупеть на фиксах.
30 vadim777
 
01.06.16
15:44
(23) Все! Итоги есть по всем клиентам.
А теперь можно разжевать - что все это значит?
31 Mikeware
 
01.06.16
15:44
(28) чойто сразу вспомнился никулин из "бриллиантовой руки", как он себя по голове гипсом...
32 Mikeware
 
01.06.16
15:45
(30) пересчет итогов...
33 trdm
 
01.06.16
15:47
(30) Плановые технические работы - необходимость.
Если работают 2 разных релиза с БД могут таким образом накуралесить. Постарайся, что-бы с БД работал только 1 релиз 1С-а.
34 Mikeware
 
01.06.16
15:53
(33) не всегда они необходимы в такой форме...
и релизы куролесят в основном с журналом расчетов и бухгалтерией. механизм регистров самый стабильный.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.