Ответ в теме: Как получить сумму долга по каждой организации без повторных обращений?

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

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

    Димон, привет!

    Твоя задача — выполнить запрос по множеству значений (Организация, Контрагент, Договор) из программной таблицы значений, чтобы не делать запрос к регистру по каждой строке отдельно, а сразу одним запросом с фильтром по всем нужным наборам. Для этого в 1С используется передача таблицы значений как параметра запроса и объединение с ней в запросе.

    Разберу подробно, как это сделать в консоли запросов и в коде:

    ### Шаг 1. Создание программной таблицы значений с нужными полями

    В коде (например, в обработчике кнопки) создаешь ТаблицуЗначений с колонками:

    ### Шаг 2. Формирование запроса с использованием таблицы значений как параметра

    В запросе ты создаешь временную таблицу из переданной таблицы значений и соединяешь ее с регистром по нужным полям.

    Пример текста запроса:

    ### Шаг 3. Установка параметров и выполнение запроса в коде

    ### Шаг 4. Обработка результата

    Ты получаешь выборку с суммами по каждой связке Организация-Контрагент-Договор, которые были в твоей таблице фильтра. Запрос выполнится один раз, без повторных обращений для каждой строки.

    ### Важные моменты:

    — Таблица значений передается в запрос как параметр &ТаблицаФильтра.
    — В запросе создается псевдоним для этой таблицы (например, ВТФильтр).
    — Соединение с регистром происходит по всем трем полям.
    — В условии ГДЕ можно добавить дополнительные фильтры.
    — Если нужно получить сумму долга по организации, можно добавить группировку по организации и суммировать поле СуммаБухОстаток.

    ### Пример с группировкой по организации (если нужна сумма по организации):

    ### Итог

    — Создаешь таблицу значений с нужными наборами Организация+Контрагент+Договор.
    — Передаешь ее в запрос как параметр.
    — В запросе соединяешься с регистром по этим полям.
    — Запрос выполняется один раз, без повторных обращений.
    — Получаешь нужные суммы по организациям.

    Если хочешь, могу помочь с примером полного кода для кнопки.

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

    Димон, надеюсь, теперь понятно, как сделать запрос с фильтром по таблице значений, чтобы не делать много запросов подряд.

    Дополнение по конфигурации (по индексу конфигурации 1С):

    В вашем вопросе вы хотите получить сумму долга по каждой организации, используя программную таблицу значений с полями Организация, Договор, Контрагент, и при этом избежать повторных обращений к запросу для каждой строки.

    В контексте модуля «УчетВзаиморасчетовОтложенноеПроведение» из конфигурации «СКАТ — Профессионал 5.0» есть подход, который используется для оптимизации запросов с множеством параметров.

    Основные шаги для решения вашей задачи:

    1. **Создание программной таблицы значений с нужными полями**
    Вы создаете таблицу значений с колонками: Организация, Договор, Контрагент. В эту таблицу помещаете все необходимые комбинации.

    2. **Использование временной таблицы в запросе**
    Вместо того, чтобы для каждой строки делать отдельный запрос, вы помещаете вашу таблицу значений во временную таблицу в запросе (через конструкцию ПОМЕСТИТЬ или ВТ_…).

    3. **Объединение с регистром остатков по ключам**
    В запросе делаете соединение (например, внутреннее или левое) между вашей временной таблицей и регистром остатков по полям Организация, ДоговорКонтрагента, Контрагент.

    4. **Агрегация по организации**
    В запросе группируете данные по Организации и суммируете поле СуммаБухОстаток.

    5. **Передача параметров в запрос**
    Параметры, такие как дата, сумма, вид договора, передаются один раз в запрос.

    Примерный алгоритм в коде (упрощенно):

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

    Если нужна более подробная помощь с конкретным кодом, пожалуйста, уточните, есть ли у вас уже таблица значений с этими данными и как вы хотите получить итоговую сумму (по организации или по каждой строке). В представленном контексте есть процедуры и функции, которые работают с временными таблицами и оптимизируют запросы, например, ПодготовитьДоговорыДляРасчетов и ПодготовитьОстаткиПоДоговорам, которые можно использовать как пример.

    Если хотите, могу помочь написать конкретный пример запроса с использованием вашей таблицы значений.

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