Разберем распространенную проблему разработчиков 1С: внешне корректный отчет на базе Система компоновки данных (СКД) отлично работает в тестовой информационной базе, но при запуске на рабочей базе данные в итоговом отчете начинают затраиваться или размножаться. Проанализируем, почему возникает расхождение в поведении отчета и какими способами можно устранить эту ошибку.
Самая частая причина размножения строк — не до конца настроенное ЛЕВОЕ СОЕДИНЕНИЕ между таблицами запроса. На тестовой базе для анализируемого объекта могла существовать только одна запись в подчиненной таблице, поэтому запрос возвращал корректные цифры. На рабочей базе реальных данных больше, и при отсутствии связи по всем необходимым ключевым полям происходит размножение записей.
Рассмотрим по шагам, на что обратить внимание при объединении таблиц:
ПО запроса СКД. Соединение должно производиться по всему комплекту ключевых полей (например, не только по объекту, но и по дате, организации или подразделению).
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО ДопРеквизиты.Объект = ОсновнаяТаблица.Ссылка
И ДопРеквизиты.Свойство = &ИскомоеСвойство
Если в одном запросе выполняется соединение с несколькими табличными частями или подчиненными регистрами одновременно (связи «один ко многим»), происходит декартово произведение. Каждая строка первой табличной части умножается на каждая строку второй. Если на рабочей базе у объекта заполнено по 3 строки в двух табличных частях, на выходе получим 9 записей вместо 3.
Выясним, как избежать этой проблемы:
Разберем особенности работы самой системы компоновки. СКД не выполняет запрос «как есть», а динамически модифицирует текст SQL-запроса к СУБД в зависимости от выбраных пользователем полей, отборов и группировок. На рабочей базе пользователь мог выбрать другие группировки, добавить поля детальных записей или настроить специфический отбор.
В результате СКД может убрать из итогового SQL-запроса секцию ГРУППИРОВАТЬ ПО или добавить дополнительные таблицы, разворачивающие итоги. Для диагностики этого поведения выполним следующие действия:
АВТОЗАПОЛНЕНИЕ в схеме компоновки или явно ограничим доступность полей для выбора.Проанализируем настройки схемы компоновки данных. Если числовые показатели не объявлены ресурсами на вкладке Ресурсы, СКД не применяет к ним агрегатные функции при построении группировок. В этом случае платформой выводятся все детальные записи из исходной выборки, а на уровнях итогов значения рассчитываются некорректно.
Убедимся, что для всех суммируемых числовых показателей заданы агрегатные выражения, например, Сумма(СуммаОстаток).
Посмотрим на структуру отчета, если он построен на нескольких наборах данных (например, «НаборДанных_Запрос» и «НаборДанных_Объект»). Если связи между ними настроены по полям со связью «один ко многим» без использования уникального ключа, СКД будет размножать строки главного набора на каждую совпадающую строку подчиненного.
Для исправления сгруппируем выгружаемый подчиненный набор, чтобы он содержал только уникальные ключи связи, либо объединим логику выборки в один общий запрос.
Рассмотрим случаи работы с регистрами сведений. Вызов виртуальной таблицы СрезПоследних без указания конкретного периода или с неполными условиями связи по измерениям может вернуть несколько актуальных записей вместо одной, если на рабочей базе накопилась история изменений по объекту.
Всегда передаем точную дату в параметры виртуальной таблицы СрезПоследних(&Период, ...) и выполняем соединение по всему набору ключевых измерений регистра.
Выясним технические факторы, связанные с окружением: