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

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

1С: как запросить остатки через запрос

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

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

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

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

Какие виртуальные таблицы использовать для остатков

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

Дополнительно существует таблица Обороты, но для задачи «узнать остаток» она нужна редко — обороты не содержат самого остатка, только движение ресурса за период. Если требуется именно «сколько товара на складе сейчас», выбор всегда падает на Остатки или ОстаткиИОбороты.

У регистров бухгалтерии логика аналогична: там есть виртуальная таблица Остатки и ОстаткиИОбороты с параметрами субконто и счетов. Регистры сведений не имеют остатков в принципе — у них есть только срез первых и срез последних, что концептуально другая задача.

Запрос остатков на конкретную дату

Базовый пример для типового регистра «ТоварыНаСкладах» выглядит так. Первый параметр виртуальной таблицы — момент времени, на который нужны остатки, второй — условие отбора:

ВЫБРАТЬ

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

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

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

ИЗ

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

Параметр &Период задаётся до выполнения запроса через Запрос.УстановитьПараметр("Период", Дата). Если параметр не указать, платформа вернёт остатки на текущую дату сеанса, что часто становится источником путаницы при отладке: запрос «вчера работал», а сегодня показывает другие цифры просто потому, что изменилась текущая дата.

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

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

Остатки за период с оборотами

Когда нужно показать динамику — сколько было на начало, сколько пришло и ушло, сколько осталось — используется таблица ОстаткиИОбороты. У неё четыре первых параметра: начало периода, конец периода, периодичность и метод дополнения периодов, затем условие отбора.

ВЫБРАТЬ

Т.Период КАК Период,

Т.Номенклатура КАК Номенклатура,

Т.КоличествоНачальныйОстаток КАК НачальныйОстаток,

Т.КоличествоПриход КАК Приход,

Т.КоличествоРасход КАК Расход,

Т.КоличествоКонечныйОстаток КАК КонечныйОстаток

ИЗ

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

&НачалоПериода, &КонецПериода, Месяц, , ) КАК Т

Периодичность принимает значения «Период», «День», «Неделя», «Месяц», «Квартал», «Год», «Регистратор». Значение «Регистратор» разворачивает остатки до уровня документов — удобно для расшифровки, но на больших базах такой запрос тяжёлый. Для сводных отчётов достаточно «Месяц» или «День».

Важная особенность: если за период по комбинации измерений не было ни движений, ни начального остатка, строка в результат не попадёт. Поэтому «товар не вышел в отчёт» чаще всего означает, что по нему просто нет данных, а не что запрос ошибочен.

Отборы: склад, номенклатура, организация

Условие отбора передаётся вторым (в ОстаткиИОбороты — пятым) параметром виртуальной таблицы как текст на языке запросов. Отбор внутри параметров работает быстрее, чем секция ГДЕ над результатом, потому что платформа применяет его на уровне чтения итогов:

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

&Период,

Склад = &Склад И Номенклатура В (&СписокНоменклатуры))

Отбор по списку значений реализуется через оператор В с параметром-массивом. Для иерархических справочников, например отбора по группе номенклатуры, используется В ИЕРАРХИИ (&Группа). Условия по полям, не являющимся измерениями регистра, в параметрах виртуальной таблицы недопустимы — платформа выдаст ошибку ещё на этапе проверки запроса.

Как получить остатки по регистру бухгалтерии

Для регистра бухгалтерии «Хозрасчетный» принцип тот же, но параметров больше: период, отбор по счетам, список видов субконто, условие по аналитике. Типичный запрос остатков по счёту 41 в разрезе номенклатуры:

ВЫБРАТЬ

Т.Субконто1 КАК Номенклатура,

Т.СуммаОстатокДт КАК СуммаДт,

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

ИЗ

РегистрБухгалтерии.Хозрасчетный.Остатки(

&Период, Счет = &Счет41, &ВидыСубконто, ) КАК Т

