К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как получить остатки регистра накопления в 1С

Способы получить остатки регистра накопления в 1С: виртуальная таблица Остатки, запрос с параметрами периода, СКД, типовые отчёты. Примеры кода и типичные ошибки.

Остатки регистра накопления — одна из самых частых задач в 1С: они нужны для отчётов по складу, взаиморасчётам, денежным средствам и для контроля при проведении документов. Получить их можно несколькими способами: через виртуальную таблицу «Остатки» в запросе, через СКД, через типовые отчёты конфигурации или программно через менеджер регистра.

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

Ниже разобраны рабочие варианты с примерами кода, условиями выбора и типичными ошибками, которые приводят к неверным цифрам или медленным запросам.

Что такое виртуальная таблица «Остатки» и когда она нужна

Регистр накопления вида «Остатки» хранит движения (приход и расход) в основной таблице, а итоги — в служебных таблицах итогов. Виртуальная таблица Остатки — это вычисляемое представление, которое платформа строит на их основе. Она содержит измерения регистра и ресурсы с постфиксом «Остаток», например КоличествоОстаток, СуммаОстаток.

У виртуальной таблицы есть параметры, которые задаются в круглых скобках: период (на какой момент считать остатки), условие отбора по измерениям и список измерений. Правильное использование параметров критично для производительности: отбор, переданный параметром, применяется на уровне СУБД до вычисления итогов, а отбор в секции ГДЕ — после.

Получение остатков запросом на языке 1С

Базовый запрос к остаткам товаров на складах выглядит так:

ВЫБРАТЬ

Остатки.Номенклатура КАК Номенклатура,

Остатки.Склад КАК Склад,

Остатки.КоличествоОстаток КАК Остаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(

&Период,

Склад = &Склад

) КАК Остатки

Параметр &Период задаёт момент, на который считаются остатки. Если передать дату без времени, остатки будут получены на начало этой даты — частая причина «пропавших» документов за день. Чтобы получить остатки на конец дня, используйте функцию КонецПериода(&Период, День) при установке параметра или передавайте объект Граница с видом «Включая».

