Имя: Пароль:
1C
1C 7.7
v7: Тормозит при записи номенклатуры
,
0 geniusbsd
 
19.09.21
08:09
Добрый День 1С77 ТИС база SQL тормозит при записи элемента справочника Номенклатура, при создании нового элемента или при редактировании старого. Раньше все работало нормально  в чем может быть проблема?
1 trdm
 
19.09.21
08:58
Отладчик?
2 Калиостро
 
19.09.21
10:19
(0) Вставили при записи контроль на уникальность наименования или реквизита?
3 Злопчинский
 
19.09.21
12:06
Что меняли в типом по номенклатуре? Если есть возможность - перенумеровать штнтно все карточки.
4 серый КТУЛХУ
 
19.09.21
12:45
что говорит замер производительности?
5 geniusbsd
 
19.09.21
14:32
Ни каких изменений не было
Отладчиком не получается найти функцию которая тормозит
6 Джордж1
 
19.09.21
14:38
Не может сработать автонумерация как вариант
7 acanta
 
19.09.21
14:42
А что можно сделать с авто нумерацией? Кроме префикса по дате?
8 acanta
 
19.09.21
14:44
Фоновым заданием максимальный номер в константу записали, а дальше что?
9 серый КТУЛХУ
 
19.09.21
14:48
(8): в семерке нет фоновых заданий
(5): ещё раз, по слогам: (4)
10 acanta
 
19.09.21
14:52
В 7ке может быть постоянно запущен один сеанс и по расписанию запускаться обработка. Или расписание может быть в виндоус, открывается 7ка, что то выполняется при начале работы системы и закрывается. В эти минуты тоже может тормозить.
11 Джордж1
 
19.09.21
15:01
(7)не, при проблемах с автонумерацией - там симптомы - не открывается форма элемента при вводе нового элемента
12 Злопчинский
 
19.09.21
16:06
Присоединюсь к (4)
13 geniusbsd
 
19.09.21
18:33
(12) Простите за глупый вопрос как сделать замер производительности?
14 Джордж1
 
19.09.21
18:45
(13)в отладчике запустить отладку
15 geniusbsd
 
19.09.21
18:57
Глобальный модуль                            1018    Пока ЦеныТовара.ПолучитьЭлемент()  = 1 Цикл                         501987    87.613492    96.92
Справочник.Номенклатура.ФормаСписка.ФормаСписка    64    Цена = глВернутьЦену(ТекущийЭлемент(), ТипыЦен.ПолучитьЗначение(2));    20    36.643302    40.54
Справочник.Номенклатура.ФормаСписка.ФормаСписка    66    Цена = глВернутьЦену(ТекущийЭлемент(), ТипыЦен.ПолучитьЗначение(4));    20    35.400506    39.16
Справочник.Номенклатура.ФормаСписка.ФормаСписка    119    Цена = глВернутьЦену(ТекущийЭлемент(), ТипЦены);                    4    17.700777    19.58

Вот как то так
16 acanta
 
19.09.21
19:14
Четыре колонки с разными видами цен в форме списка? Мечта менеджера..
17 Ёпрст
 
19.09.21
19:16
(15) вот это непотребность перепиши по-человечьи и будет мгновенное открытие
18 geniusbsd
 
19.09.21
19:38
Так проблема не в открытии формы списка Номенклатуры, а в записи элемента
вот процедура  вернуть цену

Функция глВернутьЦену(Товар, КатегорияЦены) Экспорт
    Перем ЦеныТовара;
    Перем Результат;
    
    ЦеныТовара = СоздатьОбъект("Справочник.Цены");
    ЦеныТовара.ИспользоватьВладельца(Товар);
    ЦеныТовара.ВыбратьЭлементы();
    Пока ЦеныТовара.ПолучитьЭлемент()  = 1 Цикл
        Если ЦеныТовара.ПометкаУдаления() = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        Если ЦеныТовара.КатегорияЦены = КатегорияЦены Тогда
            Результат = ЦеныТовара.ТекущийЭлемент();
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции
19 HawkEye
 
