Имя: Пароль:
1C
 
Оптимизация обращений к реквизитам объектов через точку
0 ИС-2
 
naïve
27.12.17
13:40
В базе сделана куча проверок, где идет обращение к реквизитам через точку.
Например, Заказ.Договор.Владелец.ИНН

Это съедает скорость работы. Одна проверка через такое обращение занимает 38%.

Вопрос. Как это можно оптимизировать? Переводить на запросы - долго и не факт, что даст скорость работы.

1) Написание общей функции повторного использования, которая делает обращение к промежуточным данным (чтобы минимизировать вероятность получения устаревших данных). Примерно так:
ПовтИсп.ЗначениеРеквизита(Заказ,"Договор.Владелец").ИНН

есть еще какие-то варианты?
1 SergeyKB
 
27.12.17
13:43
переделывание на формат БСП
ЗначениеРеквизитаОбъекта и подобные функции
2 ildary
 
27.12.17
13:59
(1) а ЗначениеРеквизитаОбъекта() умеет получать данные через точку?
3 triviumfan
 
27.12.17
14:11
1) предварительно получить все необходимые реквизиты перед проверками;
2) перейти на табличную модель получения данных, т.к. у тебя наверняка обращения к составным типам присутствуют (вижу "Владелец" в примере), что влечёт за собой избыточные внутренние соединения;
3) 38% - это данные замера производительности? Может проблема в конкретной строчке кода, где идёт обращение к реквизитам составного поля?
4 Tateossian
 
27.12.17
14:25
(0) Можно укоротить разыменование:

Заказ.Договор.Владелец.ИНН -> Заказ.Контрагент.ИНН
:)

Если все проверки примерно по такой схеме, как ты написал, можно предложить сделать универсальную функцию, что-то вроде СтруктураШапкиДокумента и там держать все необходимые реквизиты. Не думаю, что прямо особых случаев много.

Есть еще вариант, но слегка костыльный - все проверяемые реквизиты прописать в объекте Критерии отбора - он очень быстро работает и лишних чтений не будет, но немножко станет толще база.
5 RomaH
 
naïve
27.12.17
14:25
"Переводить на запросы - долго и не факт, что даст скорость работы."

скорость работы даст в любом случае

чтобы минимизировать вероятность получения устаревших данных - хранить на время вызова - насколько я понимаю это аналогично запросу
6 triviumfan
 
27.12.17
14:35
Если предположить, что многие данные уже храняться в оперативной памяти, то с вероятностью 146% можно сделать вывод, что причина падения производительности в одной из строк рукоблудного кода :)
7 ИТ директор
 
27.12.17
14:39
(0) посмотри на картинку у меня в профиле, это результат работы 1С-ников таких как ты
8 H A D G E H O G s
 
27.12.17
14:45
(7) Милота то какая.
9 Kigo_Kigo
 
27.12.17
14:46
А я вот знаю про что ТС-говорить, это регистры покупатели и поставщики? туда не пишется контрагент, а только договор, оптимизировать получится только добавив контрагента в регистр, прописать его туда в модулях проведения доков, свернуть базу, оставшиеся доки перевровести, тугие отчеты переписать, точнее дописать выборки по контрагенты
10 H A D G E H O G s
 
27.12.17
14:47
(9) дикость какая.
11 Asmody
 
27.12.17
14:48
(7) Руки-то целы?
12 Asmody
 
27.12.17
14:49
(0) Закешировать. Способов вагон.
13 Kigo_Kigo
 
27.12.17
14:53
(10) Всмысле?
14 H A D G E H O G s
 
27.12.17
14:59
(13) Нет ничего страшного прицепить через точку Владельца Договора.
15 Kigo_Kigo
 
27.12.17
15:01
(14) при больших объемах, иногда до 60% времени сжирает Владелец()
16 vicof
 
27.12.17
15:05
Заказ.Договор.Владелец.ИНН

Почему не проверять ИНН перед записью контрагента?
17 Shrek_yar
 
27.12.17
15:11
(1) что за формат БСП? ЗначениеРеквизитаОбъекта и подобные функции
о_О
18 ildary
 
27.12.17
15:14
(17) ЗначениеРеквизитаОбъекта() - это БСП-шная функция.
19 Ботаник Гарден Меран
 
27.12.17
15:22
Определиться с составом реквизитов. При первом обращении к объекту получить запросом все нужные реквизиты. Кэшировать. Все последующие обращения по объекту брать из кэша.
20 ИТ директор
 
27.12.17
15:24
(19) А если данные изменятся, т.е. кэш протухнет?
21 Ботаник Гарден Меран
 
27.12.17
15:27
(20)
Есть такая проблема. Только вчера в УХ ответственных лиц через модуль повторного использования получал. Заполнил регистр и долго втыкал, почему пусто в отчете.
Зависит от продолжительности проверки.
22 Zamestas
 
27.12.17
15:27
(0) Запросами не?
23 Dmitrii
 
гуру
27.12.17
15:27
(0) Для таких целей в модуле ОбщегоНазначения есть целая кучка функций:
ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь)
ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь)
ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов, ВыбратьРазрешенные = Ложь)
ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь)


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

Если подходить глобально, то верно написано в (19). Но для этого надо значительно больше переписать кода.
24 ИТ директор
 
