Разработка и Конфигурация · 11 мин
1С: как запросить остатки через запрос
Как в 1С запросить остатки через виртуальные таблицы Остатки и ОстаткиИОбороты: примеры запросов, параметры периода, отборы, типичные ошибки.
Получить остатки в 1С можно двумя способами: через виртуальные таблицы регистров накопления в запросе или через готовые отчёты типовой конфигурации. Программный способ нужен, когда остатки требуются в обработке, в модуле документа, при обмене данными или при построении собственного отчёта. В обоих случаях основа одна — регистр накопления с видом «Остатки» и его виртуальные таблицы.
Главная идея проста: физически остатки хранятся в итоговых таблицах регистра, а разработчик обращается к ним через виртуальную таблицу Остатки или ОстаткиИОбороты, указывая период и условия отбора. Платформа сама рассчитывает значения на нужную дату, поэтому суммировать движения документов вручную не требуется — более того, это грубая ошибка, приводящая к неверным данным и лишней нагрузке.
Ниже разобраны синтаксис запросов к виртуальным таблицам, передача параметров периода, отборы по складу и номенклатуре, получение остатков с оборотами, а также проверка результата и типичные ошибки, из-за которых запрос возвращает пустоту или неверные суммы.
Какие виртуальные таблицы использовать для остатков
Регистры накопления с видом «Остатки» автоматически предоставляют две ключевые виртуальные таблицы. Таблица Остатки возвращает срез значений ресурсов на конкретный момент времени в разрезе всех измерений регистра. Таблица ОстаткиИОбороты возвращает начальный остаток, приход, расход и конечный остаток за произвольный интервал с заданной периодичностью.
Дополнительно существует таблица Обороты, но для задачи «узнать остаток» она нужна редко — обороты не содержат самого остатка, только движение ресурса за период. Если требуется именно «сколько товара на складе сейчас», выбор всегда падает на Остатки или ОстаткиИОбороты.
У регистров бухгалтерии логика аналогична: там есть виртуальная таблица Остатки и ОстаткиИОбороты с параметрами субконто и счетов. Регистры сведений не имеют остатков в принципе — у них есть только срез первых и срез последних, что концептуально другая задача.
Запрос остатков на конкретную дату
Базовый пример для типового регистра «ТоварыНаСкладах» выглядит так. Первый параметр виртуальной таблицы — момент времени, на который нужны остатки, второй — условие отбора:
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки
Параметр &Период задаётся до выполнения запроса через Запрос.УстановитьПараметр("Период", Дата). Если параметр не указать, платформа вернёт остатки на текущую дату сеанса, что часто становится источником путаницы при отладке: запрос «вчера работал», а сегодня показывает другие цифры просто потому, что изменилась текущая дата.
Имена полей результата строятся по шаблону: имя ресурса плюс суффикс «Остаток». Если ресурс называется «Сумма», поле будет СуммаОстаток. Измерения попадают в результат под своими именами, реквизиты регистра в таблицу остатков не входят — их нужно присоединять к справочникам через соединения.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Т.Номенклатура, Т.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Т";
Запрос.УстановитьПараметр("Период", КонецДня(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();Остатки за период с оборотами
Когда нужно показать динамику — сколько было на начало, сколько пришло и ушло, сколько осталось — используется таблица ОстаткиИОбороты. У неё четыре первых параметра: начало периода, конец периода, периодичность и метод дополнения периодов, затем условие отбора.
ВЫБРАТЬ
Т.Период КАК Период,
Т.Номенклатура КАК Номенклатура,
Т.КоличествоНачальныйОстаток КАК НачальныйОстаток,
Т.КоличествоПриход КАК Приход,
Т.КоличествоРасход КАК Расход,
Т.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
&НачалоПериода, &КонецПериода, Месяц, , ) КАК Т
Периодичность принимает значения «Период», «День», «Неделя», «Месяц», «Квартал», «Год», «Регистратор». Значение «Регистратор» разворачивает остатки до уровня документов — удобно для расшифровки, но на больших базах такой запрос тяжёлый. Для сводных отчётов достаточно «Месяц» или «День».
Важная особенность: если за период по комбинации измерений не было ни движений, ни начального остатка, строка в результат не попадёт. Поэтому «товар не вышел в отчёт» чаще всего означает, что по нему просто нет данных, а не что запрос ошибочен.
Отборы: склад, номенклатура, организация
Условие отбора передаётся вторым (в ОстаткиИОбороты — пятым) параметром виртуальной таблицы как текст на языке запросов. Отбор внутри параметров работает быстрее, чем секция ГДЕ над результатом, потому что платформа применяет его на уровне чтения итогов:
РегистрНакопления.ТоварыНаСкладах.Остатки(
&Период,
Склад = &Склад И Номенклатура В (&СписокНоменклатуры))
Отбор по списку значений реализуется через оператор В с параметром-массивом. Для иерархических справочников, например отбора по группе номенклатуры, используется В ИЕРАРХИИ (&Группа). Условия по полям, не являющимся измерениями регистра, в параметрах виртуальной таблицы недопустимы — платформа выдаст ошибку ещё на этапе проверки запроса.
Как получить остатки по регистру бухгалтерии
Для регистра бухгалтерии «Хозрасчетный» принцип тот же, но параметров больше: период, отбор по счетам, список видов субконто, условие по аналитике. Типичный запрос остатков по счёту 41 в разрезе номенклатуры:
ВЫБРАТЬ
Т.Субконто1 КАК Номенклатура,
Т.СуммаОстатокДт КАК СуммаДт,
Т.КоличествоОстатокДт КАК Количество
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&Период, Счет = &Счет41, &ВидыСубконто, ) КАК Т
Параметр видов субконто — массив элементов плана видов характеристик «ВидыСубконтоХозрасчетные». Если его не задать, остатки будут свёрнуты без аналитики. Для счетов с дебетово-кредитовым сальдо используйте поля СуммаОстаток (свёрнутое) или СуммаОстатокДт/СуммаОстатокКт (развёрнутое) — выбор зависит от того, как остаток должен выглядеть в отчёте.
Остатки без запроса: типовые отчёты
Если программная выборка не нужна, остатки смотрят штатными отчётами: «Остатки товаров на складах» в УТ и ERP, «Остатки номенклатуры» в УНФ, оборотно-сальдовая ведомость в Бухгалтерии. Эти отчёты построены на тех же виртуальных таблицах, поэтому цифры в них совпадают с результатом корректно написанного запроса — это удобный эталон для проверки своего кода.
Сравнение вариантов
Срез на момент времени. Самый быстрый вариант, когда нужна только текущая ситуация без динамики.
Интервал с приходом и расходом. Подходит для отчётов за период, но тяжелее при периодичности «Регистратор» или «День» на длинных интервалах.
Без программирования, с готовыми отборами. Не подходит, когда остатки нужны внутри алгоритма или обмена.
Проверка результата и типичные ошибки
После выполнения запроса сверьте итоги с типовым отчётом за тот же период и с теми же отборами. Совпадение сумм по ключевым позициям — признак корректного запроса. Расхождения почти всегда объясняются одной из перечисленных ниже причин, а не «глюком платформы».
Отдельная ситуация — отрицательные остатки. Они возникают, когда расход проведён раньше прихода или приход вообще не оформлен. Запрос их честно покажет; чтобы найти такие позиции, добавьте в секцию ГДЕ условие КоличествоОстаток < 0 — это стандартный приём контроля данных.
Как проверить результат
Совпадает с типовым отчётом по остаткам за тот же период
Расходится — проверьте параметр периода и условия отбора
Все позиции с ненулевым остатком присутствуют
Позиции с реальным остатком отсутствуют — вероятно, отбор отсекает их или задан неверный регистр
Секунды на типовых объёмах
Минуты — отбор вынесен из параметров виртуальной таблицы в ГДЕ или запрошена периодичность «Регистратор»
Ограничения и когда нужна помощь разработчика
Запросы к виртуальным таблицам требуют прав на чтение регистра: пользователь без доступа получит пустой результат или ошибку доступа. В клиент-серверном режиме тяжёлые запросы остатков выполняйте на сервере и не вызывайте их в цикле — вместо этого соберите нужные отборы одним запросом с группировкой.
Если остатки нужны в режиме реального времени с точностью до непроведённых документов, виртуальные таблицы не помогут — они учитывают только проведённые движения. Такие задачи (резервирование, контроль при подборе) решаются механизмами конфигурации или контролем остатков при проведении, и это уже зона доработки конфигурации, а не написания запроса.
Что важно запомнить
Остатки берутся из виртуальных таблиц Остатки и ОстаткиИОбороты регистра накопления или бухгалтерии. Период и отборы по измерениям передаются параметрами таблицы. Результат всегда сверяйте с типовым отчётом, а тяжёлые запросы сначала отлаживайте на копии базы.
Частые вопросы
Почему запрос остатков возвращает пустой результат?
Чаще всего причины три: не задан или неверно задан параметр периода, отбор в параметрах виртуальной таблицы отсекает все записи, либо у пользователя нет прав на чтение регистра. Проверьте запрос без условий вообще — если данные появились, проблема в отборе.
Чем Остатки отличаются от ОстаткиИОбороты?
Таблица Остатки даёт срез на один момент времени и работает быстрее. ОстаткиИОбороты возвращает начальный и конечный остатки плюс приход и расход за интервал с заданной периодичностью. Для «сколько сейчас» достаточно первой, для отчёта за месяц нужна вторая.
Как получить остатки в разрезе характеристик или серий?
Если характеристика или серия является измерением регистра, она автоматически попадёт в результат виртуальной таблицы — дополнительных действий не нужно. Если аналитика хранится в реквизитах движений, в итогах её нет, и потребуется соединение с таблицей движений или изменение структуры регистра.
Можно ли получить остатки на дату документа, включая сам документ?
Да: передайте в параметр периода объект МоментВремени документа — остатки будут рассчитаны с учётом движений этого документа. Если передать только дату без ссылки, документ в расчёт не попадёт. Это стандартный приём при контроле остатков в момент проведения.
Почему суммы в запросе не сходятся с отчётом?
Сверьте границы периода: отчёт обычно использует конец дня, а в параметр могла попасть дата без времени, то есть начало дня. Также проверьте, не фильтрует ли отчёт по организации или складу, которых нет в вашем запросе, и тот ли это регистр — в типовых конфигурациях товарные остатки часто распределены между несколькими регистрами.
Как вывести позиции с нулевым остатком?
Виртуальная таблица такие строки не возвращает. Приём — левое соединение справочника номенклатуры с таблицей остатков: позиции без остатка получат NULL, который через ЕСТЬNULL превращается в ноль. Учтите, что на больших справочниках такой запрос заметно тяжелее обычного среза.