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