Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Нормальная работа запроса или глюк , Запрос в 1с 7.7 не хочет находить данные          
Kutuzov Подменю пользователя
сообщение 27.08.11, 17:20
Сообщение #1

Оратор
Иконка группы
Группа: Местный
Сообщений: 328
Из: Одесса
Спасибо сказали: 144 раз
Рейтинг: 0

Есть Буха 7.7 немного доработанная, но на далее описанную проблему никак не влияет.
Система Win 7 x32 47046430.gif

Суть проблемы вот в чем.... Есть отчет в котором отрабатывают два запроса. Первый выбирает по указанному контрагенту документы реализация товаров из которых вытягивает данные о партиях.

    "//{{ЗАПРОС(Сформировать)
    |Период с Начдата по КонДата;
    |РасходнаяНакладная = Документ.РасходнаяНакладная.ТекущийДокумент;
    |Фирма = Документ.РасходнаяНакладная.Фирма;
    |Контра = Документ.РасходнаяНакладная.Контрагент;
    |Патриот = Документ.РасходнаяНакладная.Партия;
    |Кво = Документ.РасходнаяНакладная.Кво;
    |Функция СумКво = Сумма(Кво);
    |Группировка Патриот;
    |без Итогов;
    |Условие(Контра в ФКонтр); //Контрагент
    |Условие(Фирма в ФФирма);//Фирма
    |"


После чего записывает эти данные в список значений
              ТЗ.выбратьстроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
        СпПартий.ДобавитьЗначение(ТЗ.Патриот.Док);
    КонецЦикла;


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


Смысл этого запроса в том что бы выдать информацию в отчет по партиям, но суть не в этом...

Суть вот в чем, этот запрос по утверждению клиента проработал 1,5 года и тут свершилось. Вылез один контрагент который не хочет выдавать данные в отчет. Как выяснилось в дальнейшем первый запрос за указанный период находит расходные и вытягивает из них партии (две - то есть данные есть). Потом заходит во второй запрос с этим списком и не находит никаких данных. то есть результат запроса пустая таблица.
Проблема была решена путем указания периода запроса, что не удовлетворило клиента по причине того, что приход может быть и ранее указанного периода (Пришлось убрать).
Как мне казалось, база большая и тянется с 2002 года где-то, и тем самым он не может обработать большое количество строк.
Как я проанализировал, если первый запрос выдает больше 3 строк то второй отрабатывает, а если две строки в первом запросе, тогда второй выдает пустую таблицу.....
Что может помочь в правильной работе запроса и почему он может не отрабатывать при малом количестве строк???? 32000000.gif


Signature
Вы станете богаче, лишь став умнее...
Чем дальше в лес, тем толще партизаны.
Нельзя недооценивать, не предсказуемость тупизны...

kalyamov Подменю пользователя
сообщение 27.08.11, 17:41
Сообщение #2

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 186
Спасибо сказали: 31 раз
Рейтинг: 0

Цитата(Kutuzov @ 27.08.11, 18:20) *
После чего записывает эти данные в список значений
              ТЗ.выбратьстроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
        СпПартий.ДобавитьЗначение(ТЗ.Патриот.Док);
    КонецЦикла;


Как я проанализировал, если первый запрос выдает больше 3 строк то второй отрабатывает, а если две строки в первом запросе, тогда второй выдает пустую таблицу.....
Что может помочь в правильной работе запроса и почему он может не отрабатывать при малом количестве строк???? 32000000.gif


А что там за две строки - такого анализа не было ? Может и строки там пустые? И сразу в список выгрузить нельзя, а если уж цикл, то чего бы на пустые значения не проверить ?

Kutuzov Подменю пользователя
сообщение 27.08.11, 17:53
Сообщение #3

Оратор
Иконка группы
Группа: Местный
Сообщений: 328
Из: Одесса
Спасибо сказали: 144 раз
Рейтинг: 0

Цитата(kalyamov @ 27.08.11, 18:41) *
А что там за две строки - такого анализа не было ? Может и строки там пустые? И сразу в список выгрузить нельзя, а если уж цикл, то чего бы на пустые значения не проверить ?


Проблема именно с запросом №2 так как когда я поставил период выборки запроса так он сразу отработал.
А передаются ссылки на документ прихода. И строки не пустые так как заглядывал в список значений.

Цитата
И сразу в список выгрузить нельзя, а если уж цикл, то чего бы на пустые значения не проверить ?


А зачем?? Если ТЗ пустая то и в список ничего не попадет (В Одессе говорят:"Кто ни купит ничего, тот получит ничего")


Signature
Вы станете богаче, лишь став умнее...
Чем дальше в лес, тем толще партизаны.
Нельзя недооценивать, не предсказуемость тупизны...

kalyamov Подменю пользователя
сообщение 27.08.11, 18:18
Сообщение #4

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 186
Спасибо сказали: 31 раз
Рейтинг: 0