Если параметр периода не указать вовсе, остатки будут рассчитаны на текущую дату сеанса. Это удобно для оперативных отчётов, но опасно в регламентных заданиях и при сравнении с данными прошлых периодов — результат будет «плыть» от запуска к запуску.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("Период", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить().Выгрузить();

Остатки на произвольную дату и граница периода

Когда нужны остатки с точностью до документа (например, «остаток сразу после проведения реализации»), простой даты недостаточно — внутри одной секунды может быть несколько документов. Для этого параметр периода заполняют объектом Граница, построенным от момента времени документа:

ГраницаОстатков = Новый Граница(Документ.МоментВремени(), ВидГраницы.Включая);

Запрос.УстановитьПараметр("Период", ГраницаОстатков);

Вид Включая означает, что движения указанного документа попадут в расчёт остатка, Исключая — остаток будет «до» движений документа. Этот приём используется при контроле отрицательных остатков в процедурах проведения.

Получение остатков через СКД и типовые отчёты

Для пользовательских отчётов программный запрос обычно не нужен. В типовых конфигурациях (УТ, ERP, Бухгалтерия) есть готовые отчёты по остаткам: «Остатки товаров на складах», «Остатки и доступность товаров», ведомости по взаиморасчётам. Они построены на СКД и позволяют задать период, отборы и группировки без изменения кода.

Собственный отчёт на СКД

При создании своего отчёта на системе компоновки данных в наборе данных используется тот же запрос к виртуальной таблице Остатки, но параметр периода оформляется как параметр СКД с ограничением доступности. Преимущество подхода: пользователь сам меняет период, отборы и группировки, а платформа автоматически подставляет параметры в запрос.

Консоль запросов для разовой проверки

Для разового анализа удобна консоль запросов (внешняя обработка): в ней можно выполнить запрос к виртуальной таблице, подобрать параметры и сразу увидеть результат в виде таблицы. Это безопасный способ — запрос только читает данные и не меняет базу.

Сравнение способов получения остатков

Запрос к виртуальной таблице

Гибко и быстро, подходит для кода и проведения документов; требует навыков языка запросов.

СКД-отчёт

Подходит для пользователей: период и отборы настраиваются без программирования; сложнее изменить логику расчёта.

Типовой отчёт конфигурации

Самый быстрый путь для разовой проверки; ограничен заложенными разработчиком настройками.

Консоль запросов

Удобна для анализа и отладки; не предназначена для регулярной работы пользователей.

Отборы, измерения и производительность

Главное правило производительности: условия по измерениям передавайте параметром виртуальной таблицы, а не в секции ГДЕ. Запрос Остатки(&Период, Склад = &Склад) прочитает итоги только по нужному складу, тогда как вариант с ГДЕ сначала вычислит остатки по всем складам, а потом отфильтрует — на больших базах разница во времени выполнения кратная.

Также учитывайте режим итогов регистра. Если в свойствах регистра отключено хранение итогов или используется режим разделения итогов с ограниченной периодичностью, запрос остатков на старую дату может выполняться долго, потому что платформе придётся пересчитывать движения. Регулярный сдвиг даты расчёта итогов (через «Управление итогами») ускоряет получение текущих остатков, но замедляет запросы к прошлым периодам.

Типичные ошибки
01
Передача даты без времени — остатки получены на начало дня, документы за день не учтены.
02
Отбор в секции ГДЕ вместо параметра виртуальной таблицы — запрос читает лишние итоги и работает медленно.
03
Соединение виртуальной таблицы с таблицей движений без отборов — резкое падение производительности на больших базах.
04
Игнорирование отрицательных остатков — в данных уже есть минус, а отчёт трактуется как корректный.
05
Использование текущей даты вместо явного параметра периода — результат отчёта меняется при каждом запуске.

Проверка результата и контроль корректности

После получения остатков сверьте их с независимым источником: с типовым отчётом конфигурации за тот же период и теми же отборами. Если цифры расходятся, чаще всего причина в разной границе периода (начало/конец дня) или в отборе по измерениям, который задан в одном месте и не задан в другом.

Полезно проверить наличие отрицательных остатков — они сигнализируют о проблемах в учёте (списание без оприходования, задвоенные документы), а не об ошибке запроса. Простой способ: добавить в запрос условие ГДЕ Остатки.КоличествоОстаток < 0 и проанализировать список позиций.

Контрольные точки

Как проверить результат

Совпадение с типовым отчётом
Норма

Суммы и количества совпадают при тех же периоде и отборах

Тревожный признак

Расхождения — проверьте границу периода и параметры отбора

Отрицательные остатки
Норма

Минусовых остатков нет или они объяснимы учётной ситуацией

Тревожный признак

Массовые минусы — ошибки в движениях документов

Время выполнения запроса
Норма

Запрос с параметрами отбора выполняется быстро

Тревожный признак

Запрос «висит» — отбор вынесен в ГДЕ или итоги не рассчитаны

Частые вопросы

Чем отличается таблица «Остатки» от «ОстаткиИОбороты»?

«Остатки» возвращает только конечный остаток на заданный момент. «ОстаткиИОбороты» дополнительно даёт начальный остаток, приход и расход за интервал — её используют для отчётов за период, например складских ведомостей.

Можно ли получить остатки без указания периода?

Да, если параметр периода не задан, остатки считаются на текущую дату сеанса. Для воспроизводимых отчётов лучше всегда передавать период явно.

Как получить остатки по списку складов, а не по одному?

Передайте в параметр условия отбора конструкцию «Склад В (&СписокСкладов)», где параметр — массив или список значений. Платформа применит отбор на уровне итогов, как и для одиночного значения.

Почему запрос к остаткам работает медленно на большой базе?

Типичные причины: отбор вынесен в секцию ГДЕ вместо параметров виртуальной таблицы, запрошены остатки на дату, для которой итоги не рассчитаны, или в запросе есть соединения без отборов. Проверьте план запроса и режим хранения итогов регистра.

Как получить остатки в разрезе серий или характеристик?

Если серия или характеристика является измерением регистра, она автоматически попадает в виртуальную таблицу — достаточно добавить поле в выборку и при необходимости группировку. Если это реквизит, а не измерение, остатки в его разрезе получить нельзя.

Можно ли получить остатки без программирования?

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

Итог

Что важно запомнить

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