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