При разработке отчетов на системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, которую называют «мистикой»: в итоговой таблице поле цены пустое или содержит ноль, однако в соседней колонке «Сумма» красуется вполне конкретное число. На первый взгляд кажется, что 1С нарушает законы математики, умножая ноль на количество и получая результат. Разберем по шагам, почему это происходит и как правильно настроить отчет, чтобы избежать подобных казусов.
Для начала проанализируем, как СКД обрабатывает данные. Система компоновки работает в несколько этапов: получение данных из запроса, расчет вычисляемых полей и агрегация ресурсов по группировкам. Основная причина «мистики» кроется именно в этапе агрегации ресурсов.
Представим, что у нас есть ресурс Сумма, выражение которого задано как Сумма(Цена * Количество). В этом случае СКД для каждой детальной записи (строки из результата запроса) сначала перемножает цену на количество, а затем складывает эти результаты для вывода в группировку. Если в одной из детальных записей цена заполнена, а в другой — нет, сумма всё равно будет накоплена.
Рассмотрим ситуацию, когда для поля Цена на закладке «Ресурсы» установлена функция Минимум(Цена). Это одна из самых частых ошибок. Разберем на примере, что происходит «под капотом» системы:
Допустим, по одной и той же номенклатуре в системе есть две записи:
Когда СКД начинает схлопывать эти данные в одну строку по товару, она применяет правила из вкладки «Ресурсы»:
Минимум. Минимум между 100 и 0 — это 0.Сумма. 1000 + 0 — это 1000.В итоге пользователь видит в отчете строку: Товар №1 | Цена: 0 | Сумма: 1000. Создается полная иллюзия ошибки, хотя система отработала ровно так, как её настроил программист.
Чтобы «лечить» подобные проблемы, нам необходимо пересмотреть подход к структуре отчета. Рассмотрим основные способы решения.
Способ 1. Вынос цены в группировку
Если цена является значимым аналитическим разрезом (то есть нам важно видеть разные цены по одному товару отдельными строками), её не нужно делать ресурсом. Перенесите поле Цена в настройки группировок отчета. В этом случае СКД не будет пытаться «свернуть» разные цены в одну строку, и каждая сумма будет соответствовать своей цене.
Способ 2. Использование правильных выражений ресурсов
Если вам все же необходимо оставить цену в колонках, но вы хотите избежать логических нестыковок, проанализируйте выражение ресурса Сумма. Иногда правильнее использовать формулу, которая рассчитывается уже от агрегированных значений в итогах:
Среднее(Цена) * Сумма(Количество)
Однако помните, что такой подход может исказить итоговую сумму, если средняя цена не является корректным показателем для вашего учета.
Способ 3. Проверка детальных записей
Если вы видите странные цифры, всегда делайте проверку «детальными записями». Для этого в настройках отчета временно добавьте группировку Детальные записи и выведите туда все поля: Номенклатуру, Характеристику, Документ-регистратор, Цену, Количество и Сумму. Скорее всего, вы обнаружите «мусорные» строки с нулевой ценой, которые прилетают из документов поступления или остатков, где цена по какой-то причине не была указана.
Выясним еще одну причину: наличие значений NULL в результате запроса. В языке запросов 1С и в выражениях СКД любая математическая операция с NULL дает NULL. Чтобы данные не пропадали и не искажались, в тексте запроса всегда используйте функцию ЕСТЬNULL.
Пример правильного формирования полей в запросе:
ВЫБРАТЬ
Номенклатура,
ЕСТЬNULL(Цена, 0) КАК Цена,
ЕСТЬNULL(КоличествоОстаток, 0) КАК Количество,
ЕСТЬNULL(Цена, 0) * ЕСТЬNULL(КоличествоОстаток, 0) КАК Сумма
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки
Проанализируем этот код: мы принудительно преобразуем все пустые значения в ноль еще на этапе получения данных. Это гарантирует, что на уровне ресурсов СКД будет оперировать числами, а не неопределенными значениями.
Чтобы ваши отчеты всегда показывали корректные данные, придерживайтесь следующих правил:
Цена в структуру отчета (в иерархию группировок).Подводя итог, можно сказать, что «мистика» в 1С всегда имеет под собой четкое техническое обоснование. Внимательное отношение к настройкам ресурсов и понимание того, как СКД агрегирует детальные записи, позволит вам создавать точные и понятные пользователям отчеты.