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