19.09.21
19:54
(18) гениальный ход, особенно для вызова из общего списка... кто делал?
20 Злопчинский
 
19.09.21
20:10
(18) в типовой такого кода нет. Накорябали кривыми ручками вот и тормозит.
21 Злопчинский
 
19.09.21
20:14
Хотя, сорян...
Судя по коду глВернутьЦену это редакция 8.7
И что там делается при записи карточки - надо глядеть отдельно в связи с древностью конфиги.
Хотя вот сейчас клиента делаю няшки как раз на такую конфигу - тормозов не замечал
22 Злопчинский
 
19.09.21
20:17
ГлВернутьЦену можно ускорить. Исползовав Спр.ВыбратьЭлементыПоРеквизиту и сразу спозицион роваться вместо перебора. Но для единичной карточки номенклатуры это некритично будет.
Это так... Попутно
23 acanta
 
19.09.21
20:20
Для этого требуется галочка отбор по реквизиту, в типовой не было.
24 HawkEye
 
19.09.21
20:24
(20) код то типовой, просто он не вызывается из списка справочника 4 раза на строку.....
25 geniusbsd
 
19.09.21
20:26
База УРБД  на SQL, на ней рабтает 5 лет сеть магазинов 10 торговых точек.  тормозов не было, началось буквально месяц назад. изменений в конфигурации ни кто не делал. Размер базы около 30Гб
26 acanta
 
19.09.21
20:29
Элементарно, была база с пятью позициями номенклатуры и максимум тремя типами цен и еще одной себестоимости. Документооборот может быть даже очень большой и магазинов много. И вот добавили что либо, как у всех..
27 Злопчинский
 
19.09.21
20:30
(23) неправильно. Упомянутая галка требуется для интерактивной установки отбора. А так достаточно только галки сортировка.
28 geniusbsd
 
19.09.21
20:31
(24) еще раз говорю в списке проблем нет
29 Злопчинский
 
19.09.21
20:32
(25) проведи полный цикл обмена и пр нудительно почисть таблицу 1сапдейтс
30 Злопчинский
 
19.09.21
20:33
(28) ещё раз п.4
31 HawkEye
 
19.09.21
20:34
(28) так если ты все знаешь, зачем тему создал?))

If there's something strange,
In your neighborhood
Who you gonna call?
Ghostbusters!
32 geniusbsd
 
19.09.21
20:49
(29) А что это даст проблема не только в периферийной базе но и в центральной.
33 geniusbsd
 
19.09.21
20:50
(31) наверное потому что я не смог найти ответ на свой вопрс
34 ДенисЧ
 
19.09.21
20:55
"тормозов не было, началось буквально месяц назад"

А не пробовали индексы перестроить, статистику обновить?
35 geniusbsd
 
19.09.21
21:01
(34) запускал хранимую прцедуру 1sp_DBReindex
36 Ёпрст
 
19.09.21
21:17
Ну открой наконец, жуколов, создай элемент, нажми на замер, запиши элемент, нажми на замер ышо раз.
Сымотри стек вызовов
Хотя бы
37 Ёпрст
 
19.09.21
21:18
Ну и профайлер можно натравить, хотя.. это лишнее
38 geniusbsd
 
19.09.21
21:34
(36)
Глобальный модуль    1018    Пока ЦеныТовара.ПолучитьЭлемент()  = 1 Цикл    501981    85.191610    51.78
Справочник.Номенклатура.Форма    1328    глЗаписьПериодическихРеквизитов(Контекст);    // добавляем небходимые закладки    1    76.893254    46.74
Глобальный модуль    952    ОткрытьФормуМодально("Обработка.ЗаписьПериодическихРеквизитов", Параметр);    1    76.893231    46.74
Справочник.Номенклатура.ФормаСписка.ФормаСписка    66    Цена = глВернутьЦену(ТекущийЭлемент(), ТипыЦен.ПолучитьЗначение(4));    20    35.653820    21.67
Справочник.Номенклатура.ФормаСписка.ФормаСписка    64    Цена = глВернутьЦену(ТекущийЭлемент(), ТипыЦен.ПолучитьЗначение(2));    20    34.497887    20.97
Справочник.Номенклатура.ФормаСписка.ФормаСписка    119    Цена = глВернутьЦену(ТекущийЭлемент(), ТипЦены);    4    17.144227    10.42
Глобальный модуль    1019    Если ЦеныТовара.ПометкаУдаления() = 1 Тогда    501967    1.525526    0.93
39 Джордж1
 
