Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

зависает при выполнении запроса

зависает при выполнении запроса
Я
   I_learn_1c
 
17.08.20 - 09:55
Доброе утро,

такая ситуация... есть кнопка "заполнить" по ней выполняется запрос и заполняется ТЧ. в запросе и заполнении происходит перебор одного документа за весь текущий год. соответственно чем больше уже создано документов, тем дольше заполнение происходит.

но сейчас вот так получается - под полными правами заполнение происходит за минуту примерно, а без полных прав - висит и всё тут.
сделали тестирование и исправление, сразу после него без полных прав минут за 3-4 заполнилось, а наутро снова висит.. что можно бы сделать? база серверная.
   ДенисЧ
 
1 - 17.08.20 - 09:57
С тебя 5000 евро и я не стану угадывать текст запроса
   I_learn_1c
 
2 - 17.08.20 - 10:15
(1) может есть еще предложения?
   hhhh
 
3 - 17.08.20 - 10:20
(2) переписать запрос
   ДенисЧ
 
4 - 17.08.20 - 10:21
(2) Ты не понял намёка.
Без текста запроса с тобой разговаривать никто не будет
   Lexey_
 
5 - 17.08.20 - 10:21
(2) конечно, я могу за 4900
   ДенисЧ
 
6 - 17.08.20 - 10:21
(5) Штрейбрейхер...
   spiller26
 
7 - 17.08.20 - 10:23
(0) Оно не зависает- оно думает.
(1) Ждать начало следующего года или... уже всё сказали.
   Fedor-1971
 
8 - 17.08.20 - 10:32
(6) так забастовка не объявлена, пока это просто конкурентное формирование цены услуги

Для начала:
- похоже на RLS, твой запрос под обычным пользователем автоматически дополнен условием отбора, что, возможно, сделало выборку неоптимальной
 - проверь возможность ограничить выборку в запросе (сам поставь ограничение, потом влезет RLS)
 - таки проверь код заполнения ТЧ (может там есть куча проверок или Попытка-Исключение)

Дальше будешь думать над индексами и их обновлением
   I_learn_1c
 
9 - 17.08.20 - 10:39
(4) запрос то обычный.. выбор всех документов за год, проведенных и еще несколько условий по полям документа. и потом в цикле перебор. запрос уже давно этот существует, было норм.
в чем может быть отличие при выполнении его под полными правами и без них?
   I_learn_1c
 
10 - 17.08.20 - 10:49
(8) посмотрела.. запрос выполняется по отладке быстро. а вот дальше его результат прогоняется в цикле и в нем да, есть и куча проверок, и еще один цикл внутри первого.. но по смыслу они там нужны.
и если под полными правами это все происходит за минуту, то значит не так все там страшно... как сделать чтобы без полных прав с одинаковой скоростью отрабатывало?
   youalex
 
11 - 17.08.20 - 10:51
А замер производительности что говорит?
   Fedor-1971
 
12 - 17.08.20 - 10:56
(10) предлагаешь угадать код?
Что за на... "Запрос не покажу, Код то же", но "Что делать?" - прямо бессмертный Достоевский

Машины разные? Места хватает? Темп чистый? Может 1С тупо ищет свободное имя для временного файла при наличии массы свободного места на диске С
   H A D G E H O G s
 
13 - 17.08.20 - 10:57
Даже минута - это жестка.
За минуту можно обработать миллионы.
   I_learn_1c
 
14 - 17.08.20 - 10:58
(12) запрос выполняется нормально, дело не в нем.
машина та же, только пользователи разные с полными правами и без них
   I_learn_1c
 
15 - 17.08.20 - 11:05
(12) код не выкладываю потому что не особо типовая конфа, и кусок длинный, собьет только.

(13)минута долго, но в целом устраивает. там перебор строк идет.
получили результат запроса (строк 400).
и предварительно есть ТЗ (строк 1500), каждую строку запроса нужно сравнить со строкой ТЗ, если в ТЗ уже есть данные по этому доку, то обновить строку в ТЗ, если нет, то добавить в ТЗ еще одну строку.
   acht
 
16 - 17.08.20 - 11:07
(12) "Что делать?" - эта таки Чернышевский.
Впрочем его "Кто виноват" вполне подходит.
   acht
 
17 - 17.08.20 - 11:09
(15) Искать обращения через точку в глубоком цикле.
Причем, так как код ты не покажешь - тебе придется делать это самой. Надеюсь, что все получится!
   H A D G E H O G s
 
