Почему в отчете СКД отображается неправильное количество номенклатуры при изменении группировок?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

В практике разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда отчет на базе Системы компоновки данных (СКД) выдает корректные итоги при одной структуре группировок (например, по магазинам), но показывает совершенно неверные цифры при попытке свернуть данные по номенклатуре в целом. Рассмотрим ситуацию, когда остаток по товару составляет 83 единицы, но при удалении группировки "Магазин" отчет внезапно показывает 24 единицы.

Выясним причину такого поведения системы, проанализируем типичные ошибки в запросах и разберем, как правильно настраивать виртуальные таблицы и ресурсы СКД для получения точных данных.

Анализ исходной проблемы: ошибки в тексте запроса

Разберем фрагмент запроса, который часто становится источником проблем. Основная ошибка заключается в использовании конструкции СГРУППИРОВАТЬ ПО применительно к ресурсам (количественным показателям) внутри самого запроса СКД. Рассмотрим пример типичного, но ошибочного построения запроса:


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

Почему это неправильно? Виртуальные таблицы остатков и оборотов 1С уже являются агрегированными данными. Когда мы добавляем числовые поля (ресурсы) в секцию СГРУППИРОВАТЬ ПО, мы заставляем систему рассматривать каждое уникальное значение остатка как отдельное измерение. Это лишает СКД возможности корректно суммировать эти данные на уровне итогов. При изменении настроек группировки в самом отчете данные "схлопываются" непредсказуемым образом, что и приводит к получению цифр вроде 24 вместо 83.

Влияние соединений на дублирование данных

Проанализируем еще одну критическую ошибку — использование ЛЕВОЕ СОЕДИНЕНИЕ с таблицами, содержащими множественные записи для одного объекта (например, штрихкоды или цены). Если у одной позиции номенклатуры есть три штрихкода, то при левом соединении строка с остатком товара продублируется трижды.

Если в СКД поле КонечныйОстаток выбрано как ресурс с функцией СУММА, система просто сложит эти три строки, и вы получите утроенный остаток. Если же роли полей настроены неверно или используется сложная иерархия, данные могут, наоборот, отображаться частично. Рассмотрим, как избежать умножения данных:

  1. Используйте вложенные запросы для получения одного уникального значения (например, через МАКСИМУМ(Штрихкод)).
  2. Применяйте вкладку Связи наборов данных в СКД вместо соединений в тексте запроса. Это позволяет системе компоновки сначала рассчитать остатки, а затем "подтянуть" к ним справочную информацию (штрихкод, цену) без дублирования строк.
  3. Используйте агрегатные функции в самом запросе, если соединение неизбежно.

Правильная настройка ролей полей в СКД

Для того чтобы СКД понимала, что КонечныйОстаток — это не просто число, а значение на определенный момент времени, необходимо правильно настроить роли полей на вкладке Наборы данных. Разберем по шагам:

Для полей остатков нужно указать роль Остатки. В параметрах роли обязательно заполняются:

Если роли настроены правильно, СКД будет использовать специальные алгоритмы расчета итогов, которые учитывают временную составляющую и не допускают простого суммирования остатков при группировке по временным интервалам или аналитическим разрезам (склад, магазин).

Проблема "Регистратора" в виртуальных таблицах

Рассмотрим ситуацию, когда в запросе используется поле Регистратор. В виртуальной таблице ОстаткиИОбороты при выборе периодичности Авто или Регистратор система строит выборку с детализацией до каждого документа, изменившего остаток.

Если в настройках отчета группировка по регистратору отключена, но поле присутствует в запросе и в группировках СГРУППИРОВАТЬ ПО, это может привести к искажению данных. Рекомендуется использовать поле Регистратор только в тех случаях, когда требуется детальный отчет по движениям. Для сводных отчетов по остаткам лучше использовать виртуальную таблицу Остатки, которая работает значительно быстрее и стабильнее.

Кэширование внешних отчетов и обработок

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

Когда вы запускаете внешний отчет через справочник "Дополнительные отчеты и обработки", система копирует файл .erf во временную директорию пользователя. В некоторых случаях (особенно при интенсивной разработке и частой замене файла) 1С может продолжать использовать старую версию схемы компоновки данных из кэша, даже если вы загрузили новый файл.

Как правильно обновить отчет:

  1. Измените внутреннее имя объекта (в свойствах корневого узла в конфигураторе).
  2. Переименуйте сам файл перед загрузкой.
  3. После загрузки в базу обязательно перезапустите сеанс пользователя или используйте встроенные средства очистки кэша.

Практические рекомендации по исправлению запроса

Проанализируем финальный алгоритм действий для исправления отчета:

  1. Удалите лишние группировки: В тексте запроса (в Конструкторе запроса) перейдите на вкладку "Группировка" и уберите все числовые поля остатков и оборотов из правого списка.
  2. Используйте функции агрегации: Для числовых полей в запросе можно использовать СУММА(Поле), но лучше оставить их "как есть" и настроить их как ресурсы на вкладке Ресурсы в СКД.
  3. Проверьте параметры виртуальной таблицы: Убедитесь, что параметры &НачалоПериода и &КонецПериода передаются корректно. Если вы используете СрезПоследних для цен, передавайте туда &КонецПериода.
  4. Настройте ресурсы СКД: На вкладке Ресурсы добавьте поля остатков и выберите функцию Сумма(...). Обратите внимание, что для остатков по иерархии иногда требуется использование функций ВычислитьВыражение, но в стандартных случаях Сумма работает корректно, если настроены роли.

Соблюдение этих правил гарантирует, что при любом изменении состава группировок (склад, магазин, организация или просто общие итоги по номенклатуре) данные будут рассчитаны математически точно.

← На главную