Вход | Регистрация


1С:Предприятие ::

Метки: 

Оптимизация обращений к реквизитам объектов через точку

Я
   ИС-2
 
27.12.17 - 13:40
В базе сделана куча проверок, где идет обращение к реквизитам через точку.
Например, Заказ.Договор.Владелец.ИНН

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

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

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

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

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

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

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

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

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

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


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

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

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

\"\"
   youalex
 
40 - 27.12.17 - 16:08
(20) если это принципиально, то и результат проверки через точку может протухнуть.
(27) кэш объектов.
Заказ.Договор.Владелец.ИНН = Заказ.ПолучитьОбъект().Договор.ПолучитьОбъект().Владелец.ПолучитьОбъект().ИНН.

все полученные объекты будут закэшированы платформой.
   Fragster
 
41 - 27.12.17 - 16:09
(40) если совсем принципиально, можно управляемую блокировку на цепочку ссылок повесить...
   rs_trade
 
42 - 27.12.17 - 16:09
(34) а индексы че не пожал?
   Fragster
 
43 - 27.12.17 - 16:09
(42) пожал
   ИТ директор
 
44 - 27.12.17 - 16:10
(39) у вас еще и сервер 1С вместе с сервером СУБД на одной железке?
   Fragster
 
45 - 27.12.17 - 16:12
(44) там еще и железку альтернативные выбирали... ну хоть на ssd...

   Fragster
 
46 - 27.12.17 - 16:12

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

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



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует