1.5Kпросмотров
23 февраля 2026 г.
Score: 1.6K
Хитрое тестирование на собеседование 1С программистов на знание оптимизации и производительности. Ниже мой комментарий с решением👇 Есть регистр накопления ВзаиморасчетыСКлиентами (вид — Остатки).
Необходимо получить клиентов с задолженностью на текущий момент. Разработчик написал запрос:
ВЫБРАТЬ Остатки.Клиент, Остатки.Остаток КАК Долг
ИЗ РегистрНакопления.ВзаиморасчетыСКлиентами.Остатки( &МоментВремени ) КАК Остатки
ГДЕ Остатки.Остаток > 0
В регистре десятки миллионов движений, сотни тысяч клиентов.
Запрос выполняется медленно. Какой вариант оптимизации будет наиболее правильным?
✔️ Перенести условие Остатки.Остаток > 0 в параметры виртуальной таблицы
✔️ Использовать виртуальную таблицу Обороты вместо Остатки
✔️ Добавить измерение Клиент в отбор параметров виртуальной таблицы
✔️ Убедиться, что включены и пересчитаны текущие итоги регистра ✅ Правильный ответ:
➜ Убедиться, что включены и пересчитаны текущие итоги регистра. 💬 Комментарий:
Многие программисты часто пытаются найти ошибки в самом запросе, а проблема — в настройке регистра.
Условие Остаток > 0 нельзя передать в параметры виртуальной таблицы, потому что параметры принимают только отборы по измерениям. Если в регистре отключены или не пересчитаны текущие итоги, то при обращении к Остатки(&Момент) платформа будет пересчитывать остатки по всем движениям до момента времени и агрегировать десятки миллионов записей. При включённых и пересчитанных текущих итогах платформа читает уже рассчитанные агрегаты и запрос становится на порядок быстрее. 🛠Настройка:
1. Пользовательский режим:
Функции технического специалиста - Стандартные - Управление итогами. 2. Конфигуратор:
Администрирование - Тестирование и исправление - Пересчет итогов. 3. Программно:
РегистрыНакопления.ВзаиморасчетыСКлиентами.ПересчитатьТекущиеИтоги(); 👍 Like, если было полезно😉