При разработке собственных отчетов или доработке форм в конфигурации 1С:Управление торговлей 11 часто возникает задача отобразить развернутое сальдо взаиморасчетов с партнером. Пользователям необходимо четко видеть две раздельные суммы: Долг контрагента (дебиторская задолженность за отгруженные товары) и Наш долг (кредиторская задолженность, то есть полученные авансы или задолженность перед поставщиком).
Однако при попытке написать простой запрос к виртуальной таблице остатков регистра накопления разработчики часто получают свернутое (сальдированное) значение, где положительные и отрицательные суммы взаимно погашают друг друга. Разберем по шагам, почему так происходит и как правильно сформировать запрос для получения развернутых остатков.
Рассмотрим типовой ошибочный запрос к регистру накопления РасчетыСКлиентами:
ВЫБРАТЬ
РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам,
РасчетыСКлиентамиОстатки.СуммаОстаток
ИЗ
РегистрНакопления.РасчетыСКлиентами.Остатки(&Период, АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСКлиентамиОстатки
Проанализируем, почему этот запрос возвращает свернутую разницу между долгом и авансом:
РасчетыСКлиентами положительное значение ресурса СуммаОстаток означает долг клиента, а отрицательное — полученный аванс (наш долг). Если в параметрах выборки указана только аналитика партнера/контрагента и не выбраны подчиненные аналитические разрезы (заказ клиента, расчетный документ), виртуальная таблица СУБД автоматически суммирует все положительные и отрицательные числа по контрагенту в одно итоговое число.РасчетыСКлиентами и РасчетыСПоставщиками.Для корректного разделения долга партнера и нашего долга необходимо во вложенном запросе получить остатки в разрезе объектов расчетов, а во внешнем запросе разделить положительные и отрицательные суммы через конструкцию ВЫБОР КОГДА ... и сгруппировать результат по контрагенту или партнеру.
Посмотрим на пример правильного построения запроса:
ВЫБРАТЬ
ВложенныйЗапрос.Партнер КАК Партнер,
ВложенныйЗапрос.Контрагент КАК Контрагент,
СУММА(ВложенныйЗапрос.ДолгПартнера) КАК ДолгПартнера,
СУММА(ВложенныйЗапрос.НашДолг) КАК НашДолг
ИЗ
(ВЫБРАТЬ
РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
ВЫБОР
КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток > 0
ТОГДА РасчетыСКлиентамиОстатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ КАК ДолгПартнера,
ВЫБОР
КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток < 0
ТОГДА -РасчетыСКлиентамиОстатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ КАК НашДолг
ИЗ
РегистрНакопления.РасчетыСКлиентами.Остатки(
&Период,
АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСКлиентамиОстатки) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Партнер,
ВложенныйЗапрос.Контрагент
Разберем логику работы этого запроса:
РасчетыСКлиентами.Остатки данные извлекаются без свертки по партнеру, сохраняя знак каждого конкретного расчетного остатка.СуммаОстаток > 0) интерпретируется как ДолгПартнера.СуммаОстаток < 0) с обратным знаком (-РасчетыСКлиентамиОстатки.СуммаОстаток) формирует колонку НашДолг.СУММА и группирует их по контрагенту. В результате мы получаем корректное развернутое сальдо.Если контрагент ведет с компанией двустороннюю деятельность, необходимо объединить данные из регистров расчетов с клиентами и с поставщиками с помощью конструкции ОБЪЕДИНИТЬ ВСЕ.
Рассмотрим пример сводного запроса:
ВЫБРАТЬ
ТаблицаРасчетов.Партнер КАК Партнер,
ТаблицаРасчетов.Контрагент КАК Контрагент,
СУММА(ТаблицаРасчетов.ДолгПартнера) КАК ДолгПартнера,
СУММА(ТаблицаРасчетов.НашДолг) КАК НашДолг
ИЗ
(ВЫБРАТЬ
РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
ВЫБОР
КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток > 0
ТОГДА РасчетыСКлиентамиОстатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ КАК ДолгПартнера,
ВЫБОР
КОГДА РасчетыСКлиентамиОстатки.СуммаОстаток < 0
ТОГДА -РасчетыСКлиентамиОстатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ КАК НашДолг
ИЗ
РегистрНакопления.РасчетыСКлиентами.Остатки(&Период, АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСКлиентамиОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РасчетыСПоставщикамиОстатки.АналитикаУчетаПоПартнерам.Партнер,
РасчетыСПоставщикамиОстатки.АналитикаУчетаПоПартнерам.Контрагент,
ВЫБОР
КОГДА РасчетыСПоставщикамиОстатки.СуммаОстаток < 0
ТОГДА -РасчетыСПоставщикамиОстатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ,
ВЫБОР
КОГДА РасчетыСПоставщикамиОстатки.СуммаОстаток > 0
ТОГДА РасчетыСПоставщикамиОстатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ
ИЗ
РегистрНакопления.РасчетыСПоставщиками.Остатки(&Период, АналитикаУчетаПоПартнерам.Контрагент = &Контрагент) КАК РасчетыСПоставщикамиОстатки) КАК ТаблицаРасчетов
СГРУППИРОВАТЬ ПО
ТаблицаРасчетов.Партнер,
ТаблицаРасчетов.Контрагент
Важный нюанс: В регистре РасчетыСПоставщиками смысл знака противоположный: положительный остаток означает задолженность нашей организации перед поставщиком (Наш долг), а отрицательный — аванс, выданный поставщику (Долг партнера).
При работе с взаиморасчетами в 1С:УТ 11 следует помнить о следующих особенностях архитектуры конфигурации:
ВзаиморасчетыСервер, которые автоматически учитывают ключи аналитики учета по партнерам, валюты договоров и правила зачета оплат.