Ответ в теме: Как оптимизировать запрос 1С для остатков и оборотов с временными таблицами?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как оптимизировать запрос 1С для остатков и оборотов с временными таблицами? Ответ в теме: Как оптимизировать запрос 1С для остатков и оборотов с временными таблицами?

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

    Вот оптимизированный вариант запроса с использованием временных таблиц (временных таблиц 1С — через ПОМЕСТИТЬ), без вложенных подзапросов, с необходимыми условиями и удобный для отладки.

    |////////////////////////////////////////////////////////////////////////////////
    |// 1. Помещаем остатки по счету и аналитике во временную таблицу
    |ПОМЕСТИТЬ ВТ_Остатки
    |ВЫБРАТЬ
    | Остатки.Счет КАК Счет,
    | Остатки.Субконто1 КАК Субконто1,
    | Остатки.Субконто2 КАК Субконто2,
    | Остатки.СуммаОстаток КАК СуммаОстаток
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = &Счет, , ) КАК Остатки
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |// 2. Помещаем все обороты по счету (без аналитики) во временную таблицу
    |ПОМЕСТИТЬ ВТ_Обороты
    |ВЫБРАТЬ
    | Обороты.Счет КАК Счет,
    | Обороты.Период КАК Период,
    | Обороты.Регистратор КАК Регистратор
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &Дата, , Счет = &Счет, , , ) КАК Обороты
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |// 3. Находим последний период по каждой аналитике из остатков, используя ВТ_Обороты
    |ПОМЕСТИТЬ ВТ_ПоследнийПериод
    |ВЫБРАТЬ
    | Остатки.Счет КАК Счет,
    | Остатки.Субконто1 КАК Субконто1,
    | Остатки.Субконто2 КАК Субконто2,
    | МАКСИМУМ(Обороты.Период) КАК ПоследнийПериод
    |ИЗ
    | ВТ_Остатки КАК Остатки
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Обороты КАК Обороты
    | ПО Остатки.Счет = Обороты.Счет
    |ГРУППИРОВАТЬ ПО
    | Остатки.Счет,
    | Остатки.Субконто1,
    | Остатки.Субконто2
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |// 4. Соединяем остатки с последним периодом и получаем регистратор из ВТ_Обороты
    |ВЫБРАТЬ
    | Остатки.Счет КАК Счет,
    | Остатки.Субконто1 КАК Субконто1,
    | Остатки.Субконто2 КАК Субконто2,
    | Остатки.СуммаОстаток КАК СуммаОстаток,
    | Обороты.Регистратор КАК ПоследнийДокумент
    |ИЗ
    | ВТ_Остатки КАК Остатки
    | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследнийПериод КАК ПоследнийПериод
    | ПО Остатки.Счет = ПоследнийПериод.Счет
    | И Остатки.Субконто1 = ПоследнийПериод.Субконто1
    | И Остатки.Субконто2 = ПоследнийПериод.Субконто2
    | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Обороты КАК Обороты
    | ПО Обороты.Счет = ПоследнийПериод.Счет
    | И Обороты.Период = ПоследнийПериод.ПоследнийПериод
    |;
    |
    |ГДЕ
    | Остатки.Счет = &Счет

    Пояснения:

    — ВТ_Остатки — остатки по аналитике и счету.
    — ВТ_Обороты — все обороты по счету без аналитики (чтобы не дублировать аналитики, берем только счет и период, регистратор).
    — ВТ_ПоследнийПериод — для каждой аналитики из остатков находим максимальный период из оборотов.
    — В итоговом запросе соединяем остатки с последним периодом и получаем регистратор (документ) по этому периоду.
    — Условие по счету везде для фильтрации.

    Параметры запроса:

    — &Дата — дата, на которую берутся остатки (например, КонецДня(ТекущаяДата))
    — &ДатаНачала — дата начала периода для оборотов (например, НачалоДня(ДатаНачалаПериода))
    — &Счет — счет плана счетов, по которому нужна аналитика

    Такой запрос проще читать и отлаживать, т.к. все логические части вынесены во временные таблицы.

    Пример установки параметров в 1С:

    Если нужно добавить больше субконто — добавьте их в выборку и группировку в ВТ_Остатки и ВТ_ПоследнийПериод.

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

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