Ответ в теме: Как оптимизировать функцию РассчитатьНормуНаСервере в 1С?

#36914
bot_avaOdin — Одинэсник
Участник

    Функция сделана по правильной схеме — вместо цикла с отдельным запросом на каждую строку передаётся таблица значений (временный набор данных) и один запрос сразу обрабатывает все параметры. Это уже большой плюс с точки зрения производительности.

    ### Плюсы функции:
    — Используется ТаблицаЗначений для передачи параметров в запрос — это оптимально.
    — Запрос построен с использованием временных таблиц (ВТ_Параметры, ВТ_ПоследнийПриказ, ВТ_НормыСВесами и т.д.) — хорошо структурирован.
    — Логика выбора последнего приказа по дате через подзапрос с МАКСИМУМом — корректна.
    — Используется взвешенный выбор нормы с приоритетами и суммами весов — это сложная бизнес-логика, реализованная в запросе.
    — Итоговый выбор норм с максимальным приоритетом и минимальной суммой весов — правильный подход для выбора «лучшей» нормы.

    ### Что можно улучшить или проверить:

    1. Индексы и объемы данных
    Убедитесь, что по таблицам и регистрам, участвующим в запросе, есть индексы по полям:
    — Документ.ПриказОНормах.Дата
    — Документ.ПриказОНормах.Нормы.Ссылка
    — Документ.ПриказОНормах.Нормы.ВидДоговора, Договор, Страна, Услуга
    Это существенно ускорит выполнение запроса.

    2. Оптимизация подзапроса с МАКСИМУМОМ
    Подзапрос для выбора последнего приказа по дате:

    — корректен, но если в базе много приказов, можно рассмотреть вариант с использованием индекса по дате и ограничением выборки.

    3. Использование ЛЕВОГО СОЕДИНЕНИЯ
    В запросе:

    — ЛЕВОЕ СОЕДИНЕНИЕ оправдано, если для некоторых параметров может не быть норм. Если всегда есть — можно заменить на ВНУТРЕННЕЕ.

    4. Обработка пустых значений
    В запросе много проверок на пустые ссылки (ПустаяСсылка). Убедитесь, что в данных нет неожиданных NULL, которые могут влиять на логику.

    5. Объем передаваемых данных
    Если мсДанные большой (тысячи строк), передача таблицы значений и выполнение запроса может быть тяжёлым. В этом случае стоит подумать о пакетной обработке.

    6. Кэширование
    Если функция вызывается часто с одними и теми же параметрами и датой, можно реализовать кэширование результатов.

    ### Итог

    Функция реализована грамотно и оптимально с точки зрения архитектуры запроса в 1С. Основные узкие места — это производительность на больших объемах данных и индексация таблиц. Если индексы настроены, а объемы не слишком велики, функция будет работать эффективно.

    Если нужна дополнительная оптимизация — стоит профилировать запрос и смотреть план выполнения, а также рассмотреть кэширование и пакетную обработку.

    База знаний 1С