Почему в отчете СКД не выводится начальный остаток и неправильно считается конечный?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с виртуальными таблицами ОстаткиИОбороты в Системе компоновки данных (СКД) часто вызывает вопросы у начинающих разработчиков. Типичная ситуация: приход и расход отображаются корректно, но начальный остаток пуст, а конечный остаток ведет себя как обычный оборот, не учитывая накопленные данные за прошлые периоды. Давайте подробно разберем, как устроены механизмы расчета остатков в 1С, и научимся настраивать отчет так, чтобы цифры всегда сходились.

Разбор базовой логики виртуальных таблиц

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

Основная ошибка заключается в ожидании, что СКД автоматически поймет, какие поля являются остатками, и начнет их суммировать "лесенкой", как в Excel. На самом деле, без правильной настройки Ролей в наборе данных, система воспринимает поля НачальныйОстаток и КонечныйОстаток как обычные числовые ресурсы.

Настройка ролей полей — ключ к успеху

Рассмотрим пошагово, как правильно настроить роли полей на закладке "Наборы данных". Это самый важный этап, который определяет, будет ли СКД выполнять "срез" данных на начало и конец периода или просто складывать числа.

  1. Найдем поле НачальныйОстаток. В колонке Роль нажмем на кнопку редактирования.
  2. Установим тип "Остаток".
  3. В поле Вид остатка выберем "Начальный".
  4. Важный момент: Укажем Имя группы (например, "Остаток"). Это текстовый идентификатор, который связывает начальный и конечный остаток в единую логическую пару.
  5. В поле Поле счета (если это бухгалтерский регистр) или в параметрах измерений укажем соответствующие поля, по которым считаются остатки.
  6. Повторим процедуру для поля КонечныйОстаток, указав вид остатка "Конечный" и то же самое имя группы ("Остаток").

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

Работа с параметром "Периодичность"

Выясним, на что влияет параметр Периодичность в параметрах виртуальной таблицы. Многие ошибочно полагают, что это просто настройка вывода. На самом деле это инструкция для SQL-запроса, как группировать данные в базе.

Если вы вывели поле Регистратор, но оставили периодичность "Месяц", вы получите странные данные: для всех документов внутри месяца будет отображаться один и тот же остаток на начало месяца, так как более детального расчета система не производила.

Проблема "схлопывания" данных при объединении (UNION)

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

При использовании ОБЪЕДИНИТЬ ВСЕ в запросе, записи из разных источников могут иметь одинаковые значения измерений и периодов. СКД при расчете итогов может "оптимизировать" запрос и потерять уникальность движений. Чтобы этого избежать, используйте метод "уникального ключа":

  1. Добавьте в запрос дополнительное поле, которое гарантированно делает строку уникальной (например, Регистратор или ссылка на какой-то уникальный объект).
  2. В настройках ролей набора данных пометьте это поле как Обязательное.
  3. Укажите его как измерение в роли поля остатка.

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

Как реализовать "накопительный итог" (как в Excel)

Если ваша задача — не просто показать срез на дату, а вывести математический накопительный итог в каждой строке (предыдущий остаток + текущий приход - текущий расход), стандартных ролей может быть недостаточно. В этом случае мы используем вычисляемые поля и функцию ВычислитьВыражение.

Посмотрим на пример выражения для вычисляемого поля:


ВычислитьВыражение("Сумма(Приход) - Сумма(Расход)", , "Группировка", "Первая", "Текущая")

В данном примере функция складывает все обороты от самой первой строки отчета до текущей включительно. Однако для классических отчетов по регистрам 1С рекомендуется придерживаться настройки ролей "Начальный/Конечный остаток", так как это работает быстрее и учитывает итоги, хранящиеся в базе данных.

Настройка ресурсов для корректных итогов

После того как роли настроены, нужно правильно определить ресурсы на соответствующей вкладке СКД. Посмотрим, как это сделать:

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

Важно: Если вы видите, что в общих итогах цифра получается огромной (сумма всех остатков за все дни), значит, вы либо забыли настроить Роли, либо не указали Имя группы в этих ролях.

Резюме для быстрой проверки отчета

Если ваш отчет "врет" в части остатков или возникают другие ошибки, стоит выполнить анализ конфигурации, а затем пройтись по этому списку:

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

← На главную