При разработке отчетов на языке запросов 1С программисты часто сталкиваются с ситуацией, когда итоговая сумма в отчете резко меняется при добавлении или удалении одного из разрезов (например, организации или договора). Особенно ярко это проявляется при работе с виртуальной таблицей Остатки регистра бухгалтерии Хозрасчетный, когда используются активно-пассивные счета и показатели развернутого сальдо. Разберем подробно, почему это происходит и как получить корректные цифры.
Проанализируем ситуацию: когда мы обращаемся к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.Остатки, платформа 1С выполняет вычисления «на лету». Важно понимать, что поле СуммаРазвернутыйОстатокКт (или Дт) не хранится в базе в готовом виде. Оно рассчитывается исходя из того набора измерений и субконто, которые мы указали в запросе.
Рассмотрим, как ведет себя система в двух случаях:
Выясним причину: разница в итоговых суммах возникает из-за того, что без указания измерения Организация происходит взаимозачет (сворачивание) остатков между разными юридическими лицами внутри одного контрагента.
Посмотрим на попытки заменить развернутое сальдо обычным. Поле СуммаОстатокКт возвращает положительное значение, только если общий итог по счету кредитовый. Если счет активно-пассивный (как, например, 76-й или 60-й), то остаток по нему может быть как в дебете, так и в кредите. Если мы убираем разрез Организация, платформа просто выдает математическую разницу между всеми дебетами и кредитами. Для бухгалтерской отчетности (особенно для МСФО) такое «схлопывание» между разными организациями недопустимо, так как это искажает реальную задолженность.
Если нам нужно получить итоговые цифры, рассчитанные «по-честному» (с учетом разделения по организациям), но при этом мы не хотим видеть саму группировку Организация в печатной форме, существует несколько способов решения задачи.
Проанализируем ситуацию с точки зрения структуры запроса. Чтобы зафиксировать расчет остатков на уровне организаций, нам нужно сначала выбрать данные с максимальной детализацией, а затем агрегировать их. Рассмотрим пример кода:
ВЫБРАТЬ
ВТ_ДетальныеОстатки.ТипКонтрагента КАК ТипКонтрагента,
СУММА(ВТ_ДетальныеОстатки.СуммаРазвернутыйКт) КАК Сумма
ИЗ
(ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто1.ТипКонтрагентаМСФО КАК ТипКонтрагента,
ХозрасчетныйОстатки.Организация КАК Организация,
ХозрасчетныйОстатки.СуммаРазвернутыйОстатокКт КАК СуммаРазвернутыйКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&КонецПериода, Счет В ИЕРАРХИИ (&Счет), &ВидыСубконто, ) КАК ХозрасчетныйОстатки) КАК ВТ_ДетальныеОстатки
СГРУППИРОВАТЬ ПО
ВТ_ДетальныеОстатки.ТипКонтрагента
В данном примере во внутреннем запросе мы выбираем Организация. Это заставляет виртуальную таблицу рассчитать СуммаРазвернутыйОстатокКт корректно для каждого юрлица. Во внешнем запросе мы уже просто суммируем эти значения, схлопывая организации, но сохраняя «правильную» сумму кредитового остатка.
Если отчет строится на базе Системы компоновки данных (СКД), мы можем воспользоваться механизмом ролей полей. Выясним, как это работает:
Организация укажем, что это измерение.Важный нюанс: СКД умеет интеллектуально управлять итогами. Если поле Организация присутствует в выбранных полях запроса и помечено как измерение, СКД рассчитает ресурс с учетом этого измерения, даже если оно не выведено в иерархию строк. Это позволяет получить итоговую сумму 122 млн вместо 42 млн, как в примере автора темы.
Рассмотрим подробнее работу с параметром &ВидыСубконто. Для того чтобы развернутое сальдо считалось корректно по субконто (например, Контрагент и Договор), крайне желательно явно передавать массив видов субконто в параметры виртуальной таблицы. Если этого не сделать, платформа может использовать настройки счета по умолчанию, что при определенных условиях (например, если на разных субсчетах разный состав субконто) приведет к непредсказуемым результатам.
Также стоит помнить о признаке "Учет по организациям" в плане счетов. В конфигурации "Бухгалтерия предприятия КОРП" этот признак включен почти для всех счетов. Это делает Организацию не просто реквизитом, а полноценным измерением регистра. Любой запрос к остаткам без учета этого измерения автоматически выполняет математическое сальдирование данных по разным организациям, что и является корнем обсуждаемой проблемы.
Для получения корректных данных в бухгалтерских отчетах необходимо:
Следуя этим правилам, мы сможем создавать отчеты, цифры в которых всегда будут сходиться с регламентированной отчетностью предприятия.