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