27.12.17
15:33
(23) Если подходить глобально, то надо делать рефакторинг метаданных или денормализацию, например забубенивать всякие регистры сведений с нужными разрезами. Но это уже если исправления кривых запросов не поможет.
25 hhhh
 
27.12.17
15:36
(19) всё уже закэшировано до нас. Вы и правда думаете, что платформа у себя не кэширует?
26 Dmitrii
 
гуру
27.12.17
15:37
(24) Такой глобальный пересмотр методики учета для большинства типовых просто нереален. Или будет означать отказ от дальнейшего обновления от поставщика.
27 Ботаник Гарден Меран
 
27.12.17
15:38
(25)
Кэш через три точки? Ну может быть, у меня таких точных познаний нет.
(24)
Будет тормозить на записи регистров сведений с нужными разрезами.
28 Fragster
 
гуру
27.12.17
15:39
(7) запрос-то выполнился?
29 ИТ директор
 
27.12.17
15:40
(26) Типовые от 1С и не нуждаются в подобной переделке, т.к. спроектированы по большей части хорошо. В отличие от отраслевых поделок франчей, вот уж где трэш и угар.
30 H A D G E H O G s
 
27.12.17
15:41
(23) Я использую обертку повторновозвращаемых над ЗначениеРеквизитаОбъекта

помогает не городить свой кэш при групповых массовых обработках
31 H A D G E H O G s
 
27.12.17
15:41
(29) ха^3
32 Fragster
 
гуру
27.12.17
15:43
(31) да ладно, там даже получение остатков по партиям уже поправили.
33 perester
 
27.12.17
15:44
(26) можно расширениями все сделать, даже не дожидаться режима совместимости)
34 Fragster
 
гуру
27.12.17
16:00
35 H A D G E H O G s
 
27.12.17
16:03
(34) Ну если только КЛАДРы жать.
36 H A D G E H O G s
 
27.12.17
16:04
(34) Ставлю дайм, это очень оценили на партнерском
37 H A D G E H O G s
 
27.12.17
16:04
А как бы годно было бы дать возможность жать справочники и РС
38 ИТ директор
 
27.12.17
16:05
(34) для тех кто держит тестовые базы в продуктиве (да-да, я про тебя), наверно актуально
39 Fragster
 
гуру
27.12.17
16:07
(38) денег нет, но мы держимся
40 youalex
 
27.12.17
16:08
(20) если это принципиально, то и результат проверки через точку может протухнуть.
(27) кэш объектов.
Заказ.Договор.Владелец.ИНН = Заказ.ПолучитьОбъект().Договор.ПолучитьОбъект().Владелец.ПолучитьОбъект().ИНН.

все полученные объекты будут закэшированы платформой.
41 Fragster
 
гуру
27.12.17
16:09
(40) если совсем принципиально, можно управляемую блокировку на цепочку ссылок повесить...
42 rs_trade
 
27.12.17
16:09
(34) а индексы че не пожал?
43 Fragster
 
гуру
27.12.17
16:09
(42) пожал
44 ИТ директор
 
27.12.17
16:10
(39) у вас еще и сервер 1С вместе с сервером СУБД на одной железке?
45 Fragster
 
гуру
27.12.17
16:12
(44) там еще и железку альтернативные выбирали... ну хоть на ssd...
46 Fragster
 
гуру
27.12.17
16:12
47 rs_trade
 
27.12.17
16:12
(43) я слепой. увидел.
48 youalex
 
27.12.17
16:13
(41) тогда и транзакцию прицепом) А проверять реки на что-то там, скорее всего, можно полностью в запросе
49 Fragster
 
гуру
27.12.17
16:13
(48) таки ты прав
50 H A D G E H O G s
 
27.12.17
16:14
(46) Мы выключили виртуализацию.
51 Fragster
 
гуру
27.12.17
16:16
(50) ты не поверишь, но на этом серваке еще есть и виртуалка с какой-то хуйней. Деть некуда, см (39), но хоть нагрузки не дает хоть как-то ощутимой.
52 Fragster
 
гуру
27.12.17
16:16
*фигнёй
53 rs_trade
 
27.12.17
16:26
(34) скрипт можно еще доработать. боле умным сделать.
54 Fragster
 
гуру
27.12.17
16:28
(53) например? смотреть соотношение чтения записи и estimated сжатие?
55 Fragster
 
гуру
27.12.17
16:29
56 rs_trade
 
27.12.17
16:31
(54) ага. это читал? https://msdn.microsoft.com/en-us/library/dd894051(v=sql.100).aspx

я хотел наваять, но ленюсь.
57 Fragster
 
гуру
27.12.17
16:35
(56) супер. на выходных добью скрипт :)
58 ИС-2
 
naïve
28.12.17
10:00
вытащить все данные запросом может потребоваться еще больше времени т.к надо соединять все таблицы
59 D3O
 
28.12.17
10:28
(58) если соединять с предварительно отобранными временными таблицами больше времени не потребуется.
платформа при обращениях из языка через точно выбирает весь кортеж объекта, а не только требуемое поле. проблема быстродействия еще и в этом.
60 D3O
 
28.12.17
10:29
*через точку
61 Fragster
 
гуру
28.12.17
10:37
(59) а если объект содержит таб части, то (раньше - так точно) делает это в микротранзакциях