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