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

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

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

Понимание структуры данных: Регистр накопления

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

Рассмотрим ситуацию: у нас есть документ РеализацияТоваровИУслуг, который делает движение «Приход» в регистр ВзаиморасчетыСПокупателями. Это движение и является «увеличением долга». Если же покупатель оплачивает товар, документ ПоступлениеНаРасчетныйСчет делает движение «Расход» — это уменьшение долга.

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

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

Разберем структуру запроса к этой таблице. Виртуальная таблица принимает несколько параметров: начало периода, конец периода, периодичность, условие дополнения и отбор.


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

В данном примере СуммаНачальныйОстаток — это и есть долг на дату &НачалоПериода. Поле СуммаПриход отражает все операции по увеличению задолженности за выбранный интервал времени.

Способ 2. Математический расчет через конечный остаток

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

НачальныйОстаток = КонечныйОстаток - ОборотПриход + ОборотРасход

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

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

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

  1. Откроем схему компоновки данных и перейдем на закладку Наборы данных.
  2. Для поля СуммаНачальныйОстаток в колонке «Роль» необходимо указать тип «Остаток», выбрать категорию «Начальный» и обязательно связать его с полем конечного остатка.
  3. Аналогично для поля СуммаКонечныйОстаток указываем роль «Остаток» и категорию «Конечный».
  4. Это критически важно для того, чтобы при суммировании данных по периодам (например, если отчет выводится по дням) начальный остаток за неделю не складывался из начальных остатков каждого дня, а брался именно на начало первого дня недели.

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

Работа с отсутствующими движениями (Дополнение периодов)

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

Чтобы решить эту проблему, проанализируем настройки вкладки Настройки в СКД:

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

Особенности для «пустых» (самописных) конфигураций

Если вы решаете учебную задачу на пустой конфигурации, убедитесь, что выполнены следующие условия:

  1. Создан РегистрНакопления (вид — Остатки).
  2. В регистре создано как минимум одно измерение (например, Контрагент) и один ресурс (Сумма).
  3. Существуют документы, которые являются регистраторами для этого регистра и имеют код для формирования движений.

Проанализируем пример программного формирования движений в модуле документа:


Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.Взаиморасчеты.Записывать = Истина;
    Движение = Движения.Взаиморасчеты.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Контрагент = Контрагент;
    Движение.Сумма = СуммаДокумента;
КонецПроцедуры

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

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

← На главную