Как в 1С получить список неоплаченных реализаций при ведении учета по договору в целом?

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

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

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

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

Решение 1: Использование специализированных регистров

Прежде чем приступать к написанию сложных алгоритмов, проверим, не ведется ли в вашей базе детализированный учет. В УПП 1.3 и КА 1.1 существует регистр накопления ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов. Рассмотрим, как извлечь из него данные:


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

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

Решение 2: Реализация алгоритма FIFO в запросе (Накопленный итог)

Если детального учета нет, нам придется эмулировать распределение оплат. Разберем по шагам логику, которую необходимо реализовать в запросе:

  1. Сбор всех отгрузок: Получаем список всех реализаций по договору, упорядоченных по дате и моменту времени.
  2. Расчет накопленного долга: Для каждой реализации вычисляем сумму всех предыдущих реализаций плюс текущую.
  3. Получение общей суммы оплат: Вычисляем общую сумму всех входящих платежей (ПКО, Входящие платежные поручения) по этому договору.
  4. Сравнение: Накладная считается неоплаченной, если её накопленный итог превышает общую сумму оплат.

Проанализируем пример построения такого запроса через соединение таблицы самой с собой. Посмотрим на пример кода:


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Реализация,
    ВТ.СуммаНакладной,
    ВТ.НакопленныйДолг,
    ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток, 0) КАК ОбщийДолгПоДоговору
ИЗ
    ВТ_Отгрузки КАК ВТ
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&Период, ДоговорКонтрагента = &Договор) КАК ВзаиморасчетыОстатки
        ПО (ИСТИНА)
ГДЕ
    ВТ.НакопленныйДолг > (ВТ.НакопленныйДолг - ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток)

Внимание: Использование условия >= при соединении больших таблиц может существенно замедлить работу системы. Рассмотрим этот метод как рабочий для небольших объемов данных или при условии жесткой фильтрации по контрагенту.

Решение 3: Использование типовых процедур (Акт сверки)

Как справедливо отмечено в обсуждении, алгоритм распределения оплат по накладным уже реализован в типовых механизмах, например, в документе АктСверкиВзаиморасчетов. Если ваша задача — выгрузка данных для торговых представителей, эффективнее использовать программный перебор выборки в коде обработки, а не чистый запрос.

Разберем логику программного распределения:

  1. Получаем остаток долга по регистру ВзаиморасчетыСКонтрагентами на текущую дату.
  2. Выбираем все документы РеализацияТоваровУслуг по данному договору, отсортированные в обратном порядке (от новых к старым).
  3. В цикле «отнимаем» суммы накладных от общей суммы долга. Пока остаток долга больше нуля — накладная считается неоплаченной (или частично оплаченной).

Этот метод работает быстрее сложного запроса и проще в отладке. Для решения этой задачи можно использовать отчет по задолженности с детализацией по документам на основе регистра взаиморасчетов.

Связь с требованиями 54-ФЗ и номенклатурой в чеках

Выясним причину, по которой эта задача стала особенно актуальной после 01.02.2021. Согласно законодательству, в кассовых чеках (в том числе при оплате через ПКО) должна указываться номенклатура товаров. Если вы принимаете оплату по договору, за которым стоят десятки отгрузок, 1С должна «понимать», за какие именно товары пришла оплата.

Рекомендации по реализации для чеков:

Особенности учета возвратов

Проанализируем ситуацию с возвратами товаров. Документ ВозвратТоваровОтПокупателя уменьшает задолженность контрагента. При реализации ФИФО-алгоритма (хоть в запросе, хоть программно) возвраты следует учитывать как «псевдооплаты». То есть сумма всех оплат для расчета должна складываться из денежных поступлений и сумм возвратов. В противном случае накладная будет числиться неоплаченной, хотя фактически товар по ней был возвращен на склад.

Итоги

Для решения задачи поиска неоплаченных реализаций в УПП 1.3 / УТ 10.3 при суммовом учете мы рекомендуем:

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