Имя: Пароль:
1C
1С v8
v8: Помогите оптимизировать код. Выполнение идет в районе 30 сек
, ,
0 IBTM
 
18.07.11
22:11
перенос слов галимый, как этого избежать, не говорите только что корректировать в ручную, спасибо!
Пример:

   ТаблицаПериодов = Новый ТаблицаЗначений;
   ТаблицаПериодов.Колонки.Добавить("НомерСтроки",                    Новый ОписаниеТипов("Число"));
   ТаблицаПериодов.Колонки.Добавить("Сотрудник",                    Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций"));
   ТаблицаПериодов.Колонки.Добавить("ВидЕжегодногоОтпуска",        Новый ОписаниеТипов("СправочникСсылка.ВидыЕжегодныхОтпусков"));
   ТаблицаПериодов.Колонки.Добавить("ДатаНачала",                    Новый ОписаниеТипов("Дата"));
   ТаблицаПериодов.Колонки.Добавить("ДатаОкончания",                Новый ОписаниеТипов("Дата"));
   ТаблицаПериодов.Колонки.Добавить("ДатаРасчетаПриУвольнении",    Новый ОписаниеТипов("Дата"));
   
       ЗапросВыборкаПоВидамОтпусков = Новый Запрос;
       ЗапросВыборкаПоВидамОтпусков.Текст =
       "ВЫБРАТЬ
       |    ВидыЕжегодныхОтпусков.Ссылка
       |ИЗ
       |    Справочник.ВидыЕжегодныхОтпусков КАК ВидыЕжегодныхОтпусков
       |ГДЕ
       |    (НЕ ВидыЕжегодныхОтпусков.ПометкаУдаления)";
       ВыборкаПоВидамОтпусков = ЗапросВыборкаПоВидамОтпусков.Выполнить().Выбрать();
   
   ДлинаСуток = 86400;
   
   ЗапросСписокСотрудников = Новый Запрос;
   ЗапросСписокСотрудников.УстановитьПараметр("Дата1", ДобавитьМесяц(ПериодРегистрации,-3));
   ЗапросСписокСотрудников.УстановитьПараметр("Дата2", ПериодРегистрации);
   
   ЗапросСписокСотрудников.Текст = "ВЫБРАТЬ
                                   |    ОтражениеЗарплатыВРеглУчетеОсновныеНачисления.Сотрудник КАК Сотрудник
                                   |ИЗ
                                   |    Документ.ОтражениеЗарплатыВРеглУчете.ОсновныеНачисления КАК ОтражениеЗарплатыВРеглУчетеОсновныеНачисления
                                   |ГДЕ
                                   |    ОтражениеЗарплатыВРеглУчетеОсновныеНачисления.Ссылка.ПериодРегистрации >= &Дата1
                                   |    И ОтражениеЗарплатыВРеглУчетеОсновныеНачисления.Ссылка.ПериодРегистрации <= &Дата2
                                   |
                                   |СГРУППИРОВАТЬ ПО
                                   |    ОтражениеЗарплатыВРеглУчетеОсновныеНачисления.Сотрудник
                                   |
                                   |УПОРЯДОЧИТЬ ПО
                                   |    Сотрудник";
                                                                   
   РезультатСписокСотрудников = ЗапросСписокСотрудников.Выполнить().Выбрать();                                
   
   СписокСотрудников.Очистить();
   
   Пока РезультатСписокСотрудников.Следующий() Цикл

   СписокСотрудников.Добавить().Сотрудник = РезультатСписокСотрудников.Сотрудник;
   
   КонецЦикла;

   
   Для Каждого Стр Из СписокСотрудников Цикл
       
           ВыборкаПоВидамОтпусков.Сбросить();
           
           Пока ВыборкаПоВидамОтпусков.Следующий() Цикл
               Строка = ТаблицаПериодов.Добавить();
               Строка.НомерСтроки            = Стр.НомерСтроки;
               Строка.Сотрудник            = Стр.Сотрудник;
               Строка.ВидЕжегодногоОтпуска    = ВыборкаПоВидамОтпусков.Ссылка;
               Строка.ДатаНачала            = КонецМесяца(ПериодРегистрации) + ДлинаСуток;
               Строка.ДатаОкончания        = КонецМесяца(ПериодРегистрации);
               
       Выборка = ПроцедурыУправленияПерсоналом.ПодготовитьДанныеПоРегламентированнымОтпускам(ТаблицаПериодов);
       
       Пока Выборка.Следующий() Цикл        
           
       Если Стр.Сотрудник = Выборка.Сотрудник Тогда
           Стр.ОстатокДнейОтпуска = Выборка.Количество;
       Иначе Стр.ОстатокДнейОтпуска = 0;
           
       КонецЕсли;
       
           КонецЦикла;
           
   КонецЦикла;    
           
   КонецЦикла;


1 IBTM
 
18.07.11
22:13
норм вставился:), вопрос другой... Помогите оптимизировать код. Выполнение идет в районе 30 сек. Может где условие лишнее или цикл, ещё раз спасибо!
2 Лефмихалыч
 
