Имя: Пароль:
1C
1С v8
зависает при выполнении запроса
,
0 I_learn_1c
 
17.08.20
09:55
Доброе утро,

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

Выбирай "Синяя таблетка или красная"
Программист всегда исправляет последнюю ошибку.