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