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

1. ISP 28.12.17 10:21 Сейчас в теме
В базе сделана куча проверок, где идет обращение к реквизитам через точку.
Например, Заказ.Договор.Владелец.ИНН

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

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

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

есть еще какие-то варианты?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. pvvpvv 10 28.12.17 10:28 Сейчас в теме
(1) В моей практике нет таких строк "Заказ.Договор.Владелец.ИНН".
5. succub1_5 89 28.12.17 11:43 Сейчас в теме
(1)мало данных для советов. Почему запросы не дудт прирост, если вообще брать Представление, то скорость увеличится 100%.
8. Armando 1400 28.12.17 14:50 Сейчас в теме
(1)
Переводить на запросы - долго и не факт, что даст скорость работы.

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

(1)
Написание общей функции повторного использования

Только не забывайте, что кэш не резиновый.
10. ger_kar 28.12.17 16:20 Сейчас в теме
(1) Обращения через точку, если выражаться правильно, есть разыменования, которые по факту при исполнении превращаются в цепочку вызовов соответствующих методов. Чтобы сократить их количество применяется следующее правило: Если значение используется более чем 1 раз, то результат сохраняется в переменную и далее используется эта переменная. Например код
Заказ.Договор.Дата = А;
Заказ.Договор.Владелец.Наименование = Б;
Заказ.Договор.Владелец.ИНН = В;

Правильно надо писать так:
Договор = Заказ.Договор;
Договор.Дата = А;
Владелец = Договор.Владелец;
Владелец.Наименование = Б;
Владелец.ИНН = В;


В первом будет количество вызовов 2 + 3 + 3 = 8
Во втором количество вызовов 1 + 1 + 1 + 1 + 1 = 5

Здесь на 3 строчках сэкономили 3 вызова. А таких строчек, где переписав код можно получить выигрыш в типовых конфигурациях тысячи. Особенно, хороший выигрыш можно получить когда такой код находится внутри процедур и функций (так как они вызываются многократно), а также внутри циклов.
Это общее правило программирования, которое должно применяться повсеместно, на каком бы языке программирования не писался код и к сожалению это правило многие игнорируют. В результате имеем тормознутые сайты, а в случае с 1С тормознутые конфигурации. Конфигурации тормозят конечно не только из за нарушения этого принципа, тормозов в них и без него хватает, но нарушая основные правила программирования эти тормоза дополнительно усугубляются.
olezhe; griff19; gradi; +3 Ответить
3. DarkUser 28.12.17 11:08 Сейчас в теме
Если в конфигурации есть БСП то переписывать на ОбщегоНазначения.ЗначениеРеквизитаОбъекта(). Для этого вызова даже можно обертку вызова с клиента сделать. Если нет БСП, то утащить из неё к себе в конфу эти нужнейшие процедуры.
7. pvvpvv 10 28.12.17 12:02 Сейчас в теме
(3)(4)(5) Вам предлагают кэшировать любые значения, а Вы разговариваете о БСП. Если очень хочется, сохрани часто используемое значение, и не парь мозг.
12. Leon75 29.07.18 17:49 Сейчас в теме
4. comptr 35 28.12.17 11:22 Сейчас в теме
В приведённом примере в заказе должен быть контрагент, у которого уже можно взять ИНН, убрав одно обращение через точку.
Если проверки находятся в одном месте (или их можно сгруппировать, насколько это возможно), то может собрать все данные для проверок запросом?
Либо менять структуру данных, добавляя в документы реквизиты, которые потом проверяются. Заполнять реквизиты во всяких "ПриИзменении" и "ОбработкаЗаполнения".
ЧерныйКот; gradi; ditp; +3 Ответить
6. ditp 93 28.12.17 11:49 Сейчас в теме
Плюсую (4).
Если проверки находятся в одном месте (или их можно сгруппировать, насколько это возможно), то может собрать все данные для проверок запросом


Если стоит задача что-то проверять, то нужно оптимизировать процедуру проверки в целом, а не частные обращения через точку.
9. UtSpar 136 28.12.17 15:50 Сейчас в теме
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Заказ,"Договор"), "Владелец")
11. Armando 1400 28.12.17 16:25 Сейчас в теме
(9) Лучше так. Значение будет получено в одном запросе.
ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Заказ, Новый Структура("ИНН", "Договор.Владелец.ИНН"));
ИНН = ЗначенияРеквизитов.ИНН;
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот