Как отобрать в отчет только неоплаченные расходные накладные в 1С:УНФ на СКД?

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

При работе с внешними отчетами на системе компоновки данных (СКД) в 1С:УНФ часто возникает задача отбора документов по их статусу оплаты. Одна из наиболее распространенных проблем — как корректно отобрать только неоплаченные расходные накладные. Казалось бы, простая задача, но на практике она имеет множество нюансов, связанных с механизмом учета взаиморасчетов в 1С.

Рассмотрим подробнее, почему прямые и очевидные условия отбора, такие как проверка суммы оплаты на равенство нулю, не всегда работают, и как правильно подойти к решению этой задачи, используя возможности регистров накопления и СКД.

Анализ проблем некорректного отбора

Многие пользователи, столкнувшись с необходимостью отбора неоплаченных документов, интуитивно пытаются использовать простые условия. Например, в сообщении 2 было предложено условие ГДЕ Т.Сумма = 0. Однако, как показал автор в сообщении 3, такие подходы часто оказываются неэффективными или даже ошибочными:


РасчетыСПокупателями.ДокументОплаты.СуммаДокумента = 0 // не отбирает ничего
РасчетыСПокупателями.ДокументОплаты.СуммаПлатежа = 0 // отбирает и неоплаченные, и оплаченные

Выясним причину такого поведения. Дело в том, что в регистре РасчетыСПокупателями могут содержаться записи по расходным накладным, где поле СуммаПлатежа будет пустым или равным нулю даже для частично оплаченных или полностью оплаченных документов, если оплата была проведена другим документом и зачтена позднее, или если данные в регистр попадают с разных сторон (приход/расход). Более того, механизмы зачета авансов и частичных оплат значительно усложняют прямую проверку суммы. Простой факт отсутствия документа оплаты или нулевой суммы платежа не всегда означает полную неоплаченность накладной.

Для сравнения, в сообщении 6 автор приводит пример успешно работающего отбора для оплаченных накладных:

Где РасчетыСПокупателями.ДокументОплаты.СуммаДокумента > 0

Этот пример показывает, что для оплаченных документов проверка на сумму оплаты, большую нуля, работает корректно. Однако для неоплаченных документов требуется более сложная логика, основанная на анализе остатков.

Использование регистра накопления "Расчеты с покупателями"

Ключевым инструментом для определения статуса оплаты расходных накладных в 1С:УНФ является регистр накопления "Расчеты с покупателями". Этот регистр предназначен для учета взаиморасчетов с контрагентами и является источником информации о дебиторской и кредиторской задолженности. В нем фиксируются движения:

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

Для того чтобы отобрать неоплаченные расходные накладные, мы должны анализировать остатки по данному регистру в разрезе документов расчетов. Наличие положительного остатка по "Приходу" (например, от расходной накладной) и отсутствие или недостаточный "Расход" (оплата) будет свидетельствовать о наличии непогашенной задолженности.

Рассмотрим алгоритм действий пошагово:

  1. Выбираем данные из регистра "Расчеты с покупателями". Нам потребуется информация об остатках или оборотах. Для этой цели идеально подходят виртуальные таблицы, такие как РасчетыСПокупателями.Остатки или РасчетыСПокупателями.ОстаткиИОбороты. Если нам нужен анализ на определенную дату, используем .Остатки; если важны движения за период, то .ОстаткиИОбороты или .ОборотыДтКт.
  2. Группируем по документу расчетов. Крайне важно сгруппировать данные по полю ДокументРасчетов, которое в нашем случае будет ссылаться на интересующую нас РасходнуюНакладную. Это позволит нам получить итоговое сальдо по каждой конкретной накладной.
  3. Рассчитываем сумму долга. В рамках группировки мы должны вычислить разницу между приходом и расходом по документу расчетов. Обычно это делается как СуммаПриход - СуммаРасход. Эта разница и будет представлять собой текущую задолженность по конкретной накладной.
  4. Фильтруем результат. Отобрать нам нужно только те накладные, по которым сумма долга (рассчитанная разница) больше нуля. Это означает, что накладная либо не оплачена полностью, либо оплачена частично, и по ней остался непогашенный долг.

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

Примерная логика запроса СКД (псевдокод)

