Оптимизация обращений к реквизитам объектов через точку
В базе сделана куча проверок, где идет обращение к реквизитам через точку.
Например, Заказ.Договор.Владелец.ИНН
Это съедает скорость работы. Одна проверка через такое обращение занимает 38%.
Вопрос. Как это можно оптимизировать? Переводить на запросы - долго и не факт, что даст скорость работы.
1) Написание общей функции повторного использования, которая делает обращение к промежуточным данным (чтобы минимизировать вероятность получения устаревших данных). Примерно так:
ПовтИсп.ЗначениеРеквизита(Заказ,"Договор.Владелец").ИНН
есть еще какие-то варианты?
Например, Заказ.Договор.Владелец.ИНН
Это съедает скорость работы. Одна проверка через такое обращение занимает 38%.
Вопрос. Как это можно оптимизировать? Переводить на запросы - долго и не факт, что даст скорость работы.
1) Написание общей функции повторного использования, которая делает обращение к промежуточным данным (чтобы минимизировать вероятность получения устаревших данных). Примерно так:
ПовтИсп.ЗначениеРеквизита(Заказ,"Договор.Владелец").ИНН
есть еще какие-то варианты?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Долго возможно. Скорость выполнения увеличится точно.
Но есть разные нюансы. Например, если этот код выполняется в цикле, то переписав на запрос можно получить обратный эффект.
(1)
Только не забывайте, что кэш не резиновый.
Переводить на запросы - долго и не факт, что даст скорость работы.
Долго возможно. Скорость выполнения увеличится точно.
Но есть разные нюансы. Например, если этот код выполняется в цикле, то переписав на запрос можно получить обратный эффект.
(1)
Написание общей функции повторного использования
Только не забывайте, что кэш не резиновый.
(1) Обращения через точку, если выражаться правильно, есть разыменования, которые по факту при исполнении превращаются в цепочку вызовов соответствующих методов. Чтобы сократить их количество применяется следующее правило: Если значение используется более чем 1 раз, то результат сохраняется в переменную и далее используется эта переменная. Например код
Правильно надо писать так:
В первом будет количество вызовов 2 + 3 + 3 = 8
Во втором количество вызовов 1 + 1 + 1 + 1 + 1 = 5
Здесь на 3 строчках сэкономили 3 вызова. А таких строчек, где переписав код можно получить выигрыш в типовых конфигурациях тысячи. Особенно, хороший выигрыш можно получить когда такой код находится внутри процедур и функций (так как они вызываются многократно), а также внутри циклов.
Это общее правило программирования, которое должно применяться повсеместно, на каком бы языке программирования не писался код и к сожалению это правило многие игнорируют. В результате имеем тормознутые сайты, а в случае с 1С тормознутые конфигурации. Конфигурации тормозят конечно не только из за нарушения этого принципа, тормозов в них и без него хватает, но нарушая основные правила программирования эти тормоза дополнительно усугубляются.
Заказ.Договор.Дата = А;
Заказ.Договор.Владелец.Наименование = Б;
Заказ.Договор.Владелец.ИНН = В;
Правильно надо писать так:
Договор = Заказ.Договор;
Договор.Дата = А;
Владелец = Договор.Владелец;
Владелец.Наименование = Б;
Владелец.ИНН = В;
В первом будет количество вызовов 2 + 3 + 3 = 8
Во втором количество вызовов 1 + 1 + 1 + 1 + 1 = 5
Здесь на 3 строчках сэкономили 3 вызова. А таких строчек, где переписав код можно получить выигрыш в типовых конфигурациях тысячи. Особенно, хороший выигрыш можно получить когда такой код находится внутри процедур и функций (так как они вызываются многократно), а также внутри циклов.
Это общее правило программирования, которое должно применяться повсеместно, на каком бы языке программирования не писался код и к сожалению это правило многие игнорируют. В результате имеем тормознутые сайты, а в случае с 1С тормознутые конфигурации. Конфигурации тормозят конечно не только из за нарушения этого принципа, тормозов в них и без него хватает, но нарушая основные правила программирования эти тормоза дополнительно усугубляются.
Если в конфигурации есть БСП то переписывать на ОбщегоНазначения.ЗначениеРеквизитаОбъекта(). Для этого вызова даже можно обертку вызова с клиента сделать. Если нет БСП, то утащить из неё к себе в конфу эти нужнейшие процедуры.
В приведённом примере в заказе должен быть контрагент, у которого уже можно взять ИНН, убрав одно обращение через точку.
Если проверки находятся в одном месте (или их можно сгруппировать, насколько это возможно), то может собрать все данные для проверок запросом?
Либо менять структуру данных, добавляя в документы реквизиты, которые потом проверяются. Заполнять реквизиты во всяких "ПриИзменении" и "ОбработкаЗаполнения".
Если проверки находятся в одном месте (или их можно сгруппировать, насколько это возможно), то может собрать все данные для проверок запросом?
Либо менять структуру данных, добавляя в документы реквизиты, которые потом проверяются. Заполнять реквизиты во всяких "ПриИзменении" и "ОбработкаЗаполнения".
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот