Как сформировать отчет по валовой прибыли в разрезе оплаченных товаров

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

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

Постановка задачи и выбор методики распределения

Когда накладная оплачена частично, перед разработчиком встает дилемма: какие именно товары считать оплаченными? Рассмотрим два основных подхода, которые обычно предлагают бизнес-аналитики:

  1. Пропорциональное распределение: Если накладная на 100 000 рублей оплачена на 50 000 рублей (т.е. на 50%), то мы считаем, что каждый товар в этой накладной оплачен ровно на 50%. Соответственно, в отчет попадает половина количества, половина выручки и половина себестоимости по каждой строке. Это наиболее методически верный подход для расчета валовой прибыли, так как он не искажает маржинальность.
  2. Последовательное распределение (метод накопленного итога): Мы распределяем сумму оплаты по строкам документа «сверху вниз». Первые товары в списке считаются полностью оплаченными, пока хватает суммы платежа. Одна строка может оказаться оплаченной частично, а остальные — не оплаченными вовсе.

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

Реализация пропорционального распределения в СКД

Этот метод считается стандартным для современных конфигураций (УТ 11, ERP 2). Его суть заключается в определении коэффициента оплаты для каждого документа. Разберем алгоритм по шагам:

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

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

В-третьих, вычислим коэффициент оплаты. В СКД это удобно сделать через вычисляемые поля:

КоэффициентОплаты = СуммаОплаты / СуммаДокумента

Затем для каждой строки номенклатуры мы умножаем СуммаВыручки и Себестоимость на этот коэффициент. Таким образом, мы получаем корректные данные для расчета прибыли по оплате.

Реализация распределения нарастающим итогом (FIFO внутри документа)

Если же стоит задача реализовать логику «любые товары на сумму оплаты», нам придется использовать более сложную технику в запросе — получение нарастающего итога по строкам документа. Рассмотрим подробнее, как это сделать без использования циклов Пока в коде, а прямо в теле запроса.

Для этого нам необходимо соединить таблицу товаров саму с собой по условию НомерСтроки. Проанализируем пример кода:


ВЫБРАТЬ
    Т1.Ссылка КАК Документ,
    Т1.Номенклатура,
    Т1.СуммаРеализации КАК СуммаСтроки,
    СУММА(Т2.СуммаРеализации) КАК НакопленнаяСумма,
    Оплаты.СуммаОплаты КАК ОбщаяОплатаПоДокументу
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Т2
    ПО Т1.Ссылка = Т2.Ссылка 
    И Т1.НомерСтроки >= Т2.НомерСтроки
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Документ, СУММА(Сумма) КАК СуммаОплаты ИЗ Регистр.Расчеты ГРУППИРОВАТЬ ПО Документ) КАК Оплаты
    ПО Т1.Ссылка = Оплаты.Документ
СГРУППИРОВАТЬ ПО
    Т1.Ссылка, Т1.Номенклатура, Т1.СуммаРеализации, Оплаты.СуммаОплаты

В результате этого запроса для каждой строки номенклатуры мы получим поле НакопленнаяСумма. Теперь мы можем применить логику условий:

Технические нюансы и себестоимость

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

Рассмотрим ситуацию с возвратами. При использовании метода нарастающего итога возвраты могут существенно усложнить логику. Проанализируем: если клиент вернул товар, который мы уже считали «оплаченным» по списку, нам нужно пересчитать распределение для всей накладной. Именно поэтому многие разработчики склоняются к использованию дополнительного регистра сведений, где распределение оплат фиксируется физически в момент проведения документов оплаты или регламентной операцией закрытия месяца.

Использование готовых механизмов

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

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

← На главную