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