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

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При создании отчетов на Системе компоновки данных (СКД) часто возникает ситуация, когда попытка соединить два регистра накопления в одном запросе приводит к логической ошибке: данные первого набора «задваиваются» или «затраиваются». Это происходит из-за того, что на одну запись из первого регистра приходится несколько записей из второго (связь «один-ко-многим»), что в SQL-запросе создает декартово произведение.

Рассмотрим, как правильно решить эту проблему, не допуская искажения показателей.

Метод 1: Использование связей наборов данных в СКД

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

  1. Перейдите на вкладку Наборы данных. Добавьте два отдельных запроса. Первый пусть получает данные о СдельнойОплате, второй — о ПотребностяхВТМЦ.
  2. Перейдите на вкладку Связи наборов данных.
  3. Укажите Источник связи (первый набор) и Приемник связи (второй набор).
  4. Укажите параметры связи (например, РабочийЦентр или Регистратор).

Преимущество: СКД выполняет соединение результатов после того, как каждый набор данных сформировал свою уникальную выборку. Это исключает дублирование строк, которое происходит при ЛЕВОМ СОЕДИНЕНИИ на уровне СУБД.

Метод 2: Настройка ресурсов и управление выводом

Иногда после связывания наборов данных возникает проблема: ресурсы (например, количество деталей) суммируются или отображаются во всех группировках. Чтобы управлять этим, используйте возможности языка выражений СКД.

Если данные все же отображаются некорректно, попробуйте изменить расчет ресурсов:


// В поле Расчет ресурсов для показателя используйте:
Максимум(КолПриход) 
// Для итоговых группировок используйте:
ВычислитьВыражениеСГруппировкойМассив(Сумма(КолПриход), "СдельнаяОперация")

Также, чтобы визуально скрыть избыточные данные в детализированных записях, воспользуйтесь Условным оформлением:

Метод 3: Использование временных таблиц

Если вы принципиально хотите оставить всё в одном запросе, необходимо предварительно «свернуть» данные второго набора, чтобы он содержал уникальные ключи для соединения.

Разберем пример создания временной таблицы:


ВЫБРАТЬ
    ПотребностиВТМЦ.Регистратор КАК Регистратор,
    СУММА(ОстаткиТМЦ.КолПриход) КАК КолПриход
ПОМЕСТИТЬ ВТ_Материалы
ИЗ РегистрНакопления.ПотребностиВТМЦ КАК ПотребностиВТМЦ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТМЦ.ОстаткиИОбороты КАК ОстаткиТМЦ
ПО ПотребностиВТМЦ.Номенклатура = ОстаткиТМЦ.Номенклатура
СГРУППИРОВАТЬ ПО ПотребностиВТМЦ.Регистратор;

ВЫБРАТЬ
    СдельнаяОплата.СдельнаяОперация,
    ВТ_Материалы.КолПриход
ИЗ РегистрНакопления.СдельнаяОплата КАК СдельнаяОплата
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Материалы КАК ВТ_Материалы
ПО СдельнаяОплата.ДокПриход = ВТ_Материалы.Регистратор;

Почему это работает: Использование ПОМЕСТИТЬ позволяет создать промежуточный срез данных. Когда мы соединяем основной запрос с ВТ_Материалы, у нас уже нет риска «размножения» строк, так как по каждому Регистратору в ВТ_Материалы осталась только одна строка с суммарными данными.

Советы по оптимизации

При настройке отчетов всегда помните об этих правилах:

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

← На главную