Как создать подробный отчет по взаиморасчетам с контрагентами в 1С:Предприятие 8.3 (СКД), с учетом начальных/конечных остатков, движений по документам и разделением долгов по продажам и возвратам?

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

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

Понимание основы взаиморасчетов в 1С и структуры регистров

Для корректного построения отчета по взаиморасчетам, включающего остатки и движения по документам, нам необходимо правильно организовать учет в регистрах накопления. В типовых конфигурациях 1С (УНФ, УТ, КА, БП) для этих целей используются регистры, такие как "Взаиморасчеты с покупателями", "Взаиморасчеты с поставщиками" или их аналоги. Ключевым моментом здесь является структура измерений и ресурсов регистра.

  1. Единый регистр или раздельные:

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

  2. Важность измерения ДокументРасчетов:

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

    Пример: Когда вы проводите документ "Реализация товаров и услуг", в регистр взаиморасчетов записывается приход по этому контрагенту, и в измерение ДокументРасчетов попадает ссылка на эту самую реализацию. Когда клиент оплачивает, документ "Поступление на расчетный счет" делает расход, и если ведется "подокументный" учет, то в платежном документе указывается, какую именно реализацию оплатили. Тогда ДокументРасчетов в записи расхода будет ссылаться на ту же реализацию.

  3. Как учитываются возвраты:

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

  4. Решение для разделения долгов (продажи/возвраты):

    Если нам критически важно видеть остатки долгов отдельно по продажам и по возвратам (как, например, в случае с задержками денег по возвратам), есть несколько подходов:

    • Вариант 1: Дополнительное измерение в едином регистре.

      Мы можем добавить в существующий регистр взаиморасчетов новое измерение, например, ВидВзаиморасчетов (или ПричинаДолга) с типом "Перечисление" или "Справочник". В этом измерении мы будем указывать, что это "ДолгПоПродаже" или "ДолгПоВозврату". Тогда в отчете СКД мы сможем группировать или отбирать данные по этому измерению, получая нужную аналитику.

      Преимущества: Сохраняется целостность взаиморасчетов в одном месте. Отчетность строится проще, так как не требуется объединять данные из разных регистров.

      Недостатки: Требует доработки типовой конфигурации (добавление измерения и изменение логики движений документов).

    • Вариант 2: Использование разных регистров и объединение данных в СКД.

      Если мы решили вести учет долгов по продажам и возвратам в абсолютно разных регистрах (например, "РасчетыПоПродажам" и "РасчетыПоВозвратам"), то в отчете СКД нам потребуется объединять данные из этих двух регистров с помощью оператора ОБЪЕДИНИТЬ ВСЕ в запросе к данным. Это позволит представить информацию из разных источников в едином отчете.

      Преимущества: Возможно более четкое разделение бизнес-логики на уровне регистров.

      Недостатки: Усложняет построение запроса в СКД, так как требуется унифицировать поля для объединения. Могут возникнуть сложности с общей картиной взаиморасчетов, если требуется сводить все долги контрагента без разделения.

Построение отчета в Системе Компоновки Данных (СКД)

Основной инструмент для получения начальных и конечных остатков, а также движений за период в 1С:Предприятие является виртуальная таблица ОстаткиИОбороты регистра накопления. Давайте разберем шаги построения такого отчета.

  1. Использование виртуальной таблицы ОстаткиИОбороты:

    Эта таблица позволяет получить данные за указанный период, сразу предоставляя начальный остаток на начало периода, конечный остаток на конец периода, а также приходы и расходы (обороты) за этот период. Это идеальный выбор для отчетов по взаиморасчетам.

    Рассмотрим пример запроса к регистру накопления "РасчетыСПокупателями" (аналог из УНФ):

    
    ВЫБРАТЬ
        РасчетыСПокупателямиОстаткиИОбороты.Контрагент,
        РасчетыСПокупателямиОстаткиИОбороты.ДоговорКонтрагента,
        РасчетыСПокупателямиОстаткиИОбороты.ДокументРасчетов,
        РасчетыСПокупателямиОстаткиИОбороты.СуммаНачальныйОстаток,
        РасчетыСПокупателямиОстаткиИОбороты.СуммаПриход,
        РасчетыСПокупателямиОстаткиИОбороты.СуммаРасход,
        РасчетыСПокупателямиОстаткиИОбороты.СуммаКонечныйОстаток
    ИЗ
        РегистрНакопления.РасчетыСПокупателями.ОстаткиИОбороты(
            &НачалоПериода,
            &КонецПериода,
            Авто, // Периодичность: Авто (по умолчанию по регистратору)
            ,   // Измерения: пустым (все измерения регистра)
            ДокументРасчетов = &ДокументРасчетов // Отбор по ДокументРасчетов, если нужен, или убираем
        ) КАК РасчетыСПокупателямиОстаткиИОбороты
    

    Объяснения к запросу:

    • &НачалоПериода и &КонецПериода: Это параметры, которые мы будем передавать из настроек отчета СКД. Они определяют диапазон, за который берутся остатки и обороты.
    • Авто: Этот параметр указывает периодичность, по которой будут рассчитываться остатки и обороты. Значение Авто (или Регистратор) означает, что движения будут детализированы по каждому документу-регистратору. Если нам нужны остатки на каждую дату движения, можно использовать День, Месяц и т.д. Но для детализации по документам движения оптимальным будет Авто или Регистратор.
    • ДокументРасчетов = &ДокументРасчетов: Это пример отбора. Если нам нужно построить отчет по конкретному документу расчетов, мы можем его использовать. В общем случае, для получения всех документов расчетов, этот отбор не указывается.
  2. Детализация по регистраторам/документам расчетов:

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

    Шаги в СКД:

    1. Источник данных: Создаем набор данных — запрос, используя приведенный выше пример.
    2. Параметры: На закладке "Параметры" СКД определяем параметры НачалоПериода и КонецПериода. Устанавливаем им свойства "Ограничение доступности" и "Включать в пользовательские настройки".
    3. Выбранные поля: Переносим из набора данных все необходимые поля (Контрагент, ДоговорКонтрагента, ДокументРасчетов, СуммаНачальныйОстаток, СуммаПриход, СуммаРасход, СуммаКонечныйОстаток).
    4. Настройка структуры отчета:
      • Создаем новую группировку по полю Контрагент.
      • Внутри этой группировки создаем еще одну группировку по полю ДоговорКонтрагента (если он используется).
      • И, наконец, внутри группировки по договору создаем детальные записи, и в них указываем поля ДокументРасчетов, СуммаНачальныйОстаток, СуммаПриход, СуммаРасход, СуммаКонечныйОстаток.
      • Для полей СуммаНачальныйОстаток, СуммаПриход, СуммаРасход, СуммаКонечныйОстаток можно установить агрегатные функции "Сумма".

Реализация учета долгов по продажам и возвратам

Как мы обсуждали ранее, для раздельного учета долгов по продажам и возвратам есть два основных подхода.

  1. Вариант 1: Дополнительное измерение ВидВзаиморасчетов в едином регистре.

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

    1. Модификация регистра:

      В конфигураторе, в регистре накопления "РасчетыСПокупателями" (или аналогичном) добавляем новое измерение, например, ВидВзаиморасчетов. Его тип может быть "Перечисление.ВидыВзаиморасчетов" (если вы создадите такое перечисление с элементами "Продажа", "Возврат") или "Строка" (если достаточно текстового наименования).

    2. Изменение движений документов:

      Необходимо доработать модули проведения документов, которые формируют движения по этому регистру. Например:

      • В документе "Реализация товаров и услуг" при формировании движений по регистру "РасчетыСПокупателями" для измерения ВидВзаиморасчетов устанавливать значение "Продажа".
      • В документе "Возврат товаров от клиента" при формировании движений для измерения ВидВзаиморасчетов устанавливать значение "Возврат".
      • Аналогично для документов оплаты, если они тоже должны иметь такой вид (хотя чаще оплата просто уменьшает долг по документу расчетов, вне зависимости от его "вида").
    3. Построение отчета в СКД:

      В запрос к регистру РасчетыСПокупателями.ОстаткиИОбороты мы просто добавляем наше новое измерение ВидВзаиморасчетов:

      
      ВЫБРАТЬ
          РасчетыСПокупателямиОстаткиИОбороты.Контрагент,
          РасчетыСПокупателямиОстаткиИОбороты.ДоговорКонтрагента,
          РасчетыСПокупателямиОстаткиИОбороты.ДокументРасчетов,
          РасчетыСПокупателямиОстаткиИОбороты.ВидВзаиморасчетов, // Добавили новое измерение
          РасчетыСПокупателямиОстаткиИОбороты.СуммаНачальныйОстаток,
          РасчетыСПокупателямиОстаткиИОбороты.СуммаПриход,
          РасчетыСПокупателямиОстаткиИОбороты.СуммаРасход,
          РасчетыСПокупателямиОстаткиИОбороты.СуммаКонечныйОстаток
      ИЗ
          РегистрНакопления.РасчетыСПокупателями.ОстаткиИОбороты(
              &НачалоПериода,
              &КонецПериода,
              Авто,
              ,
              &ОтборПоВидуВзаиморасчетов // Можно добавить отбор по этому полю
          ) КАК РасчетыСПокупателямиОстаткиИОбороты
      

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

  2. Вариант 2: Объединение данных из разных регистров в СКД.

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

    1. Запрос с ОБЪЕДИНИТЬ ВСЕ:

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

      
      ВЫБРАТЬ
          РасчетыПоПродажамОстаткиИОбороты.Контрагент КАК Контрагент,
          РасчетыПоПродажамОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
          РасчетыПоПродажамОстаткиИОбороты.ДокументРасчетов КАК ДокументРасчетов,
          "Продажа" КАК ВидВзаиморасчетов, // Идентифицируем источник
          РасчетыПоПродажамОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
          РасчетыПоПродажамОстаткиИОбороты.СуммаПриход КАК СуммаПриход,
          РасчетыПоПродажамОстаткиИОбороты.СуммаРасход КАК СуммаРасход,
          РасчетыПоПродажамОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
      ИЗ
          РегистрНакопления.РасчетыПоПродажам.ОстаткиИОбороты(
              &НачалоПериода,
              &КонецПериода,
              Авто,
              ,
              // Отборы для регистра продаж
          ) КАК РасчетыПоПродажамОстаткиИОбороты
                      
      ОБЪЕДИНИТЬ ВСЕ
                      
      ВЫБРАТЬ
          РасчетыПоВозвратамОстаткиИОбороты.Контрагент,
          РасчетыПоВозвратамОстаткиИОбороты.ДоговорКонтрагента,
          РасчетыПоВозвратамОстаткиИОбороты.ДокументРасчетов,
          "Возврат", // Идентифицируем источник
          РасчетыПоВозвратамОстаткиИОбороты.СуммаНачальныйОстаток,
          РасчетыПоВозвратамОстаткиИОбороты.СуммаПриход,
          РасчетыПоВозвратамОстаткиИОбороты.СуммаРасход,
          РасчетыПоВозвратамОстаткиИОбороты.СуммаКонечныйОстаток
      ИЗ
          РегистрНакопления.РасчетыПоВозвратам.ОстаткиИОбороты(
              &НачалоПериода,
              &КонецПериода,
              Авто,
              ,
              // Отборы для регистра возвратов
          ) КАК РасчетыПоВозвратамОстаткиИОбороты
      

      Обратите внимание, что мы добавили строковое поле "Продажа" КАК ВидВзаиморасчетов и "Возврат", чтобы в объединенном результате мы могли отличить, откуда пришли данные. Это поле затем используем для группировок или отборов.

    2. Настройка отчета СКД:

      Далее, настройка отчета в СКД будет аналогична Варианту 1, используя созданное в запросе поле ВидВзаиморасчетов для группировок или отборов.

Настройка горизонтальной группировки в СКД

Требование отображать поле, например, "Счет взаиморасчета" (или ВидВзаиморасчетов) в виде горизонтальной группировки, то есть в виде отдельных колонок, является распространенной задачей в аналитической отчетности. СКД предоставляет для этого удобные механизмы.

  1. Определение горизонтальной группировки:

    В структуре отчета СКД (на закладке "Настройки") вы создаете или выбираете уже существующую группировку, которую хотите сделать горизонтальной. Например, у нас есть группировка "Контрагент", а внутри нее мы хотим по горизонтали отобразить "ВидВзаиморасчетов".

  2. Установка типа группировки:

    Для поля, которое вы хотите отобразить горизонтально (например, ВидВзаиморасчетов), выполните следующие действия:

    1. Выделите соответствующую группировку в структуре отчета.
    2. Нажмите на кнопку "Добавить группировку" или "Изменить группировку" (если она уже существует).
    3. В открывшемся окне "Редактирование группировки" перейдите на вкладку "Дополнительные настройки" (или "Прочее").
    4. Найдите свойство "Расположение общих итогов" и установите его в значение "Нет", если не нужны общие итоги по этой горизонтальной группировке.
    5. Самое главное: в настройках самой группировки в разделе "Общие" (или "Основное"), где вы указываете поле для группировки, рядом с полем ВидВзаиморасчетов (или СчетВзаиморасчета) есть свойство "Тип". По умолчанию оно "Обычный". Вам необходимо установить его в значение "Горизонтальный".
    6. Также может быть полезно настроить свойство "Расположение полей группировки" для родительской группировки (например, "Контрагент") в "Отдельные колонки" или "В одной колонке с общими итогами", в зависимости от желаемого вида отчета.
  3. Пример структуры:

    Представьте, что вы хотите получить отчет, где для каждого контрагента будут колонки "Долг по продажам" и "Долг по возвратам".

    
    Группировка: Контрагент (Тип: Обычный)
        |__Группировка: ВидВзаиморасчетов (Тип: Горизонтальный)
            |__Детальные записи:
                |__Поля: ДокументРасчетов, СуммаКонечныйОстаток
    

    В этом случае СКД создаст колонки для каждого уникального значения ВидВзаиморасчетов (например, "Продажа", "Возврат"), и в них будут отображены соответствующие остатки по документам.

Важно: При использовании горизонтальных группировок, агрегатные функции для ресурсов (например, СуммаКонечныйОстаток) будут применяться внутри каждой горизонтальной группы. То есть, если вы выводите Сумма(СуммаКонечныйОстаток), то в колонке "Продажа" будет сумма остатков только по продажам, а в колонке "Возврат" - только по возвратам.

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

← На главную