Работа с виртуальными таблицами ОстаткиИОбороты в Системе компоновки данных (СКД) часто вызывает вопросы у начинающих разработчиков. Типичная ситуация: приход и расход отображаются корректно, но начальный остаток пуст, а конечный остаток ведет себя как обычный оборот, не учитывая накопленные данные за прошлые периоды. Давайте подробно разберем, как устроены механизмы расчета остатков в 1С, и научимся настраивать отчет так, чтобы цифры всегда сходились.
Для начала проанализируем, как 1С формирует данные в виртуальной таблице ОстаткиИОбороты. В отличие от обычных таблиц, эта таблица динамически вычисляет итоги на контрольные точки. Если мы задаем период (например, месяц) и детализацию "Период", система выдаст одну строку с остатком на начало месяца и на конец месяца. Если же мы добавляем детализацию "Регистратор", система должна рассчитать остатки на момент каждого документа.
Основная ошибка заключается в ожидании, что СКД автоматически поймет, какие поля являются остатками, и начнет их суммировать "лесенкой", как в Excel. На самом деле, без правильной настройки Ролей в наборе данных, система воспринимает поля НачальныйОстаток и КонечныйОстаток как обычные числовые ресурсы.
Рассмотрим пошагово, как правильно настроить роли полей на закладке "Наборы данных". Это самый важный этап, который определяет, будет ли СКД выполнять "срез" данных на начало и конец периода или просто складывать числа.
НачальныйОстаток. В колонке Роль нажмем на кнопку редактирования.КонечныйОстаток, указав вид остатка "Конечный" и то же самое имя группы ("Остаток").Когда мы задаем одинаковое имя группы для обоих полей, СКД понимает: чтобы получить итог по этой группе за период, нужно взять значение начального остатка из первой записи периода и значение конечного остатка из последней записи периода. Без этого настройки итогов будут выдавать бессмысленную сумму всех промежуточных остатков.
Выясним, на что влияет параметр Периодичность в параметрах виртуальной таблицы. Многие ошибочно полагают, что это просто настройка вывода. На самом деле это инструкция для SQL-запроса, как группировать данные в базе.
Регистратор, то и в параметрах виртуальной таблицы должна стоять периодичность Регистратор (или Авто, если вы доверяете системе определить это самостоятельно).Если вы вывели поле Регистратор, но оставили периодичность "Месяц", вы получите странные данные: для всех документов внутри месяца будет отображаться один и тот же остаток на начало месяца, так как более детального расчета система не производила.
Рассмотрим более сложную ситуацию, упомянутую в обсуждении. Если ваш отчет строится на основе объединения нескольких запросов (например, данные из разных регистров), СКД может некорректно группировать строки. Проанализируем решение этой проблемы:
При использовании ОБЪЕДИНИТЬ ВСЕ в запросе, записи из разных источников могут иметь одинаковые значения измерений и периодов. СКД при расчете итогов может "оптимизировать" запрос и потерять уникальность движений. Чтобы этого избежать, используйте метод "уникального ключа":
Регистратор или ссылка на какой-то уникальный объект).Это заставит СКД учитывать каждую строку при расчете временных итогов, не позволяя ей агрегировать данные раньше времени.
Если ваша задача — не просто показать срез на дату, а вывести математический накопительный итог в каждой строке (предыдущий остаток + текущий приход - текущий расход), стандартных ролей может быть недостаточно. В этом случае мы используем вычисляемые поля и функцию ВычислитьВыражение.
Посмотрим на пример выражения для вычисляемого поля:
ВычислитьВыражение("Сумма(Приход) - Сумма(Расход)", , "Группировка", "Первая", "Текущая")
В данном примере функция складывает все обороты от самой первой строки отчета до текущей включительно. Однако для классических отчетов по регистрам 1С рекомендуется придерживаться настройки ролей "Начальный/Конечный остаток", так как это работает быстрее и учитывает итоги, хранящиеся в базе данных.
После того как роли настроены, нужно правильно определить ресурсы на соответствующей вкладке СКД. Посмотрим, как это сделать:
Для полей НачальныйОстаток и КонечныйОстаток в колонке "Выражение" обычно пишется стандартное Сумма(НачальныйОстаток). Но благодаря настроенным ролям, СКД применит агрегацию по времени. В группировках (например, "Склад") она не будет складывать остатки за каждый день, а возьмет остаток на начало самого раннего дня в периоде и остаток на конец самого позднего.
Важно: Если вы видите, что в общих итогах цифра получается огромной (сумма всех остатков за все дни), значит, вы либо забыли настроить Роли, либо не указали Имя группы в этих ролях.
Если ваш отчет "врет" в части остатков или возникают другие ошибки, стоит выполнить анализ конфигурации, а затем пройтись по этому списку:
НачалоПериода и КонецПериода в виртуальной таблице.День или Авто и в настройках СКД включите "Дополнять периоды" (чтобы видеть остаток даже в те дни, когда не было движений).Применяя эти шаги, мы превращаем простой запрос к базе в мощный аналитический инструмент, который корректно обрабатывает временные срезы и предоставляет пользователю достоверную информацию о состоянии активов.