19.09.21
21:36
Надо в процедуре глВернутьЦену - поставить условие на пустое значение Товар

Сейчас похоже при поиске цен - весь справочник перебирается и так 4 раза
40 Ёпрст
 
20.09.21
10:18
(38) понятно. У тебя не запись тормозит, а пересчетв форме списка справочника, в котором 500к элементов перебираются каждый раз, еще и мегатормоз периодика.
Заремь в форме списка строки получения цены  Цена = глВернутьЦену и проверб, что всё полетело.
41 Mikeware
 
20.09.21
10:55
+(40) который выполняется после записи элемента...
------------
раз базы SQL - я б посоветовал переписать на прямой запрос, и не трахать мозг. Это быстрее всего.
42 SiAl-chel
 
20.09.21
11:06
(18), (38) Отстой. Если нет возможности использовать прямые запросы, через 1C++ или ToySQL, то хотя бы вместо выборки элементов надо использовать стандартный (черный) запрос - это в разы должно ускорить получение цены. Ну и конечно использование индексов. Владелец - это уже индексированное поле.
43 Mikeware
 
20.09.21
11:35
(42) он по владельцу и отбирает.
44 SiAl-chel
 
20.09.21
11:53
(43) Кроме владельца нужен еще отбор по категории цены. Читай внимательно. Ты не выспался что ли?
45 Mikeware
 
20.09.21
12:02
(44) индекс по владельцу и другому реквизиту - создается, если галку "сортировка" поставят. Если бы поставили - тогда и отбирали бы ВыбратьЭлементыПоРеквизиту. Раз выбирают просто так - значит, и отборы не стоят, значит и индексов нет.
46 SiAl-chel
 
20.09.21
12:05
(45) ВыбратьЭлементы и ВыбратьЭлементыПоРеквизиту - зло. Нужно использовать черный запрос. Я это уже сказал выше. А чтобы запрос ускорился, тогда и надо включать сортировку. Так что не понимаю причину дискуссии.
47 Mikeware
 
20.09.21
12:10
(46) Вот! ключевые слова "я не понимаю". Что и требовалось доказать
48 серый КТУЛХУ
 
20.09.21
12:11
(47): ну человек не понимает - как это черный запрос может работать медленнее... ну бывает...
49 Bigbro
 
20.09.21
12:16
зачем полмиллиона цен лопатятся? я тоже не понимаю.
52 SiAl-chel
 
20.09.21
12:29
(49) Во-во.
(48) Ты докажешь, что полмиллионная выборка будет работать быстрее черного запроса? Черный запрос при трансляции вообще-то WHERE накладывает, а выборка в каких случаях накаладывает?.
56 Ёпрст
 
20.09.21
13:20
(52) Если это выборка по реквизиту, то быстрее
57 SiAl-chel
 
20.09.21
13:22
(56) Если включена сортировка, то черный запрос с отбором по этой сортировке все равно будет также работать или быстрее, чем объектная выборка.
58 Ёпрст
 
20.09.21
13:24
(57) не быстрее.
59 SiAl-chel
 
20.09.21
13:27
(57) У меня на 150 тысячах записей работало быстрее. Так что слово против слова. Да и спецы 1С на ИТС в рекомендациях не советовали использовать объектную выборку там, где можно использовать черный запрос. Хотя и то, и другое прямым запросам проигрывают в разы.
60 Ёпрст
 
20.09.21
13:33
(59) Ну вот сразу видно, что ты их не писал.
ВыбратьЭлементыПоРеквизиту, как и НайтиПоРеквизиту делает запрос по индексированному полю, и никак ты это не ускоришь, даже переписав на прямой запрос.
Ну разве что, использовав свой самодельный покрывающий индекс.
61 серый КТУЛХУ
 