Представим, как может выглядеть запрос для набора данных в СКД:


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

Давайте разберем этот псевдокод:

  1. РегистрНакопления.РасчетыСПокупателями.Остатки(&НаДату, {(ДокументРасчетов.Ссылка).*} ): Здесь мы обращаемся к виртуальной таблице остатков регистра РасчетыСПокупателями.
    • &НаДату: Это параметр, по которому будет сформирован остаток. Например, на текущую дату или на конец заданного периода.
    • {(ДокументРасчетов.Ссылка).*}: Это расширение языка запросов СКД, которое позволяет СКД автоматически добавлять отборы по измерениям (в данном случае по ДокументРасчетов) из пользовательских настроек отчета.
  2. РасчетыСПокупателямиОстатки.СуммаВзаиморасчетовОстаток: Это стандартное поле виртуальной таблицы остатков, которое показывает конечное сальдо (остаток) взаиморасчетов по измерениям, в том числе по ДокументуРасчетов. Если это значение больше нуля, значит, по накладной есть непогашенная задолженность.
  3. ТИПЗНАЧЕНИЯ(РасчетыСПокупателямиОстатки.ДокументРасчетов) = ТИП(Документ.РасходнаяНакладная): Важное условие для того, чтобы отбирать именно расходные накладные, а не другие типы документов, которые тоже могут быть ДокументомРасчетов (например, Заказы покупателей, акты и т.д.).

Использование виртуальной таблицы ОстаткиИОбороты может быть полезно, если вы также хотите видеть обороты за период, но для чистого отбора неоплаченных накладных на текущий момент Остатки часто бывает достаточно.


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

Здесь СуммаВзаиморасчетовКонечныйОстаток аналогично показывает конечное сальдо за указанный период.

Расширение языка запросов СКД для гибких отборов

Для создания максимально гибких отчетов в СКД мы рекомендуем активно использовать синтаксические элементы расширения языка запросов. В частности, для отборов можно использовать вкладку "Отборы" в настройках схемы компоновки данных. Это позволяет:

  1. Получить в набор данных все необходимые записи, а СКД будет автоматически компоновать и применять пользовательские отборы.
  2. Использовать фигурные скобки {} в запросе для создания необязательных параметров. Например, {(ДокументРасчетов.Ссылка)} позволяет пользователю самому установить отбор по конкретному документу расчетов, и если он его не задаст, то условие не будет применено.

Например, если вы хотите дать пользователю возможность отбирать неоплаченные накладные для конкретного контрагента, вы можете добавить параметр Контрагент в виртуальную таблицу регистра:


РегистрНакопления.РасчетыСПокупателями.Остатки(&НаДату, {(ДокументРасчетов.Ссылка).*}, Авто, {(Контрагент).*})

Такой подход делает отчет более универсальным и удобным для использования.

Анализ задолженности через стандартные отчеты УНФ

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

Изучение структуры запросов в этих стандартных отчетах (через режим отладки или конфигуратор) может дать ценные подсказки и примеры для вашей собственной разработки.

Особенности работы с СКД при сложных условиях

Система компоновки данных предоставляет мощные возможности для построения сложных фильтров и условий. Мы можем комбинировать различные условия с использованием операторов "И", "ИЛИ", "НЕ". Это особенно полезно, когда требуется не просто отобрать неоплаченные, но и, например, "неоплаченные более N дней" или "неоплаченные накладные определенных видов номенклатуры".

При построении отчетов на СКД, особенно при использовании нескольких наборов данных или объединении/соединении, важно понимать, как СКД рассчитывает итоги и применяет отборы. Иногда эффективнее получить более широкий набор данных, а затем применять отборы на уровне СКД, а не напрямую в запросе. Это предоставляет пользователю больше гибкости.

Заключение

Отбор неоплаченных расходных накладных в 1С:УНФ на СКД — это не простая проверка на ноль, а комплексная задача, требующая обращения к регистрам накопления и анализа остатков. Используя регистр РасчетыСПокупателями, его виртуальные таблицы Остатки или ОстаткиИОбороты, и фильтруя по положительному значению конечного остатка, мы можем получить точный список неоплаченных документов. Применение расширенных возможностей СКД и изучение стандартных отчетов помогут вам создать гибкие и корректные решения.

← На главную