Имя: Пароль:
1C
1C 7.7
v7: долго отрабатывает спр...Записать()
0 e-9
 
19.08.14
16:22
Добрался теперь вот до приказа об увольнении...
При проведении, док тупит; включил замер производительности - 95% из 2,5 секунд жрет строка "СпрСотрудники.Записать();". При этом, куча других мест в системе, где запись в справочник Сотрудники выполняется малые доли секунды...В чем может быть дело???
Перед командой записи - две строки, непосредственно что-то меняющих в текущей записи справочника:
//переносим в папку Уволенные и делаем ссылку на приказ об увольнении
СпрСотрудники.Родитель = ПапкаУволенных;
СпрСотрудники.ПриказОбУвольнении =ТекущийДокумент() ;

- может, это смена родителя такая тормозная???
1 Chum
 
19.08.14
16:24
попробуй транзакции использовать в этом месте
2 e-9
 
19.08.14
16:28
(1) а имеет смысл? ведь строка исполняется ровно один раз
3 e-9
 
19.08.14
16:29
(1) попробовал, все ж - не, не помогло
4 aka AMIGO
 
19.08.14
16:33
хм.. кода нет.. а точно нет в коде цикла?
5 e-9
 
19.08.14
16:34
точно) могу хоть код, хоть результаты замера скинуть
6 e-9
 
19.08.14
16:36
Процедура ОбработкаПроведения()    
    ПризнакДок=1;
    // Процедура выполняется при проведении документа расчета
    Если Начало<>ДатаУвольнения Тогда
        Сообщить("Неверная дата, документ не проведен!");
        СтатусВозврата(0);Возврат;
    КонецЕсли;
    СпрСотрудники.ВыбратьЭлементы();
    СпрСотрудники.НайтиЭлемент(ПапкаУволенных);
    Если СпрСотрудники.Выбран()=0 Тогда
        Сообщить("Не найдена папка уволенных сотрудников! Увольнение невозможно!");
    Иначе
        Если ВнутрСовмещение.Выбран()=1 Тогда
            // увольнение внутреннего совместителя
            ВС = СоздатьОбъект("Справочник.ВнутренниеСовместители");
            ВС.НайтиЭлемент(ВнутрСовмещение);
            Если ВС.Выбран()=1 Тогда
                ВС.ПриказОбУвольнении=ТекущийДокумент();
                ВС.Записать();
                Эл=ВС.ТекущийЭлемент();
            Иначе
                Сообщить("Сотрудник не найден! Увольнение невозможно!");
                Возврат ;
            КонецЕсли;
        Иначе
            // обычного сотрудника
            ЖрнЗарплата.ВыбратьЗаписиПоОбъекту(Сотрудник,Начало+1,ЖрнЗарплата.КонецТекущегоПериода());
            СпрСотрудники.НайтиЭлемент(Сотрудник);
                Если СпрСотрудники.Выбран()=1 Тогда
                    Если ОткрытыеСотры.НайтиЗначение(Сотрудник)>0  Тогда
                        Предупреждение("Закройте форму сотрудника "+Сотрудник);
                        СтатусВозврата(0);Возврат ;
                    КонецЕсли;
                    Эл=СпрСотрудники.ТекущийЭлемент();
                    СпрСотрудники.Родитель = ПапкаУволенных;
                    СпрСотрудники.ПриказОбУвольнении =ТекущийДокумент();
                    СпрСотрудники.Записать();
7 e-9
 
19.08.14
16:37
(6) ну и, в результате замера вижу, что выполняется строка ровно один раз
8 Zamestas
 
19.08.14
16:42
(3) ОбработкаПроведения() - она и так в транзакции идет.
А сколько элементов в справочнике Сотрудники?
9 e-9
 
19.08.14
16:44
(8) э...подскажите - как НЕ программно узнать количество записей в справочнике?:)
10 aka AMIGO
 
19.08.14
16:47
может так:
Эл=СпрСотрудники.ТекущийЭлемент();
Эл.Родитель = ПапкаУволенных;
Эл.ПриказОбУвольнении =ТекущийДокумент();
Эл.Записать();

хотя.. мало верится..
извини, если что не так..
11 e-9
 
19.08.14
16:47
(8) программно - 1020 элементов
(10) сча попробую
12 e-9
 
