Имя: Пароль:
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.
Запрос более длинный, но кода минимум.

Выбирай "Синяя таблетка или красная"
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший