При разработке отчетов по взаиморасчетам в системе «1С:Предприятие 8» начинающие разработчики часто сталкиваются с задачей корректного вывода начального остатка, приходов (увеличения долга) и расходов (погашения долга) за произвольный период. Основная сложность заключается в понимании того, как платформа работает с регистрами накопления и их виртуальными таблицами. Рассмотрим подробно, как реализовать такой отчет, используя механизмы запросов и Систему компоновки данных (СКД).
Прежде чем приступать к построению отчета, проанализируем источник данных. Для учета долгов в 1С используется объект Регистр накопления с видом Остатки. Важно понимать, что именно этот вид регистра позволяет системе хранить не только движения (обороты), но и рассчитывать итоги на любую точку времени.
Рассмотрим ситуацию: у нас есть документ РеализацияТоваровИУслуг, который делает движение «Приход» в регистр ВзаиморасчетыСПокупателями. Это движение и является «увеличением долга». Если же покупатель оплачивает товар, документ ПоступлениеНаРасчетныйСчет делает движение «Расход» — это уменьшение долга.
Самый эффективный и правильный метод получения данных для такого отчета — использование виртуальной таблицы ОстаткиИОбороты. Платформа 1С автоматически рассчитывает все необходимые показатели, избавляя нас от необходимости писать сложные арифметические выражения в запросе.
Разберем структуру запроса к этой таблице. Виртуальная таблица принимает несколько параметров: начало периода, конец периода, периодичность, условие дополнения и отбор.
ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Контрагент КАК Контрагент,
ВзаиморасчетыОстаткиИОбороты.СуммаНачальныйОстаток КАК ДолгНаНачало,
ВзаиморасчетыОстаткиИОбороты.СуммаПриход КАК УвеличениеДолга,
ВзаиморасчетыОстаткиИОбороты.СуммаРасход КАК ПогашениеДолга,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток КАК ДолгНаКонец
ИЗ
РегистрНакопления.ВзаиморасчетыСПокупателями.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ВзаиморасчетыОстаткиИОбороты
В данном примере СуммаНачальныйОстаток — это и есть долг на дату &НачалоПериода. Поле СуммаПриход отражает все операции по увеличению задолженности за выбранный интервал времени.
Иногда возникают ситуации, когда необходимо рассчитать начальный остаток вручную, имея на руках данные о конечном остатке и оборотах. Проанализируем математическую зависимость этих величин:
НачальныйОстаток = КонечныйОстаток - ОборотПриход + ОборотРасход
Этот метод часто используется в учебных задачах или при работе с реальными таблицами движений, когда использование виртуальных таблиц по каким-то причинам ограничено. Однако в промышленной разработке на платформе 1С 8.3 рекомендуется всегда использовать штатные виртуальные таблицы, так как они работают значительно быстрее за счет использования заранее рассчитанных итогов в базе данных.
Просто написать запрос недостаточно. Чтобы отчет корректно отображал итоги по группировкам (например, общую сумму долга по всем контрагентам), необходимо правильно настроить Роли полей в СКД. Выясним, как это сделать по шагам:
СуммаНачальныйОстаток в колонке «Роль» необходимо указать тип «Остаток», выбрать категорию «Начальный» и обязательно связать его с полем конечного остатка.СуммаКонечныйОстаток указываем роль «Остаток» и категорию «Конечный».Посмотрим на пример настройки ресурсов. На закладке Ресурсы мы должны добавить наши числовые поля. Для оборотов (Увеличение долга) используется стандартная функция Сумма(ИмяПоля). Для остатков СКД сама поймет, как их рассчитывать, если роли настроены верно.
Рассмотрим ситуацию, когда по контрагенту был долг на начало месяца, но в течение месяца никаких покупок или оплат не было. Если просто выполнить запрос к таблице ОстаткиИОбороты, такой контрагент может не попасть в отчет, так как движений по нему не было.
Чтобы решить эту проблему, проанализируем настройки вкладки Настройки в СКД:
ПериодДень).Это заставит систему выводить строки даже за те периоды, в которых не было активности, сохраняя значение начального долга неизменным на протяжении всего отчета.
Если вы решаете учебную задачу на пустой конфигурации, убедитесь, что выполнены следующие условия:
РегистрНакопления (вид — Остатки).Контрагент) и один ресурс (Сумма).Проанализируем пример программного формирования движений в модуле документа:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Сумма = СуммаДокумента;
КонецПроцедуры
Без этого программного кода данные в регистр не попадут, и отчет всегда будет пустым. Выясним причину, если цифры в отчете не сходятся: скорее всего, не установлены границы периода в параметрах виртуальной таблицы. По умолчанию 1С включает нижнюю границу (НачалоПериода), но может не включать верхнюю (КонецПериода), если время документа позже времени границы. Рекомендуется использовать функцию КонецПериода(&КонецПериода, День) для корректного захвата всех документов последнего дня.
Таким образом, сочетание правильного запроса к виртуальной таблице ОстаткиИОбороты и грамотной настройки ролей полей в СКД позволяет создать надежный и точный отчет по долгам, который будет корректно отображать как начальное состояние, так и динамику изменений за период.