18 - 17.08.20 - 11:12
(15) за 1 минуту можно сравнить сотни таблиц.
Сотрите этот код и напишите заново.
   I_learn_1c
 
19 - 17.08.20 - 11:25
(17) ну если максимально сократить то долгий кусок вот этот, не знаю поможет ли... этот код на форме документа, на сервере. Объект.Лоты - это ТЧ документа в ней примерно 1500 строк и нужно проверить существующие и обновить некоторые из них или добавить к ним еще.




ИтоговаяТаблица = Документы.ПланЗакупок.СформироватьТаблицуПланаЗакупок(Ложь,Объект.Заказчик, Объект.ПлановыйПериод, Объект.ПлановыйПериодПо, новый Массив, Ложь, Объект.Инновационный, ЛотыПредыдущегоПлана);
Для Каждого СтрокаИТ из ИтоговаяТаблица Цикл
    ДобавитьСтроку = Истина;
    
    Для Каждого СтрокаПлана из Объект.Лоты Цикл            
        
        Если СтрокаПлана.ЛотСсылка.Исходная = СтрокаИТ.ЛотСсылка Тогда//если попытка добавить исходную                                                                 

            ДобавитьСтроку = Ложь;
            Прервать;
            
        ИначеЕсли НЕ СтрокаИТ.Исходная.Пустая() Тогда
            Если СтрокаПлана.ЛотСсылка = СтрокаИТ.Исходная ИЛИ СтрокаПлана.ЛотСсылка.Исходная = СтрокаИТ.Исходная Тогда  
                
                Если СтрокаПлана.ЛотСсылка.Дата < СтрокаИТ.ЛотСсылка.Дата Тогда  //меняем на более новую 

                    ЗаполнитьЗначенияСвойств(СтрокаПлана,СтрокаИТ);
                    ...
                КонецЕсли;
                
                ДобавитьСтроку = Ложь;
                Прервать;
                
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
    
    Если ДобавитьСтроку Тогда
                    
        НоваяСтрока = Объект.Лоты.Добавить();
        ....
    КонецЕсли;
    
КонецЦикла;
   I_learn_1c
 
20 - 17.08.20 - 11:31
(17) беда из-за обращений вроде "СтрокаПлана.ЛотСсылка.Исходная" ? но по смыслу мне же это   нужно...  да тут не идеально, но запросили формирование такое, важно чтобы было сравнение со всеми существующими строками.

минута-две на формирование устроит,все-таки переписывать фиг пойми как код или можно что-то предпринять чтобы формировалось у всех с такой же скоростью как  под полными правами?
   vicof
 
21 - 17.08.20 - 12:09
(20) Установить привилегированный режим. Но лучше переписать гкод.
   Fedor-1971
 
22 - 17.08.20 - 12:13
(20) пробуй не перебирать строки в Объекте, а Объект.Лоты.НайтиСтроки(тут структура для поиска)
Простой перебор не лучший вариант.

Модификация через временную таблицу:
  промТЧ = Объект.Лоты.Выгрузить();
  промТЧ.Колонки.Добавить(""); - то что пытаешься получить через "." выбираем один раз

  Пробегаем циклом и заполняем добавленные колонки

  СтруктураПоиска =  новый Структура("...");
  Для каждого текСтрока из ИтоговаяТаблица цикл
      ЗаполнитьЗначенияСвойств(СтруктураПоиска, текСтрока);

      мас = промТЧ.НайтиСтроки(СтруктураПоиска);
      Если мас.Количество()=0 тогда
          //Добавляем новую строку

          нов = промТЧ.Добавить();
          ЗаполнитьЗначенияСвойств(нов, текСтрока);

      Иначе
          ЗаполнитьЗначенияСвойств(мас[0], текСтрока);// если нашли больше 1 можно поругаться

      КонецЕсли;
  КонецЦикла;

  Объект.Лоты.Очистить();
  Объект.Лоты.Загрузить(промТЧ);

И не нужна простыня кода + задействуются алгоритмы поиска (в самом крайнем случае, простой перебор)

Или запихни свой Объект.Лоты в Запрос, выбери нужные данные и Полным соединением прицепи выборку к таблице запроса Лоты - соединение будет проведено средствами SQL.
Запрос более длинный, но кода минимум.
Выбирай "Синяя таблетка или красная"


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.