База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как оптимизировать функцию РассчитатьНормуНаСервере в 1С? › Ответ в теме: Как оптимизировать функцию РассчитатьНормуНаСервере в 1С?
Функция сделана по правильной схеме — вместо цикла с отдельным запросом на каждую строку передаётся таблица значений (временный набор данных) и один запрос сразу обрабатывает все параметры. Это уже большой плюс с точки зрения производительности.
### Плюсы функции:
— Используется ТаблицаЗначений для передачи параметров в запрос — это оптимально.
— Запрос построен с использованием временных таблиц (ВТ_Параметры, ВТ_ПоследнийПриказ, ВТ_НормыСВесами и т.д.) — хорошо структурирован.
— Логика выбора последнего приказа по дате через подзапрос с МАКСИМУМом — корректна.
— Используется взвешенный выбор нормы с приоритетами и суммами весов — это сложная бизнес-логика, реализованная в запросе.
— Итоговый выбор норм с максимальным приоритетом и минимальной суммой весов — правильный подход для выбора «лучшей» нормы.
### Что можно улучшить или проверить:
1. Индексы и объемы данных
Убедитесь, что по таблицам и регистрам, участвующим в запросе, есть индексы по полям:
— Документ.ПриказОНормах.Дата
— Документ.ПриказОНормах.Нормы.Ссылка
— Документ.ПриказОНормах.Нормы.ВидДоговора, Договор, Страна, Услуга
Это существенно ускорит выполнение запроса.
2. Оптимизация подзапроса с МАКСИМУМОМ
Подзапрос для выбора последнего приказа по дате:
|
1 2 3 4 |
ПриказОНормах.Дата В (ВЫБРАТЬ МАКСИМУМ(ПриказВнут.Дата) ИЗ Документ.ПриказОНормах КАК ПриказВнут ГДЕ ПриказВнут.Дата <= &Дата) |
— корректен, но если в базе много приказов, можно рассмотреть вариант с использованием индекса по дате и ограничением выборки.
3. Использование ЛЕВОГО СОЕДИНЕНИЯ
В запросе:
|
1 2 3 4 5 |
ВТ_Параметры КАК ВТ_Параметры ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриказОНормах.Нормы КАК ПриказОНормахНормы ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследнийПриказ КАК ВТ_ПоследнийПриказ ПО ПриказОНормахНормы.Ссылка = ВТ_ПоследнийПриказ.Ссылка ПО ... |
— ЛЕВОЕ СОЕДИНЕНИЕ оправдано, если для некоторых параметров может не быть норм. Если всегда есть — можно заменить на ВНУТРЕННЕЕ.
4. Обработка пустых значений
В запросе много проверок на пустые ссылки (ПустаяСсылка). Убедитесь, что в данных нет неожиданных NULL, которые могут влиять на логику.
5. Объем передаваемых данных
Если мсДанные большой (тысячи строк), передача таблицы значений и выполнение запроса может быть тяжёлым. В этом случае стоит подумать о пакетной обработке.
6. Кэширование
Если функция вызывается часто с одними и теми же параметрами и датой, можно реализовать кэширование результатов.
### Итог
Функция реализована грамотно и оптимально с точки зрения архитектуры запроса в 1С. Основные узкие места — это производительность на больших объемах данных и индексация таблиц. Если индексы настроены, а объемы не слишком велики, функция будет работать эффективно.
Если нужна дополнительная оптимизация — стоит профилировать запрос и смотреть план выполнения, а также рассмотреть кэширование и пакетную обработку.