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