18.07.11
22:14
тебе в прошлой ветке уже объяснили, что надо виртуальными таблицами правильно пользоваться
3 Stim213
 
18.07.11
22:14
офигеть. надо бы еще один вложенный цикл добавить для верности
4 Лефмихалыч
 
18.07.11
22:15
а, или это не ты был?..
5 Ник второй
 
18.07.11
22:18
а в одном запросе не резон ?
6 Лефмихалыч
 
18.07.11
22:21
(5) поциент не знает основ, как он это в одном запросе-то сделает? :)
7 IBTM
 
18.07.11
22:41
(0) это не связанно с прошлой веткой
(3) укажи на ошибочный цикл, я вот смотрю и думаю нафига там Для Каждого...
8 IBTM
 
18.07.11
22:45
(3) предложи свой вариант (или тут клюб юных юмаристов), я вот уже не вижу как Для Каждой строки (две колонки) находить кол-во дней, а затем записать значение в соответствующию колонку строки.
9 Лефмихалыч
 
18.07.11
22:48
(7) у тебя запрос ошибочный. Оба. Нужно использовать левое соединение.
10 IBTM
 
18.07.11
22:49
(5)Выборка - это типовой 1С, результат выходит коректно, но там черт ногу сломит, поэтому я пока пас одним запросом...
11 aleks-id
 
18.07.11
22:51
сделаю за 5 тышш рублей.
12 Лефмихалыч
 
18.07.11
22:51
(10) оба на, а вот и интересное пошло. А запрос значт не типовой 1С?
13 Ник второй
 
18.07.11
22:51
(10) значит мы юмористы
14 Лефмихалыч
 
18.07.11
22:52
а, я понял, это такой тонкий вброс, типа, типовой одинэс - это когда медленно и не то, что надо
15 IBTM
 
18.07.11
22:52
(9) а ты про какие два запроса говориш, что первый и выборка?
16 IBTM
 
18.07.11
22:54
(13) ты точно, да...
(14) не так понел, запрос 1С работает быстро, но его губит мой цикл Для каждого.
17 IBTM
 
18.07.11
22:55
(11) дешёвка...
18 kotletka
 
18.07.11
22:55
два запроса в один свяжи, два - которые черные (может клюшечно понятнее)
19 Лефмихалыч
 
18.07.11
22:56
(15) я про оба твоих запроса. Они тока на растопку годятся. Да и цикл - тоже
20 Ник второй
 
18.07.11
22:59
Как не хватает нового правила для бана: "За тупость" . Ему пытаются помочь, а он рожи нам корчит.
21 IBTM
 
18.07.11
22:59
(18) второй "черный" запрос по хорошему вообще ни как ни связан с первым "черным" и тем более с Выборкой, он нужен толко чтоб заполнить ТЧ, или вы другое видите??? Вся каша варится в Для каждого, но огонёк че-то слабый...
22 IBTM
 
18.07.11
23:01
(21) ты из себя пионера не строй... помогают еденицы!
23 Лефмихалыч
 
18.07.11
23:02
(20) Кодекс запрещает модерировать а такие моменты
(21) твоя задача как-то в одном запросе получить сразу нужную выборку, пофильтрованную, как надо и с нужными полями. Тогда вложенный богопротивный еретический цикл будет не нужен
24 IBTM
 
18.07.11
23:02
(22) это к (20) :(
25 aleks-id
 
18.07.11
23:03
(22) какой то ты хамоватый тип. тебе уже помогли в (9) а ты просишь за тебя запрос написать да еще и огрызаешься
26 Лефмихалыч
 
18.07.11
23:03
(22) а какой помощи ты ожидаешь? Чтобы кто-то написал запрос за тебя?
27 Лефмихалыч
 
18.07.11
23:06
+(26) ну, так и такую помощь предложили в (11), но тока ты ее отверг. Чего ты хочешь, IBTM ?
28 IBTM
 
18.07.11
23:08
(25) уже понел что именно так, но только сейчас (не все так ясна остальным как Вам), я же не проста так продолжаю разговор по ветке.
(26) Нет! (23) в полне достаточно, спасибо! Те кто пытается помоч, их видно...
29 Лефмихалыч
 
18.07.11
23:11
(28) почитай про оператор SELECT от SQL'я. По языку запросов 1С не даром нет мануалов - нет смысла писать про то же самое, про что написано в мануалах по SQL
30 Лефмихалыч
 
18.07.11
23:12
ну, и еще можно покурить том второй ЖКК после (29) - там специфика уже диалекта 1С
31 Господин ПЖ
 
18.07.11
23:39
умеешь ты сервер раком ставить... регл. учет, а отбора по организации нет, если нужно "в целом", то почему по работнику, а не по физ. лицу...
32 Господин ПЖ
 
18.07.11
23:41
>Выполнение идет в районе 30 сек

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