Цитата(Kutuzov @ 27.08.11, 18:53) *
Проблема именно с запросом №2 так как когда я поставил период выборки запроса так он сразу отработал.
А передаются ссылки на документ прихода. И строки не пустые так как заглядывал в список значений.

А зачем?? Если ТЗ пустая то и в список ничего не попадет (В Одессе говорят:"Кто ни купит ничего, тот получит ничего")


С запросами все в порядке, от количества строк в списке исполнение запроса меняться не может. Проблема в данных, которыми Вы оперируете. А выгрузить сразу в список, я имел ввиду - из запроса. Вы сначала выгружаете в ТЗ, а потом перебирая ее выгружаете в список. В этом переборе из Партии добывается еще какой то документ. Где гарантия, что дата этого документа попадает в выбранный период ? Ну или что-то подобное.

Kutuzov Подменю пользователя
сообщение 27.08.11, 18:39
Сообщение #5

Оратор
Иконка группы
Группа: Местный
Сообщений: 328
Из: Одесса
Спасибо сказали: 144 раз
Рейтинг: 0

Цитата(kalyamov @ 27.08.11, 19:18) *
С запросами все в порядке, от количества строк в списке исполнение запроса меняться не может. Проблема в данных, которыми Вы оперируете. А выгрузить сразу в список, я имел ввиду - из запроса. Вы сначала выгружаете в ТЗ, а потом перебирая ее выгружаете в список. В этом переборе из Партии добывается еще какой то документ. Где гарантия, что дата этого документа попадает в выбранный период ? Ну или что-то подобное.


Не из партии ничего ни какой документ не добывается. Партия тут нужна для того что бы из документа приходная вытянуть данные...
Перебора ТЗ нет... просто из ТЗ в список выгружаются данные....

Проблема тут в том что когда ставлю в запросе период то он выбирает данные со списком в 2 строки а когда на ставлю то список должен быть не менее 5 или лучше 10 строк. (Второй запрос или перебирает все документы за 7 лет или за указанный период)

    Перем Запрос, ТекстЗапроса;

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

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


Signature
Вы станете богаче, лишь став умнее...
Чем дальше в лес, тем толще партизаны.
Нельзя недооценивать, не предсказуемость тупизны...

kalyamov Подменю пользователя
сообщение 27.08.11, 19:04
Сообщение #6

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 186
Спасибо сказали: 31 раз
Рейтинг: 0

ТЗ.Выбратьстроки() - это не перебираю ?

"Не из партии ничего ни какой документ не добывается. "
СпПартий.ДобавитьЗначение(ТЗ.Патриот.Док) - Док - это не документ ?

Kutuzov Подменю пользователя
сообщение 27.08.11, 20:25
Сообщение #7

Оратор
Иконка группы
Группа: Местный
Сообщений: 328
Из: Одесса
Спасибо сказали: 144 раз
Рейтинг: 0

Цитата(kalyamov @ 27.08.11, 20:04) *
ТЗ.Выбратьстроки() - это не перебираю ?

"Не из партии ничего ни какой документ не добывается. "
СпПартий.ДобавитьЗначение(ТЗ.Патриот.Док) - Док - это не документ ?


ВыбратьСтроки();
Синтаксис:
ВыбратьСтроки()
Назначение:
Открывает выборку строк таблицы значений. Дальнейшая выборка осуществляется при помощи метода ПолучитьСтроку. - А где тут хоть слово про перебор????

Док - это не документ это ссылка которая потом просто сравнивается при выполнение запроса

Я благодарен за помощь но копание происходит совсем не в том месте....

Запрос №2 нормально отрабатывает когда список значений больше 2-5 записей!!!!!!!! Но когда он маленький то запрос №2 не отрабатывает. Меня интересует работа запроса №2, а не то правильно ли список формируется или нет, так как список формируется в любом варианте правильно.


Signature
Вы станете богаче, лишь став умнее...
Чем дальше в лес, тем толще партизаны.
Нельзя недооценивать, не предсказуемость тупизны...

kalyamov Подменю пользователя
сообщение 27.08.11, 22:42
Сообщение #8

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 186
Спасибо сказали: 31 раз
Рейтинг: 0

Цитата(Kutuzov @ 27.08.11, 21:25) *
ВыбратьСтроки();
Синтаксис:
ВыбратьСтроки()
Назначение:
Открывает выборку строк таблицы значений. Дальнейшая выборка осуществляется при помощи метода ПолучитьСтроку. - А где тут хоть слово про перебор????

Док - это не документ это ссылка которая потом просто сравнивается при выполнение запроса

Я благодарен за помощь но копание происходит совсем не в том месте....

Запрос №2 нормально отрабатывает когда список значений больше 2-5 записей!!!!!!!! Но когда он маленький то запрос №2 не отрабатывает. Меня интересует работа запроса №2, а не то правильно ли список формируется или нет, так как список формируется в любом варианте правильно.