19.08.14
16:49
(10) не, сразу вываливает "Объект не может быть перепозиционирован!"
13 Zamestas
 
19.08.14
16:49
(9) По коду упорядочить и внизу списка без иерархии прикинуть соответствует макс.номер кол-ву или нет.
+ ты точно уверен, что именно СпрСотрудники.Записать(); тупит?
14 Злопчинский
 
19.08.14
16:50
Подряд две строки
.
    СпрСотрудники.ВыбратьЭлементы();
    СпрСотрудники.НайтиЭлемент(ПапкаУволенных);
.
"смысла" не имеют.
дальше пока не смотрел..
поэтому неудивительно, что "тормозит" где-то...
15 Злопчинский
 
19.08.14
16:53
Логика имхо хромает
.
//увольнение внутреннего совместителя
Иначе
                Сообщить("Сотрудник не найден! Увольнение невозможно!");
                Возврат ;
            КонецЕсли;
.
возврат идет со статусом=1.
документ проведется.
если документ провелся - то нафига грузить пользователя инфой что что-то не найдено если при этом все считается успешно законченным...?
16 aka AMIGO
 
19.08.14
16:55
17 Злопчинский
 
19.08.14
16:55
Зачем в МОДУЛЕ ПРОВЕДЕНИЯ лишний раз дергать базу, выполняя Спр.Выбран()..?
Если сам по себе метод НайтиЭлемент УЖЕ сообщает - выбран элемент в результате поиска или нет...?
.
НайтиЭлемент(<?>)
Синтаксис:
НайтиЭлемент(<Элемент>)
Назначение:
Найти элемент справочника по значению.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
18 Злопчинский
 
19.08.14
16:59
По идее спр.Записать() должно проскакивать очень быстро.
19 e-9
 
19.08.14
17:06
(14)(и далее) ковыряю то, что досталось в наследство (заодно изучаю платформу)
(14) - да, работает и без ВыбратьЭлементы()
(15) - вообще, на предприятии не используется внутреннее совместительство как явление - так что я на этот кусок пока даже не смотрю
(17) ага-а...буду везде править, спс!
(18) и тем не менее....
(16) ща гляну
20 Zamestas
 
19.08.14
17:07
(18) Я о чем - может у него в справочнике реквизитов под сотню?
21 Злопчинский
 
19.08.14
17:09
А если попробовать запись без переноса в папку уволенных - быстро сработает?
22 Злопчинский
 
19.08.14
17:10
(20) ну... по идее перенос в другую папку может влять на индекс перестраивается сильно?
23 Serginio1
 
19.08.14
17:10
Вместо

СпрСотрудники.ВыбратьЭлементы();
    СпрСотрудники.НайтиЭлемент(ПапкаУволенных);
    Если СпрСотрудники.Выбран()=0 Тогда

Просто
Если ПапкаУволенных.Выбран()=0 Тогда
24 e-9
 
19.08.14
17:11
(16) да там просто о переносе/копировании. А не о проблемах:)
(20) 40 реквизитов
(21) также долго....
25 e-9
 
19.08.14
17:12
(24)->(21) ой..я пробовал простой перенос, не программный, в папку "Уволенные" - вот он также долго, как и программный, отрабатывает.
26 Злопчинский
 
19.08.14
17:12
в свое время тоже всякие неактивные товары/клиенты "переносили" в отдельные папки. потом отказались. выставляется в карточке клиента/товара флажок типа активный/неактивный и все - это "выгоднее" - сохраняется старая иерархия справочника. а понять что сотрудник уволен или нет - особенно когда справочник в режиме отключенной иерархии - фиг поймешь, флажок/пипка красная в форме списка - более информативная.
.
27 e-9
 
19.08.14
17:13
(21) да, без переноса в папку Уволенные быстро отрабатывает. А при переносе, даже интерактивном - тормоза!
28 Serginio1
 
19.08.14
17:14
(27) Значит проблема с индексами
29 Злопчинский
 
19.08.14
17:14
(24) тогда в первую очередь доступными средствами
1. бэкап.
выгрузка базы
2. загрузка базы.
3. на всякий полное удаление индексных файлов (если файловая база)
3. полный ТИИ.
30 Zamestas
 
19.08.14
17:15
(28) Тоже думаю на индексы.
31 e-9
 
19.08.14
17:15
(26) собственно, я в предыдущей, не 1с-вской, своей практике тоже никогда не встречался с таким приемом - и сначала даже решил, что это плод воспаленного мозга предыдущего прогера. А потом прочитал в руководстве к типовой конфе, что так и делается, в 1с....
32 Злопчинский
 
19.08.14
17:15
можно попробовать просто - если база файловая - прибить файл индексов соответсвующего справочника и запуститься монопольно - перестроит индекс с нуля.
33 Злопчинский
 
19.08.14
17:16
(31) хз что там у тебя за конфига.
. в той же бух 7.7 в папку уволенных можно переноситьтради красторы. уволен/не уволен - значение реквизита "трудовые отношения установлены/трудовые отношения прекращены"
34 e-9
 
19.08.14
17:21
(33) изначально, в 2006-м, это был ЗиК - но с тех пор кто только над ним не издевался.
(32) а как узнать, какой файл является индексом конкретно для справочника Сотрудники???
35 ДенисЧ
 
19.08.14
17:23
(34) *.DD файл
36 e-9
 
19.08.14
17:25
(35) т.е., если Name = SC2, то надо прибить SC2.CDX?
37 e-9
 
19.08.14
17:40
простое удаление индекса не помогло
так что пробую (пока на тестовой, в случае успеха повторю на боевой) полное ТИИ (поставил и валю домой - уже знаю, что это оооооочень надолго...)
38 Злопчинский
 
19.08.14
17:59
(34) ну так может нехрен изобретать лисапеды, а перейти на типовую ЗиК? - продам квалифицированного бухгалтера/расчетчицу, может работать по удаленке.
39 hhhh
 
19.08.14
18:12
(37) может там Процедура ПриЗаписи есть?
40 Злой Бобр
 
19.08.14
22:15
(6) Никогда не используйте *.Выбран(). Пользуйте ПустоеЗначение().

*.НайтиЭлемент() всегда помещайте в условие.
Если *.НайтиЭлемент(*)>0 Тогда
...

Нафейхуа вам этот код совсем неясно:
ЖрнЗарплата.ВыбратьЗаписиПоОбъекту(Сотрудник,Начало+1,ЖрнЗарплата.КонецТекущегоПериода());

Смотрите в реквизитах справочника неопределенный тип, строка с неограниченной длиной и т.п. Именно из-за такой кривизны рук потом и возникают проблемы с перестроением индексов.

Совет отказаться от папки уволенных абсолютно верный. Даже и добавить нет чего.
41 akaBrr
 
19.08.14
23:24
(40) Никогда не используйте *.Выбран(). Пользуйте ПустоеЗначение().  - прям таки никогда?
42 Злой Бобр
 
19.08.14
23:49
(41) Да, лучше сразу приучить себя к этому. Что б потом незаморачиваться. Лично я отвыкал пару месяцев, но зато потом никаких проблем невозникало.
Ну это перечислил то что по памяти вспомнил. Уже отвык от 1С. Так что даже и непомню что за баг был с Выбран(). Но думаю кому интересно то найдут описание, благо на форумах обсасывалось не раз.
43 Salimbek
 
20.08.14
00:47
(42) Выбран() формирует обращение к базе и происходит выборка всех реквизитов объекта. ПустоеЗначение() тупо проверяет ссылку на "пустоту".
44 FN
 
20.08.14
01:17
если есть уверенность в отсутствии битых ссылок можно и пустое значение ис
45 FN
 
20.08.14
01:18
использовать. в противном случае выбран
46 AlexWolf
 
20.08.14
01:28
...ВыбратьЭлементы/НайтиЭлемент/Выбран - как говорит тс, отладчик явно указывает на Записать().
(6) что-то не видно откуда взялась переменная СпрСотрудники.
(39) в таком варианте ПриЗаписи не работает.
Возможно ПриказОбУвольнении - периодический реквизит (в текущей конфе ЗиК такого реквизита на сотрудниках нет, как нет и справочника "ВнутренниеСовместители").
47 AlexWolf
 
20.08.14
01:46
+(46) и все таки начинать надо с того места, где объявлена переменная СпрСотрудники. Если там есть ИспользоватьДату, то начнется перезапись всех периодических реквизитов выбранного элемента. Если куча периодики на справочнике, то уже без разницы ПриказОбУвольнении периодический или нет.
Для проверки можно попробовать сделать так:
  Эл=СпрСотрудники.ТекущийЭлемент();
  //СпрСотрудники.Родитель = ПапкаУволенных;
  //СпрСотрудники.ПриказОбУвольнении =ТекущийДокумент();
  СпрСотрудники.Записать();
Изменится скорость или нет.
48 ivsher
 
20.08.14
10:32
А выложите ка из DD файла кусок, что касается справочника сотрудники. Уж больно хочется посмотреть на индексы, которые у вас настроены...
49 e-9
 
20.08.14
13:30
не знаю, отработало ли ТИИ, запущенное в 16:40, до конца - на 21:30 сработало автовыключение компа (ступил, не выключил задание). Но проблема не исчезла - и данные в справочнике Сотрудники изрядно покорежило. Хорошо, что тестовая...
(38) а наши бухи и расчетчицы куда пойдут, вагоны грузить?:) (да и я, кстати:)) - тут программисты нужны только для 1С, а валить обратно в столицы не вариант, по семейным).
[Но, вообще-то, вынашиваю наполеоновские планы с НГ-2015 перейти на типовые - только на 8.3. Не знаю, насколько эти планы реальны.Пока просто осваиваю.]
(39) нету
(40) пороюсь, спс. (А от папки Уволенные будет трудно избавится - вся логика на то заточена; как я понимаю, это вообще от типовой осталось)
(40-45) откуда, вообще, может взяться 100% уверенность в отсутствии (не сейчас, так в будущем) битых ссылок???
(47) после раздела процедур:
СпрСотрудники = СоздатьОбъект("Справочник.Сотрудники");
а насчет изменения скорости - см. (27)
ПриказОбУвольнении - нет, не периодический реквизит
(48)
#===============================================================================
#==TABLE no 53     : Справочник Сотрудники
# Name    |Descr                         |Type[A/S/U]|DBTableName|ReUsable  
T=SC2     |Справочник Сотрудники         |A          |SC2        |1        
#-----Fields-------
# Name      |Descr               |Type|Length|Precision
F=ID        |ID object           |C   |9     |0        
F=PARENTID  |ID parent obj       |C   |9     |0        
F=CODE      |object code         |C   |4     |0        
F=DESCR     |object description  |C   |40    |0        
F=ISFOLDER  |Flag - Is Line - Fol|N   |1     |0        
F=ISMARK    |Flag Object is Marke|C   |1     |0        
F=VERSTAMP  |Version stamp       |C   |6     |0        
F=SP450     |(P)Аванс            |N   |11    |2        
F=SP2301    |(P)Военнослужащий   |N   |2     |0        
F=SP1364    |(P)ВозвратПН        |N   |13    |2        
F=SP3823    |(P)ДатаП            |D   |8     |0        
F=SP468     |(P)ДатаРождения     |D   |8     |0        
F=SP1588    |(P)ДатаСправки      |D   |8     |0        
F=SP1082    |(P)ДатаСтажаДляВыслу|D   |8     |0        
F=SP1570    |(P)ДатьЛьготы       |C   |9     |0        
F=SP3162    |(P)карточка         |N   |2     |0        
F=SP788     |(P)КоличествоАкций  |N   |7     |0        
F=SP640     |(P)ОплачиватьПитание|C   |9     |0        
F=SP641     |(P)ОплачиватьПроезд |C   |9     |0        
F=SP1437    |(P)ПриказОбУвольнени|C   |9     |0        
F=SP1436    |(P)ПриказОприеме    |C   |13    |0        
F=SP1243    |(P)ПроцентЕжемесПрем|N   |7     |1        
F=SP1883    |(P)СправкаНаНачРасч |C   |9     |0        
F=SP1884    |(P)СправкаСПрМестаР |C   |9     |0        
F=SP2360    |(P)ХО               |C   |9     |0        
F=SP4505    |(P)ОтпКонтракт      |N   |3     |0        
F=SP4506    |(P)Отпуск30Дней     |N   |2     |0        
#----Indexes------
# Name     |Descr         |Unique|Indexed fields                                              |DBName    
I=IDD      |of ID         |0     |ID                                                          |IDD        
I=PCODE    |of PARENT and |0     |PARENTID,ISFOLDER,CODE(UPPER)                               |PCODE      
I=PDESCR   |of PARENT and |0     |PARENTID,ISFOLDER,DESCR(UPPER)                              |PDESCR    
I=CODE     |of CODE       |0     |CODE(UPPER)                                                 |CODE      
I=DESCR    |of DESCR      |0     |DESCR(UPPER)                                                |DESCR      
#
#===============================================================================
50 ivsher
 
