Как правильно связать данные прихода и расхода в одном запросе СКД?

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

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

Почему стандартные связи не работают?

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

Решение 1: Нормализация данных через ОБЪЕДИНИТЬ ВСЕ

Это самый надежный и правильный способ организации данных в 1С. Вместо того чтобы пытаться «склеить» горизонтальную структуру документа, мы переводим ее в вертикальную. Мы превращаем набор полей «приход» и «расход» в единый список движений с признаком вида операции.

Для этого в первом наборе данных (набор «Документ») создайте запрос, который разбивает документ на две части:


ВЫБРАТЬ 
    ЗакрытиеДолга.Ссылка КАК Ссылка, 
    ЗакрытиеДолга.Дата КАК Дата, 
    ЗакрытиеДолга.ВалютаПриход КАК Валюта, 
    ЗакрытиеДолга.КлиентПриход КАК Клиент, 
    ЗакрытиеДолга.СуммаПриход КАК Сумма, 
    "Приход" КАК ВидДвижения
ИЗ Документ.ЗакрытиеДолга КАК ЗакрытиеДолга
ГДЕ ЗакрытиеДолга.Дата МЕЖДУ &НачПериода И &КонПериода

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ 
    ЗакрытиеДолга.Ссылка, 
    ЗакрытиеДолга.Дата, 
    ЗакрытиеДолга.ВалютаРасход, 
    ЗакрытиеДолга.КлиентРасход, 
    ЗакрытиеДолга.СуммаРасход, 
    "Расход"
ИЗ Документ.ЗакрытиеДолга КАК ЗакрытиеДолга
ГДЕ ЗакрытиеДолга.Дата МЕЖДУ &НачПериода И &КонПериода

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

Решение 2: Использование вычисляемых полей в СКД

Если вы не хотите менять структуру запроса, вы можете воспользоваться функционалом вычисляемых полей. Суть метода заключается в следующем:

  1. Получите данные из документа как есть (одной строкой).
  2. В настройках набора данных не делайте жестких связей, которые фильтруют строки.
  3. В на вкладке «Вычисляемые поля» создайте поля с логикой:

// Для колонки СуммаПриходСум:
ВЫБОР 
    КОГДА ВалютаПриход = "$" ТОГДА СуммаПриход 
    ИНАЧЕ 0 
КОНЕЦ

// Для колонки СуммаРасходСум:
ВЫБОР 
    КОГДА ВалютаРасход = "$" ТОГДА СуммаРасход 
    ИНАЧЕ 0 
КОНЕЦ

Этот подход позволяет избежать NULL значений, так как вы явно указываете системе, как обрабатывать отсутствие данных или несовпадение валют. Используйте функцию ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ, чтобы распределить суммы по колонкам отчета в зависимости от условий.

Полезные советы по отладке

Чтобы понять, где именно теряются данные, мы рекомендуем следующие шаги:

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

← На главную