20.09.21
13:33
не быстрее.
так что два слова против слова.
62 Ёпрст
 
20.09.21
13:33
Ну и всяко, чорный запрос проиграет этой конструкции
63 HawkEye
 
20.09.21
13:49
(33) так если ты сам не смог найти, имеет смысл послушать, что тебе другие говорят?
могу повторить: проблема не в записи, а в отображении списка...
64 Злопчинский
 
20.09.21
17:18
(63) тогда пусть тс простестирует открытие редактирование и закрытие карточки не из списка а напрямую
65 Злопчинский
 
20.09.21
17:21
(39) и на то что товар не группа?
66 Джордж1
 
20.09.21
17:26
(63)Ну автор же написал что проблема только при создании элемента - при чем тут список вообще
67 Злопчинский
 
20.09.21
17:31
(66) не, перечитай
68 Джордж1
 
20.09.21
17:44
ОткрытьФормуМодально("Обработка.ЗаписьПериодическихРеквизитов", Параметр);    1    76.893231    46.74

тогда вот это надо смотреть еще

А я вот не помню - разве в типовых в списке для для всех строк функции отрабатывают. как минимум кэширование должно быть

Но функция показа остатков в форме списков вроде есть в ТиС - и включается галочкой
69 серый КТУЛХУ
 
20.09.21
17:57
(68): никакого кэширования.
слева-направо сверху-вниз по всем видимым строкам
70 серый КТУЛХУ
 
20.09.21
17:58
(кэширование каждый может сам-сам-сам сделать штатными средствами, не проблема - но тут не тот случай)
71 Джордж1
 
20.09.21
17:59
(69)если именно по ВИДИМЫМ - то ничего страшного
72 серый КТУЛХУ
 
20.09.21
18:00
(71): на самом деле - страшно. ибо тормозит нещадно.
73 Джордж1
 
20.09.21
18:01
(72)это если работать со списком без групп, с группами не так страшно
74 Злопчинский
 
20.09.21
18:42
(73) какая разница? Обсчитываются выводимые на экран.
75 Джордж1
 
20.09.21
18:51
(73)ну на экран весь справочник не влезет

Пока ЦеныТовара.ПолучитьЭлемент()  = 1 Цикл    501981    85.191610    51.78

вот здесь 501981 - это же количество итераций? явно оно не при выводе на экран отрабатывает - это и заметили бы сразу

Что там может происходить того при записи существующего элемента справочника - непонятно
76 серый КТУЛХУ
 
20.09.21
20:45
(75): и у тебя даже не закрадывается подозрение, что 501981 штука - это тупое перелопачивание всего справочника при ошибочном указании владельца и/или без явной установки работы в режиме иерархии?..
77 Джордж1
 
20.09.21
20:51
(76)так я сразу написал это в (39)

Непонятно как такое может быть для уже созданного элемента?
78 Злопчинский
 
20.09.21
20:55
(77) да хз, когда-то полного не приведено
79 DrZombi
 
гуру
21.09.21
06:06
(0) Поздравляю, переходите на прямые запросы :)
80 SiAl-chel
 
21.09.21
08:06
(61) Два так два. Мой опыт 8 лет назад на комплексной клюшке на сиквеле в 15 гектар показал, что функция, показывающая текущую среднюю себестоимость в списке номенклатуры из несколько десятков тысяч элементов, после переписывания с выборки на черный запрос ускорилась в 2,5 раза. Заказ был разовый, поэтому клиент отказался от внедрения прямых запросов.
81 dmrjan
 
21.09.21
10:00
В MSSQL на чтение возникает блокировка на строку, но когда данных много, то это может увеличивать стоимость запроса в MSSQL. В PostgreSQL другая проблема - несмотря на отсутствие блокировок на чтение, там при каждом обращении в цикле может возникать новая временная таблица. И так и так плохо.
82 Злопчинский
 
21.09.21
10:24
https://infostart.ru/1c/articles/76287/
Может пригодится
83 Злопчинский
 
21.09.21
10:25
(80) а что ты там переписал в списке "из выборки на чорный запрос"?
Закон Брукера: Даже маленькая практика стоит большой теории.