В типовых конфигурациях 1С (например, УТ 10.3 или старых редакциях КА) отчет по валовой прибыли чаще всего анализирует отгрузки, не привязываясь к факту поступления денежных средств от покупателя. Однако для управленческого учета часто требуется видеть прибыль только по тем позициям, которые фактически оплачены. Сложность заключается в том, что в системе 1С оплата обычно фиксируется в целом по документу (заказу или накладной), а не по каждой конкретной позиции номенклатуры. Разберем, какими методами можно решить эту задачу и как реализовать алгоритм распределения оплаты.
Когда накладная оплачена частично, перед разработчиком встает дилемма: какие именно товары считать оплаченными? Рассмотрим два основных подхода, которые обычно предлагают бизнес-аналитики:
Проанализируем ситуацию: клиент часто просит именно второй вариант («любые товары на сумму оплаты»), но программно проще и логичнее реализовать первый. Выясним, как реализовать оба подхода средствами языка запросов и СКД.
Этот метод считается стандартным для современных конфигураций (УТ 11, ERP 2). Его суть заключается в определении коэффициента оплаты для каждого документа. Разберем алгоритм по шагам:
Во-первых, создадим запрос, который получает данные о продажах из регистра накопления Продажи (или ВыручкаИСебестоимостьПродаж). Нам понадобятся поля: Регистратор (документ отгрузки), Номенклатура, Количество, СуммаВыручки и Себестоимость.
Во-вторых, в этом же запросе или отдельным набором данных получим остатки задолженности по этим же документам из регистров расчетов (например, РасчетыСКлиентами). Сумма оплаты по документу будет вычисляться как СуммаДокумента - ОстатокДолга.
В-третьих, вычислим коэффициент оплаты. В СКД это удобно сделать через вычисляемые поля:
КоэффициентОплаты = СуммаОплаты / СуммаДокумента
Затем для каждой строки номенклатуры мы умножаем СуммаВыручки и Себестоимость на этот коэффициент. Таким образом, мы получаем корректные данные для расчета прибыли по оплате.
Если же стоит задача реализовать логику «любые товары на сумму оплаты», нам придется использовать более сложную технику в запросе — получение нарастающего итога по строкам документа. Рассмотрим подробнее, как это сделать без использования циклов Пока в коде, а прямо в теле запроса.
Для этого нам необходимо соединить таблицу товаров саму с собой по условию НомерСтроки. Проанализируем пример кода:
ВЫБРАТЬ
Т1.Ссылка КАК Документ,
Т1.Номенклатура,
Т1.СуммаРеализации КАК СуммаСтроки,
СУММА(Т2.СуммаРеализации) КАК НакопленнаяСумма,
Оплаты.СуммаОплаты КАК ОбщаяОплатаПоДокументу
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Т2
ПО Т1.Ссылка = Т2.Ссылка
И Т1.НомерСтроки >= Т2.НомерСтроки
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Документ, СУММА(Сумма) КАК СуммаОплаты ИЗ Регистр.Расчеты ГРУППИРОВАТЬ ПО Документ) КАК Оплаты
ПО Т1.Ссылка = Оплаты.Документ
СГРУППИРОВАТЬ ПО
Т1.Ссылка, Т1.Номенклатура, Т1.СуммаРеализации, Оплаты.СуммаОплаты
В результате этого запроса для каждой строки номенклатуры мы получим поле НакопленнаяСумма. Теперь мы можем применить логику условий:
НакопленнаяСумма <= ОбщаяОплатаПоДокументу, то товар оплачен полностью.НакопленнаяСумма - СуммаСтроки < ОбщаяОплатаПоДокументу и НакопленнаяСумма > ОбщаяОплатаПоДокументу, то товар оплачен частично. Сумма оплаты в этой строке равна ОбщаяОплатаПоДокументу - (НакопленнаяСумма - СуммаСтроки).Важно помнить, что при частичной оплате строки себестоимость также должна распределяться пропорционально. Если мы признаем оплаченными только 2 единицы товара из 10, то и в расходную часть отчета (себестоимость) должна попасть стоимость только этих 2 единиц. В противном случае показатель валовой прибыли будет рассчитан неверно.
Рассмотрим ситуацию с возвратами. При использовании метода нарастающего итога возвраты могут существенно усложнить логику. Проанализируем: если клиент вернул товар, который мы уже считали «оплаченным» по списку, нам нужно пересчитать распределение для всей накладной. Именно поэтому многие разработчики склоняются к использованию дополнительного регистра сведений, где распределение оплат фиксируется физически в момент проведения документов оплаты или регламентной операцией закрытия месяца.
Прежде чем приступать к разработке сложного запроса, посмотрите на типовые механизмы. В некоторых конфигурациях, где реализован партионный учет или учет по УСН, система уже делает подобное распределение для формирования Книги учета доходов и расходов. В коде модулей, отвечающих за расчеты по налогам, можно найти готовые функции распределения платежей по документам отгрузки и их товарному составу.
Подведем итог. Для реализации отчета «Валовая прибыль по оплаченным продажам» наиболее оптимальным является использование СКД с расчетом доли оплаты по каждому документу реализации. Это обеспечивает прозрачность данных и легкость в сопровождении кода. Если же требуется жесткий порядок оплаты конкретных позиций, используйте механизм нарастающего итога в запросах, соединяя таблицы по номеру строки.