Почему пропадают суммы в отчетах 1С и как решить проблему «схлопывания» строк в СКД

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

При разработке и доработке отчетов в конфигурации 1С:Зарплата и управление персоналом 3.1 (ЗУП) программисты часто сталкиваются с ситуацией, которую пользователи называют «мистикой». Суть проблемы заключается в том, что конкретная сумма (например, премия сотрудника) упорно не попадает в итоговый отчет. Однако стоит изменить значение этой суммы хотя бы на один рубль, как она магическим образом появляется. При возврате исходного значения сумма снова исчезает.

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

Причина «мистики»: Механизм сворачивания идентичных строк

Разберем ситуацию, описанную в теме. Когда сумма в 240 рублей пропадает из колонки отчета, но появляется при изменении на 241 рубль, мы имеем дело не с программной ошибкой в коде расчета, а с особенностью работы движка СКД. Главная причина «исчезновения» заключается в том, что СКД по умолчанию стремится оптимизировать вывод данных.

Проанализируем процесс: если в результате запроса присутствуют две или более строки, в которых значения всех полей, не являющихся ресурсами, полностью совпадают, система воспринимает их как дубли. В этом случае СКД может «схлопнуть» эти строки, выведя только одну из них. Если поле с суммой 240 рублей не определено в системе как Ресурс, СКД считает его обычным группировочным полем или детальной записью. Если у сотрудника в этом же периоде уже есть другая запись с такой же суммой и такими же аналитиками, система выводит одну строку вместо двух, и итоговая сумма в глазу пользователя «уменьшается».

Роль полей в СКД и их влияние на результат

Рассмотрим подробнее вкладку «Наборы данных» в схеме компоновки. У каждого поля в колонке «Роль» есть настройки, которые критически влияют на то, как движок компоновки будет обрабатывать данные. Выясним, какие настройки могут привести к ошибке:

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

Посмотрим на пример того, как может выглядеть некорректный запрос, приводящий к потере данных:


ВЫБРАТЬ
    Взаиморасчеты.Сотрудник,
    Взаиморасчеты.Результат КАК Сумма
ИЗ
    РегистрНакопления.НачисленияУдержанияПоСотрудникам.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Взаиморасчеты

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

Решение №1: Добавление уникальной аналитики в группировку

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

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

Разберем по шагам:

  1. Откройте схему компоновки данных.
  2. В тексте запроса добавьте поле Регистратор.
  3. На вкладке «Настройки» добавьте Регистратор в состав детальных записей или в используемые поля.
  4. Если вывод регистратора не требуется, его можно не добавлять в «Выбранные поля», но само наличие его в наборе данных заставит СКД обрабатывать каждую запись документа отдельно.

Решение №2: Правильная настройка ресурсов

Проанализируем второй способ решения — корректное определение ресурсов. Это наиболее правильный метод с точки зрения архитектуры 1С. Если поле является суммовым, оно ОБЯЗАТЕЛЬНО должно быть описано на вкладке «Ресурсы».

Выполним следующие действия:

  1. Перейдем на закладку «Ресурсы» в СКД.
  2. Перенесем наше поле (например, ПФР, ФСС или Премия) в правую колонку.
  3. В колонке «Выражение» убедимся, что установлена агрегатная функция Сумма(ИмяПоля).
  4. В колонке «Рассчитывать по...» оставим значение пустым (чтобы рассчитывалось по всем итогам) или укажем конкретные группировки.

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

Особенности виртуальных таблиц в ЗУП 3.1

При работе с ЗУП 3.1 данные часто выбираются из виртуальных таблиц оборотов или остатков. Проанализируем ситуацию, когда программист использует ключевое слово РАЗЛИЧНЫЕ (или DISTINCT в SQL) внутри запроса.

Если в запросе к виртуальной таблице написано:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Сотрудник,
    СуммаВзноса
ИЗ
    РегистрНакопления.СтраховыеВзносы.Обороты(...)

То в случае двух одинаковых взносов по 240 рублей, дубль будет отсечен еще на уровне SQL-запроса, до того как данные попадут в СКД. В этом случае никакие настройки ресурсов в компоновке уже не помогут, так как вторая строка просто не попадет в выборку. Рекомендация: избегайте использования РАЗЛИЧНЫЕ в запросах для отчетов, где важна полнота суммовых данных, либо всегда добавляйте в выборку Регистратор или ПериодСекунда.

Практические советы по отладке отчетов

Если вы столкнулись с подобной «мистикой», рекомендуем применить следующий алгоритм проверки:

Таким образом, «исчезновение» премии в 240 рублей — это классический симптом того, что СКД сгруппировала записи, не считая сумму ресурсом, или отсекла их как дубли из-за отсутствия уникальной аналитики в запросе. Использование уникальных полей и корректная настройка вкладки «Ресурсы» полностью устраняют эту проблему.

← На главную