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