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