Как в 1С:Управление торговлей 11 разделить долг клиента и наш долг в запросе по взаиморасчетам?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке собственных отчетов или доработке форм в конфигурации 1С:Управление торговлей 11 часто возникает задача отобразить развернутое сальдо взаиморасчетов с партнером. Пользователям необходимо четко видеть две раздельные суммы: Долг контрагента (дебиторская задолженность за отгруженные товары) и Наш долг (кредиторская задолженность, то есть полученные авансы или задолженность перед поставщиком).

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

Выясним причину свернутого сальдо в запросе

Рассмотрим типовой ошибочный запрос к регистру накопления РасчетыСКлиентами:


ВЫБРАТЬ
    РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам,
    РасчетыСКлиентамиОстатки.СуммаОстаток
ИЗ
    РегистрНакопления.РасчетыСКлиентами.Остатки(&Период, АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСКлиентамиОстатки

Проанализируем, почему этот запрос возвращает свернутую разницу между долгом и авансом:

  1. Агрегация на уровне виртуальной таблицы: В регистре РасчетыСКлиентами положительное значение ресурса СуммаОстаток означает долг клиента, а отрицательное — полученный аванс (наш долг). Если в параметрах выборки указана только аналитика партнера/контрагента и не выбраны подчиненные аналитические разрезы (заказ клиента, расчетный документ), виртуальная таблица СУБД автоматически суммирует все положительные и отрицательные числа по контрагенту в одно итоговое число.
  2. Отсутствие детальных объектов расчетов: Чтобы увидеть и долг, и аванс одновременно, расчеты необходимо разворачивать минимум до уровня объектов расчетов (заказов или расчетных документов).
  3. Разделение контуров клиентов и поставщиков: Если один и тот же контрагент выступает и покупателем, и поставщиком, взаиморасчеты ведутся раздельно в двух регистрах: РасчетыСКлиентами и РасчетыСПоставщиками.

Способ решения: Разворот остатков через условие ВЫБОР КОГДА

Для корректного разделения долга партнера и нашего долга необходимо во вложенном запросе получить остатки в разрезе объектов расчетов, а во внешнем запросе разделить положительные и отрицательные суммы через конструкцию ВЫБОР КОГДА ... и сгруппировать результат по контрагенту или партнеру.

Посмотрим на пример правильного построения запроса:


ВЫБРАТЬ
    ВложенныйЗапрос.Партнер КАК Партнер,
    ВложенныйЗапрос.Контрагент КАК Контрагент,
    СУММА(ВложенныйЗапрос.ДолгПартнера) КАК ДолгПартнера,
    СУММА(ВложенныйЗапрос.НашДолг) КАК НашДолг
ИЗ
    (ВЫБРАТЬ
        РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
        РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
        ВЫБОР
            КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток > 0
                ТОГДА РасчетыСКлиентамиОстатки.СуммаОстаток
            ИНАЧЕ 0
        КОНЕЦ КАК ДолгПартнера,
        ВЫБОР
            КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток < 0
                ТОГДА -РасчетыСКлиентамиОстатки.СуммаОстаток
            ИНАЧЕ 0
        КОНЕЦ КАК НашДолг
    ИЗ
        РегистрНакопления.РасчетыСКлиентами.Остатки(
                &Период,
                АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСКлиентамиОстатки) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Партнер,
    ВложенныйЗапрос.Контрагент

Разберем логику работы этого запроса:

  1. Во вложенном запросе к таблице РасчетыСКлиентами.Остатки данные извлекаются без свертки по партнеру, сохраняя знак каждого конкретного расчетного остатка.
  2. Положительный остаток (СуммаОстаток > 0) интерпретируется как ДолгПартнера.
  3. Отрицательный остаток (СуммаОстаток < 0) с обратным знаком (-РасчетыСКлиентамиОстатки.СуммаОстаток) формирует колонку НашДолг.
  4. Внешний запрос агрегирует полученные строки с помощью функции СУММА и группирует их по контрагенту. В результате мы получаем корректное развернутое сальдо.

Учет взаиморасчетов по поставщикам и покупателям в едином запросе

Если контрагент ведет с компанией двустороннюю деятельность, необходимо объединить данные из регистров расчетов с клиентами и с поставщиками с помощью конструкции ОБЪЕДИНИТЬ ВСЕ.

Рассмотрим пример сводного запроса:


ВЫБРАТЬ
    ТаблицаРасчетов.Партнер КАК Партнер,
    ТаблицаРасчетов.Контрагент КАК Контрагент,
    СУММА(ТаблицаРасчетов.ДолгПартнера) КАК ДолгПартнера,
    СУММА(ТаблицаРасчетов.НашДолг) КАК НашДолг
ИЗ
    (ВЫБРАТЬ
        РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
        РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
        ВЫБОР
            КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток > 0
                ТОГДА РасчетыСКлиентамиОстатки.СуммаОстаток
            ИНАЧЕ 0
        КОНЕЦ КАК ДолгПартнера,
        ВЫБОР
            КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток < 0
                ТОГДА -РасчетыСКлиентамиОстатки.СуммаОстаток
            ИНАЧЕ 0
        КОНЕЦ КАК НашДолг
    ИЗ
        РегистрНакопления.РасчетыСКлиентами.Остатки(&Период, АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСКлиентамиОстатки

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
        РасчетыСПоставщикамиОстатки.АналитикаУчетаПоПартнерам.Партнер,
        РасчетыСПоставщикамиОстатки.АналитикаУчетаПоПартнерам.Контрагент,
        ВЫБОР
            КОГДА РасчетыСПоставщикамиОстатки.СуммаОстаток < 0
                ТОГДА -РасчетыСПоставщикамиОстатки.СуммаОстаток
            ИНАЧЕ 0
        КОНЕЦ,
        ВЫБОР
            КОГДА РасчетыСПоставщикамиОстатки.СуммаОстаток > 0
                ТОГДА РасчетыСПоставщикамиОстатки.СуммаОстаток
            ИНАЧЕ 0
        КОНЕЦ
    ИЗ
        РегистрНакопления.РасчетыСПоставщиками.Остатки(&Период, АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСПоставщикамиОстатки) КАК ТаблицаРасчетов

СГРУППИРОВАТЬ ПО
    ТаблицаРасчетов.Партнер,
    ТаблицаРасчетов.Контрагент

Важный нюанс: В регистре РасчетыСПоставщиками смысл знака противоположный: положительный остаток означает задолженность нашей организации перед поставщиком (Наш долг), а отрицательный — аванс, выданный поставщику (Долг партнера).

Типовые механизмы и методические рекомендации

При работе с взаиморасчетами в 1С:УТ 11 следует помнить о следующих особенностях архитектуры конфигурации:

  1. Фоновое распределение взаиморасчетов: В версиях УТ 11 взаиморасчеты могут рассчитываться в режиме отложенного проведения. Если регламентное задание распределения расчетов еще не отработало, в регистрах может временно отображаться одновременное наличие долга и аванса по разным документам.
  2. Использование типовых отчетов: Перед написанием собственных запросов проверьте типовые отчеты подсистемы «Продажи» и «Закупки» — «Ведомость расчетов с клиентами», «Ведомость расчетов с поставщиками» и «Сводная ведомость расчетов». В их настройках предусмотрены варианты группировок по объектам расчетов и договорам с автоматическим разворотом дебиторской и кредиторской задолженности.
  3. Типовой программный интерфейс: Для получения актуального сальдо в коде конфигурации рекомендуется использовать процедуры и функции специализированных общих модулей, таких как ВзаиморасчетыСервер, которые автоматически учитывают ключи аналитики учета по партнерам, валюты договоров и правила зачета оплат.
← На главную