Копайте дальше сами, если Вы не понимаете очевидных вопросов.

Цитата(Kutuzov @ 27.08.11, 21:25) *
Открывает выборку строк таблицы значений. Дальнейшая выборка осуществляется при помощи метода ПолучитьСтроку. - А где тут хоть слово про перебор????

Выбрать и перебрать - разные термины, но суть то одна. Или Вы хотите ткнуть меня носом в невежество ? Запрос при люьрм количестве строк работает одинаково или Вы надеетесь зарегистрировать глюк созданный собственными руками.

СпПартий.ДобавитьЗначение(ТЗ.Патриот.Док);

|ПриходнаяНакладная = Документ.ПриходнаяНакладная.ТекущийДокумент;
|Условие(ПриходнаяНакладная в СпПартий);


"Док - это не документ это ссылка которая потом просто сравнивается при выполнение запроса"

Вы определитесь , что Вы в условие вставляете. Тут и копайте. Других данных Вы не дали.

igmig65 Подменю пользователя
сообщение 28.08.11, 2:21
Сообщение #9

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 614
Из: Донецкая обл
Спасибо сказали: 168 раз
Рейтинг: 140.9

|Функция СумКво = Сумма(Кво);
    |Группировка Патриот;
    |без Итогов;


???????????????
Функция присутствует и без итогов? Помоему это ошибка в самой логике запроса.
Уберите функцию, если итоги ненужны. Если нужны то уберите Без итогов.

g789 Подменю пользователя
сообщение 29.08.11, 16:17
Сообщение #10

Говорящий
***
Группа: Пользователи
Сообщений: 62
Спасибо сказали: 14 раз
Рейтинг: 0

Я бы пробывал как-то так

ПН = СоздатьОбъект("Документ");
Пока ТЗ.ПолучитьСтроку()=1 Цикл
        Пока (СокрЛП(ТЗ.Патриот.Наименование) = "Партия по умолчанию" ) и (ТЗ.НомерСтроки<>0) Цикл
            ТЗ.УдалитьСтроку();
        КонецЦикла;
    КонецЦикла;
ТЗ.выбратьстроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
        Если Док.НайтиДокумент(ТЗ.Патриот.Док)=1Тогда
           СпПартий.ДобавитьЗначение(Док.ТекущийДокумент());
        КонецЕсли
   КонецЦикла;

Kutuzov Подменю пользователя
сообщение 29.08.11, 19:49
Сообщение #11

Оратор
Иконка группы
Группа: Местный
Сообщений: 328
Из: Одесса
Спасибо сказали: 144 раз
Рейтинг: 0

Цитата(g789 @ 29.08.11, 17:17) *
Я бы пробывал как-то так

ПН = СоздатьОбъект("Документ");
Пока ТЗ.ПолучитьСтроку()=1 Цикл
        Пока (СокрЛП(ТЗ.Патриот.Наименование) = "Партия по умолчанию" ) и (ТЗ.НомерСтроки<>0) Цикл
            ТЗ.УдалитьСтроку();
        КонецЦикла;
    КонецЦикла;
ТЗ.выбратьстроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
        Если Док.НайтиДокумент(ТЗ.Патриот.Док)=1Тогда
           СпПартий.ДобавитьЗначение(Док.ТекущийДокумент());
        КонецЕсли
   КонецЦикла;

Я не вижу в этом смысла так как если запрос нашел этот документ значит он есть а лишний раз проверять не стоит...

Я еще раз говорю ЗАПРОС МЕНЯ БЕСПОКОИТ А НЕ СПИСОК ЗНАЧЕНИЙ. Запрос нормально работает при формировании списка больше двух записей, а если вся эта ботва стоит на ХР то он и при двух записях работает....
Короче говоря или базу надо переиндексировать или 7.7 к и...ням закрыть так как она с вин 7 работать нормально не может...\

Тему можно закрывать, так как лезем не в ту степь. ВСЕМ Спасибо


Signature
Вы станете богаче, лишь став умнее...
Чем дальше в лес, тем толще партизаны.
Нельзя недооценивать, не предсказуемость тупизны...

kalyamov Подменю пользователя
сообщение 29.08.11, 19:56
Сообщение #12

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 186
Спасибо сказали: 31 раз
Рейтинг: 0

Наздоровье. "на ХР то он и при двух записях работает...." - это надо было утаивать для эффектного завершения ? Про win 7 - те базы, которые трудно перевести с 7.7 на 8, на такой ОС не работают. Хотелось еще добавить по существу, да правила не позволяют.

logist Подменю пользователя
сообщение 29.08.11, 19:59
Сообщение #13

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Предчувствую не нужный треп, поэтому по просьбе автора тему закрываю.


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Тема закрыта Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 05.06.24, 0:45
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!