20.08.14
13:50
Никаких реквизитов с признаком отбор и сортировка у вас нет. Только стандартные индексы по Наименованию и Код. Я, честно говоря, предполагал, что у вас возможно в справочнике существует очень длинный индекс (более 120 символов). Предположение не подтвердилось ). Очень странная проблема, надо конкретно на базе ,точнее на копии :), смотреть что к чему. Удачи Вам. Как поборете отпишитесь. Интересно узнать в чем все же проблема долгой записи.
51 e-9
 
20.08.14
18:03
странная - не то слово
Кстати, перевосстановление из бэкапа, сделанного без индексных файлов, не то чтобы совсем не помогло...Замер производительности теперь показывает 0,2-0,28 сек (97-98%) на строку спр..Записать() - на порядок лучше, чем вчера.
Однако, чисто по субъективным ощущениям - функционал все же отрабатывает около 2 секунд: открываю приказ об увольнении, заполняю реквизиты (Сотрудник, Дата, Основание) - иду в отладчик, включаю замер производительности, возвращаюсь в предприятие, жму Провести и тут же - Закрыть. Так вот - на нажатие Закрыть реакция происходит через медленное "раз-и-два-и". Но в замере производительности - чуть более 0,2 секунд, на эту строку....
Такие дела.
Спасибо всем сердечное за науку и участие! - может, когда поменьше непосредственных девелоперских задач будет, вернусь к теме...
52 Злопчинский
 
20.08.14
18:04
(51) ну я ж тебе писал выше - перегенерить индексные файлы с нуля...
53 Злой Бобр
 
20.08.14
19:19
(51) Ну в (52) вариант неплохой. Убей *.cdx справочника и запусти монопольно. Потом померяй.
Ну и ТИИ всетаки сделай.
54 Torquader
 
21.08.14
00:11
А код случайно не в пределах подчинения ?
Потому что восстанавливаться будет индекс по коду и наименованию.
55 DrZombi
 
гуру
21.08.14
07:26
(6) Перепиши все на Регистры сведений :)
56 DrZombi
 
гуру
21.08.14
07:27
Это 7-ка... вот зря же убили секцию :(
57 ivsher
 
21.08.14
10:31
(54) Так в том то и дело что справочник не подчинен никому.
см. внимательно (49). Там нет поля PARENTEXT.
58 Torquader
 
23.08.14
21:21
(57) PARENTID есть - значит - есть иерархия - и при переносе проверяется уникальность, чтоб им пусто было.
59 Злопчинский
 
25.08.14
15:07
(58) так может поставить вместо "уникальность внтри групп" исправить на "уникальност по справочнику"...?
60 e-9
 
26.08.14
11:43
(59) э...а где это сделать? Вижу галку "Контроль уникальности", вижу группу "Серии кодов", в которой выбрано "Во всем справочнике"
https://yadi.sk/i/kNyajZiFaRwdH
61 Ёпрст
 
26.08.14
11:50
(0)
зачет!

Процедура ОбработкаПроведения()    

    СпрСотрудники.ВыбратьЭлементы();


и пусть весь мир подождёт, пока это чудо будет проводить свой документ, теперь справочник заблокирован целиком этой строчкой
62 e-9
 
26.08.14
11:51
(61) Ёпрст, где ты был, когда весь форум топтался по этой строчке и моему самолюбию?! не тормози, прочитай сначала все целиком
63 Serginio1
 
27.08.14
10:38
(62) смотри (23)
64 Ёпрст
 
27.08.14
10:40
(62) лень читать всё целиком..
а вообще, писать что-то в модуле проведения - моветон, особенно, так бездумно
Независимо от того, куда вы едете — это в гору и против ветра!