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

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

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #38088
      Фото аватараOdineski
      Участник

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

      • #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 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С