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

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

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

Выясняем причину возникновения ошибки

Основная проблема кроется в механизме работы виртуальных таблиц ОстаткиИОбороты. Когда в тексте запроса вы обращаетесь к полю Регистратор (даже внутри оператора ВЫБОР КОГДА), система СКД понимает, что для вычисления этого значения ей необходимо оперировать данными с детализацией до конкретного документа.

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

Метод 1: Использование наборов данных «Объединение»

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

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

Таким образом, расчет вашего специального поля Продажи будет полностью изолирован от расчета стандартных остатков, что гарантирует точность данных.

Метод 2: Проверка ролей полей и параметров СКД

Если вы решили оставить логику в одном запросе, обратите внимание на параметры СКД. Иногда проблему можно решить, правильно настроив роли полей:

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

Метод 3: Анализ запроса через отладку

Если проблема сохраняется, выполните следующие шаги для диагностики:

  1. Используйте внешнюю обработку Консоль системы компоновки данных.
  2. Сформируйте отчет и выведите на экран итоговый текст запроса, который система отправляет на выполнение.
  3. Скопируйте этот текст и выполните его в стандартной Консоли запросов.

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

Пример правильной структуры запроса

Чтобы избежать ошибок при использовании ВЫБОР КОГДА, старайтесь использовать конструкцию с учетом нулевых значений:


ВЫБОР 
    КОГДА ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОстаткиИОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг) 
    ТОГДА ВЫБОР 
        КОГДА &ЕдиницыКоличества = 0 ТОГДА ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход 
        КОГДА &ЕдиницыКоличества = 1 ТОГДА 
            ВЫБОР 
                КОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов <> 0 
                ТОГДА ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход / ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов 
                ИНАЧЕ 0 
            КОНЕЦ 
        ИНАЧЕ 0 
    КОНЕЦ 
    ИНАЧЕ 0 
КОНЕЦ КАК Продажи

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

← На главную