При разработке отчетов или обработок на платформе 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда запрос к виртуальной таблице остатков регистра бухгалтерии выдает одни цифры, а стандартный отчет «Оборотно-сальдовая ведомость» (ОСВ) — другие. Разберем детально, почему так происходит, проанализируем технические нюансы работы платформы и выясним, как написать запрос, который будет возвращать абсолютно идентичные отчету данные.
Самая распространенная причина расхождений заключается в понимании того, как 1С обрабатывает параметр Период в виртуальных таблицах. Рассмотрим ситуацию: если вы передаете в запрос дату 31.01.2025 23:59:59, платформа может трактовать это как границу, которая не включает документы, записанные ровно в эту секунду. В 1С документы в рамках одной секунды могут иметь разную позицию на временной оси.
Проанализируем пример кода, который часто приводит к ошибке:
Запрос.УстановитьПараметр("Период", КонецДня(ТвояДата));
// Этот код может не учесть документы, созданные последними в этот день.
Чтобы гарантированно получить остатки на конец дня, включая все документы этой секунды, мы должны использовать специальный объект Граница. Выясним, как это работает на практике:
КонецПериода = КонецДня(ПараметрДата);
ГраницаОстатков = Новый Граница(КонецПериода, ВидГраницы.Включая);
Запрос.УстановитьПараметр("Период", ГраницаОстатков);
Использование ВидГраницы.Включая заставляет систему брать срез данных после всех движений, совершенных в указанный момент времени. Если же ваша задача — получить данные на 1 февраля, можно просто передать начало следующего дня (01.02.2025 00:00:00), так как остатки на начало секунды эквивалентны остаткам на конец предыдущей.
Посмотрим на структуру запроса. Начинающие разработчики часто накладывают условия в секции ГДЕ, что является методологической ошибкой при работе с виртуальными таблицами. Разберем, в чем разница.
Когда мы пишем ГДЕ ХозрасчетныйОстатки.Субконто1 = &Номенклатура, система сначала обращается к базе данных, пытается рассчитать остатки по всем товарам и складам, а уже потом фильтрует полученный результат. Это не только замедляет работу, но и может привести к некорректным результатам при работе с итогами.
Правильный подход — накладывать фильтры непосредственно в параметрах виртуальной таблицы. Рассмотрим исправленный пример запроса:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет,
ХозрасчетныйОстатки.Субконто1 КАК Товар,
ХозрасчетныйОстатки.КоличествоОстатокДт,
ХозрасчетныйОстатки.СуммаОстатокДт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&Период,
Счет В ИЕРАРХИИ (&ВыбСчет),
&ВидыСубконто,
(Субконто1 = &Номенклатура) И (Субконто2 = &Склад)
) КАК ХозрасчетныйОстатки
Обратите внимание на параметр &ВидыСубконто. Это массив, который жестко определяет порядок субконто в запросе, что подводит нас к следующему важному моменту.
В регистре бухгалтерии поля Субконто1, Субконто2 и т.д. являются «номерными». Их значение зависит от того, как настроены виды субконто в Плане счетов. Рассмотрим ситуацию: на счете 41.01 первым субконто идет «Номенклатура», а вторым «Склады». Но если вы используете иерархию (Счет В ИЕРАРХИИ), в выборку могут попасть счета, где порядок обратный или используются другие виды субконто.
Чтобы избежать путаницы, проанализируем использование массива видов субконто:
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура и Склады.Остатки.Субконто1 всегда будет именно Номенклатура, независимо от настроек конкретного счета.В типовых конфигурациях 1С (например, БП 3.0 или ERP) учет ведется в разрезе организаций, а часто и подразделений. Стандартная ОСВ почти всегда формируется с отбором по конкретной организации. Если в вашем запросе отсутствует условие по измерению Организация, вы получите консолидированные данные по всей базе, что и вызовет расхождение с отчетом.
Добавим условие по организации в параметры виртуальной таблицы:
// В параметрах виртуальной таблицы:
(Организация = &Организация) И (Субконто1 = &Номенклатура)
Иногда причина кроется не в коде, а в состоянии базы данных. ОСВ может использовать разные механизмы получения данных (в зависимости от настроек), а виртуальная таблица Остатки всегда опирается на таблицу итогов регистра. Если итоги «рассинхронизированы», данные будут неверными.
Выясним, как это исправить:
Проанализируем еще одну тонкость: если для вида субконто на определенном счете установлен признак Только обороты, то остатки в разрезе этого субконто в базе данных просто не хранятся. В ОСВ такие данные могут отображаться специфически (например, выводиться пустыми или суммироваться), в то время как запрос вернет пустые значения или NULL. Всегда проверяйте настройки счета в Плане счетов, прежде чем строить запрос по конкретным субконто.
Подводя итог, для получения корректных данных, соответствующих ОСВ, выполним следующие шаги:
Граница(КонецДня(Дата), ВидГраницы.Включая) для параметра периода.Организации.ВидыСубконто в параметры виртуальной таблицы, чтобы зафиксировать индексы полей.ГДЕ в параметры виртуальной таблицы.Соблюдение этих правил гарантирует высокую точность ваших отчетов и отсутствие претензий со стороны бухгалтерии при сверке данных с типовыми отчетами системы 1С.