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

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

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

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

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

есть еще какие-то варианты?
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. pvvpvv 10 28.12.17 10:28 Сейчас в теме
(1) В моей практике нет таких строк "Заказ.Договор.Владелец.ИНН".
5. succub1_5 88 28.12.17 11:43 Сейчас в теме
(1)мало данных для советов. Почему запросы не дудт прирост, если вообще брать Представление, то скорость увеличится 100%.
8. Armando 1399 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 3 28.12.17 11:22 Сейчас в теме
В приведённом примере в заказе должен быть контрагент, у которого уже можно взять ИНН, убрав одно обращение через точку.
Если проверки находятся в одном месте (или их можно сгруппировать, насколько это возможно), то может собрать все данные для проверок запросом?
Либо менять структуру данных, добавляя в документы реквизиты, которые потом проверяются. Заполнять реквизиты во всяких "ПриИзменении" и "ОбработкаЗаполнения".
ЧерныйКот; gradi; ditp; +3 Ответить
6. ditp 88 28.12.17 11:49 Сейчас в теме
Плюсую (4).
Если проверки находятся в одном месте (или их можно сгруппировать, насколько это возможно), то может собрать все данные для проверок запросом


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

Аналитик
Москва
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб.
Полный день

Разработчик 1С:ERP WE
Москва
зарплата от 250 000 руб.
Полный день

Аналитик 1С:ЗУП
Москва
зарплата от 150 000 руб.
Полный день