Параметр видов субконто — массив элементов плана видов характеристик «ВидыСубконтоХозрасчетные». Если его не задать, остатки будут свёрнуты без аналитики. Для счетов с дебетово-кредитовым сальдо используйте поля СуммаОстаток (свёрнутое) или СуммаОстатокДт/СуммаОстатокКт (развёрнутое) — выбор зависит от того, как остаток должен выглядеть в отчёте.

Остатки без запроса: типовые отчёты

Если программная выборка не нужна, остатки смотрят штатными отчётами: «Остатки товаров на складах» в УТ и ERP, «Остатки номенклатуры» в УНФ, оборотно-сальдовая ведомость в Бухгалтерии. Эти отчёты построены на тех же виртуальных таблицах, поэтому цифры в них совпадают с результатом корректно написанного запроса — это удобный эталон для проверки своего кода.

Сравнение вариантов

Виртуальная таблица Остатки

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

ОстаткиИОбороты

Интервал с приходом и расходом. Подходит для отчётов за период, но тяжелее при периодичности «Регистратор» или «День» на длинных интервалах.

Типовой отчёт

Без программирования, с готовыми отборами. Не подходит, когда остатки нужны внутри алгоритма или обмена.

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Не задан параметр периода — остатки берутся на текущую дату сеанса, и результат «плавает» от запуска к запуску.
02
Отбор по измерениям написан в секции ГДЕ вместо параметров виртуальной таблицы — запрос работает, но в разы медленнее.
03
Использована физическая таблица движений с ручным суммированием приходов и расходов вместо виртуальной — итоги не сходятся с отчётами из-за границы периода и отключённых итогов.
04
Ожидание строк с нулевым остатком: виртуальная таблица не возвращает комбинации измерений без остатка, поэтому позиции «пропадают».
05
Неверная граница периода: КонецДня() против начала следующего дня даёт разный результат при документах, проведённых в последнюю секунду.

Отдельная ситуация — отрицательные остатки. Они возникают, когда расход проведён раньше прихода или приход вообще не оформлен. Запрос их честно покажет; чтобы найти такие позиции, добавьте в секцию ГДЕ условие КоличествоОстаток < 0 — это стандартный приём контроля данных.

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

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

Сумма по произвольной позиции
Норма

Совпадает с типовым отчётом по остаткам за тот же период

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

Расходится — проверьте параметр периода и условия отбора

Количество строк
Норма

Все позиции с ненулевым остатком присутствуют

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

Позиции с реальным остатком отсутствуют — вероятно, отбор отсекает их или задан неверный регистр

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

Секунды на типовых объёмах

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

Минуты — отбор вынесен из параметров виртуальной таблицы в ГДЕ или запрошена периодичность «Регистратор»

Ограничения и когда нужна помощь разработчика

Запросы к виртуальным таблицам требуют прав на чтение регистра: пользователь без доступа получит пустой результат или ошибку доступа. В клиент-серверном режиме тяжёлые запросы остатков выполняйте на сервере и не вызывайте их в цикле — вместо этого соберите нужные отборы одним запросом с группировкой.

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

Итог

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

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

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

Почему запрос остатков возвращает пустой результат?

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

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

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

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

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

Можно ли получить остатки на дату документа, включая сам документ?

Да: передайте в параметр периода объект МоментВремени документа — остатки будут рассчитаны с учётом движений этого документа. Если передать только дату без ссылки, документ в расчёт не попадёт. Это стандартный приём при контроле остатков в момент проведения.

Почему суммы в запросе не сходятся с отчётом?

Сверьте границы периода: отчёт обычно использует конец дня, а в параметр могла попасть дата без времени, то есть начало дня. Также проверьте, не фильтрует ли отчёт по организации или складу, которых нет в вашем запросе, и тот ли это регистр — в типовых конфигурациях товарные остатки часто распределены между несколькими регистрами.

Как вывести позиции с нулевым остатком?

Виртуальная таблица такие строки не возвращает. Приём — левое соединение справочника номенклатуры с таблицей остатков: позиции без остатка получат NULL, который через ЕСТЬNULL превращается в ноль. Учтите, что на больших справочниках такой запрос заметно тяжелее обычного среза.