Ситуация, когда данные в стандартной Оборотно-сальдовой ведомости (ОСВ) не совпадают с результатами программного запроса к виртуальной таблице Хозрасчетный.ОстаткиИОбороты, является классической дилеммой для разработчиков 1С, особенно на этапе освоения регистров бухгалтерии. Рассмотрим подробнее, почему возникают такие расхождения, и разберем по шагам механизмы работы платформы, которые влияют на итоговые цифры.
Проанализируем ситуацию, описанную автором темы. По счетам 60 (Расчеты с поставщиками), 62 (Расчеты с покупателями) и 68 (Налоги и сборы) обороты в запросе и ОСВ совпадают, а остатки — нет. Выясним причину этого явления. Основная причина кроется в понятии развернутого сальдо.
Большинство счетов расчетов являются активно-пассивными. Это означает, что в разрезе разных аналитик (субконто) у счета может одновременно быть и дебетовый остаток (нам должны), и кредитовый остаток (мы должны).
ОстаткиИОбороты и выбираем данные только по полю Счет, система выполняет простое математическое сложение всех движений. Если по Контрагенту №1 на счете 60 висит долг 100 рублей (Дт), а по Контрагенту №2 — переплата 100 рублей (Кт), запрос по счету в целом покажет нулевой остаток (100 - 100 = 0).Посмотрим на пример запроса, который часто используют начинающие разработчики (и который был приведен в сообщении №7):
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ),
КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ),
ПЕРИОД, , , ,
Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
ГДЕ
Счет.Забалансовый = ЛОЖЬ
В данном запросе отсутствуют параметры Субконто. Если мы не передаем массив видов субконто в четвертый параметр виртуальной таблицы, система возвращает данные, агрегированные до уровня счета. Чтобы получить результат «как в ОСВ», необходимо заставить систему «развернуть» остатки по всей имеющейся аналитике.
Рассмотрим, как правильно сконфигурировать обращение к таблице ОстаткиИОбороты. Параметры функции выглядят следующим образом: ОстаткиИОбороты(&Начало, &Конец, &Период, &МетодДополнения, &Субконто, &Организация, &Условие...).
Чтобы получить развернутое сальдо в запросе, нам нужно либо добавить группировку по субконто в сам запрос, либо использовать возможности Системы Компоновки Данных (СКД). Выясним, какие технические нюансы могут влиять на результат:
Проанализируем еще один важный момент, упомянутый в теме. Использование функции КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) устанавливает время на 23:59:59. Однако в 1С документы могут быть записаны «внутри» этой секунды, но после момента, который захватывает запрос.
Для корректного получения данных на самую последнюю точку времени рекомендуется использовать объект Граница:
// Пример передачи параметра в коде 1С
ГраницаКонца = Новый Граница(КонецДня(ПараметрКонецПериода), ВидГраницы.Включая);
Запрос.УстановитьПараметр("КонецПериода", ГраницаКонца);
Это гарантирует, что все документы, проведенные в последнюю секунду периода (например, регламентные операции закрытия месяца), попадут в выборку. Стандартная ОСВ всегда использует именно такой механизм границ.
Многие забывают, что современная ОСВ строится не просто запросом, а через СКД. В схеме компоновки данных для полей остатков прописываются специальные роли.
Роль поля «Остаток» в СКД позволяет системе понимать, что это поле нельзя просто суммировать. СКД выполняет «умное» суммирование: если счет активный, остаток вычисляется по одной формуле, если пассивный — по другой, а если активно-пассивный — результат зависит от иерархии и группировок. Если вы пишете обычный запрос и пытаетесь вручную суммировать СуммаКонечныйОстатокДт по группе счетов, вы неизбежно получите математическую ошибку из-за того, что внутри группы могут быть счета разных типов.
Чтобы ваш запрос возвращал те же цифры, что и ОСВ, выполните следующие шаги:
Субконто1, Субконто2 и т.д. в выборку.ИТОГИ СУММА(...) ПО Счет, Субконто1, Субконто2. При расчете итогов по счету 1С будет учитывать тип счета.Администрирование -> Обслуживание -> Регламентные операции -> Управление итогами. Убедитесь, что итоги рассчитаны по текущую дату.Подводя итог, можно сказать: данные в базе 1С всегда консистентны, но способы их извлечения и интерпретации (свертка по счету против детализации по аналитике) создают иллюзию расхождений. Понимание работы активно-пассивных счетов и параметров виртуальных таблиц — ключ к получению корректной финансовой отчетности программными методами.