понедельник, 20 февраля 2017 г.

Скрещиваем разнородные данные в СКД 1С 8. На примере остатков и продаж товаров

Зачастую требуется сводно получать не совсем связанные данные в одну таблицу. Например, требуется в одной таблице получить данные по продажам товаров и их остаткам на складах.
НоменклатураПроданоОстаток всегоСклад 1Склад 2Склад 3
Цветок1245432
Носки60202020
Лампа10
Карандаш555
Итого27110682022
При этом желательно иметь возможность независимо фильтровать данные в каждом наборе. Это могут быть продажи контрагентам определенной группы или остатки только на определенных складах.
В СКД добавляем набор данных запрос, следующего содержания:

ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи,
NULL КАК Склад,
NULL КАК КоличествоОстаток
{ВЫБРАТЬ
Номенклатура.*,
Контрагент.*,
КоличествоПродажи,
Склад,
КоличествоОстаток}
ИЗ
РегистрНакопления.Продажи.Обороты({(&НачПериода)}, {(&КонПериода)}, , {(Номенклатура).*, (Контрагент).*}) КАК ПродажиОбороты
{ГДЕ
ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи}

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

ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура,
NULL,
NULL,
ТоварыНаСкладахОстатки.Склад,
ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки({(&КонПериода)}, {(Номенклатура).*, (Склад).*}) КАК ТоварыНаСкладахОстатки
{ГДЕ
ТоварыНаСкладахОстатки.КоличествоОстаток}

То есть по каждому набору отдельная секция объединения.
Отдельно отмечу, чтобы отборы по количеству действительно работали независимо, их описываем в запросе явно в секциях {ГДЕ}.
В полях СКД Склад и Контрагент добавляем в ролях признаки "Измерение" (вообще-то оно автоматом устанавливается) и признак "Игнорировать NULL". Это делается, чтобы не было пустых фантомных строк и колонок, если продажи есть, а остатков нет или наоборот. Редакируем параметры и ресурсы. Наконец, сами настройки:


В группировке строк "Номенклатура" оставляем саму номенклатуру и ее реквизиты, например, артикул.










В детальных записях информация о продажах:



В группировке колонок Склад - информация об остатках:

И для выразительности устанавливаем у этой группировки "Расположение общих итогов" в значение "Начало".

Вот и все, теперь можно проверить, что отборы по продажам и остаткам работают независимо и корректно. При желании у группировки строк "Номенклатура" можно добавить подгруппировку "Контрагент".