Почему остатки в Оборотно-сальдовой ведомости отличаются от данных запроса к Хозрасчетный.ОстаткиИОбороты?

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

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

Суть проблемы: Свернутое vs Развернутое сальдо

Проанализируем ситуацию, описанную автором темы. По счетам 60 (Расчеты с поставщиками), 62 (Расчеты с покупателями) и 68 (Налоги и сборы) обороты в запросе и ОСВ совпадают, а остатки — нет. Выясним причину этого явления. Основная причина кроется в понятии развернутого сальдо.

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

  1. Как работает простой запрос: Когда мы обращаемся к виртуальной таблице ОстаткиИОбороты и выбираем данные только по полю Счет, система выполняет простое математическое сложение всех движений. Если по Контрагенту №1 на счете 60 висит долг 100 рублей (Дт), а по Контрагенту №2 — переплата 100 рублей (Кт), запрос по счету в целом покажет нулевой остаток (100 - 100 = 0).
  2. Как работает ОСВ: Стандартный отчет «Оборотно-сальдовая ведомость» учитывает настройки плана счетов и настройки самого отчета. По умолчанию для активно-пассивных счетов ОСВ сначала рассчитывает остатки по каждой уникальной комбинации субконто (Контрагент + Договор), а затем суммирует отдельно все полученные дебетовые и все кредитовые значения. В нашем примере ОСВ покажет 100 рублей в колонке Дебет и 100 рублей в колонке Кредит.

Разбор примитивного запроса

Посмотрим на пример запроса, который часто используют начинающие разработчики (и который был приведен в сообщении №7):


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
        НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), 
        КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), 
        ПЕРИОД, , , , 
        Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
ГДЕ
    Счет.Забалансовый = ЛОЖЬ

В данном запросе отсутствуют параметры Субконто. Если мы не передаем массив видов субконто в четвертый параметр виртуальной таблицы, система возвращает данные, агрегированные до уровня счета. Чтобы получить результат «как в ОСВ», необходимо заставить систему «развернуть» остатки по всей имеющейся аналитике.

Использование параметров виртуальной таблицы

Рассмотрим, как правильно сконфигурировать обращение к таблице ОстаткиИОбороты. Параметры функции выглядят следующим образом: ОстаткиИОбороты(&Начало, &Конец, &Период, &МетодДополнения, &Субконто, &Организация, &Условие...).

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

Проблема временных границ (Boundary)

Проанализируем еще один важный момент, упомянутый в теме. Использование функции КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) устанавливает время на 23:59:59. Однако в 1С документы могут быть записаны «внутри» этой секунды, но после момента, который захватывает запрос.

Для корректного получения данных на самую последнюю точку времени рекомендуется использовать объект Граница:


// Пример передачи параметра в коде 1С
ГраницаКонца = Новый Граница(КонецДня(ПараметрКонецПериода), ВидГраницы.Включая);
Запрос.УстановитьПараметр("КонецПериода", ГраницаКонца);

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

Роль Системы Компоновки Данных (СКД)

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

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

Как добиться идентичности результатов?

Чтобы ваш запрос возвращал те же цифры, что и ОСВ, выполните следующие шаги:

  1. Определите состав аналитики: Посмотрите в настройках ОСВ, по каким субконто идет разворот.
  2. Включите субконто в запрос: Добавьте поля Субконто1, Субконто2 и т.д. в выборку.
  3. Используйте правильные итоги: В запросе используйте предложение ИТОГИ СУММА(...) ПО Счет, Субконто1, Субконто2. При расчете итогов по счету 1С будет учитывать тип счета.
  4. Проверьте настройки «Развернутое сальдо» в ОСВ: Если в ОСВ этот флаг снят, она будет вести себя как ваш первоначальный «свернутый» запрос. Если включен — вы должны имитировать этот разворот в коде.
  5. Пересчитайте итоги: Если расхождения остаются даже на свернутом уровне (по оборотам), выполните Администрирование -> Обслуживание -> Регламентные операции -> Управление итогами. Убедитесь, что итоги рассчитаны по текущую дату.

Подводя итог, можно сказать: данные в базе 1С всегда консистентны, но способы их извлечения и интерпретации (свертка по счету против детализации по аналитике) создают иллюзию расхождений. Понимание работы активно-пассивных счетов и параметров виртуальных таблиц — ключ к получению корректной финансовой отчетности программными методами.

← На главную