Остатки товаров в 1С: от готового отчёта до текста запроса

· 9 мин

Содержание

Чтобы запросить остатки в 1С, пользователю хватит готового отчёта: в БП 3.0 это Склад → Отчёты → Остатки товаров, в УТ 11 — Склад и доставка → Отчёты по складу → Остатки и доступность товаров. Программисту нужен запрос к виртуальной таблице Остатки регистра накопления или регистра бухгалтерии, с датой и отбором в параметрах таблицы.

Отчёт отвечает на вопрос «сколько лежит», запрос нужен, когда остатки идут в обработку, печатную форму, проверку при проведении или во внешнюю систему.

Готовые отчёты: остатки без программирования

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

КонфигурацияГде найтиЧто показывает
Бухгалтерия 3.0Склад → Отчёты → Остатки товаровКоличество и сумма по складам на дату
Бухгалтерия 3.0Склад → Отчёты → Ведомость по товарам на складахНачальный остаток, приход, расход, конечный остаток за период
Бухгалтерия 3.0Отчёты → Оборотно-сальдовая ведомость по счёту (41, 10, 43)Остатки в разрезе субконто счёта
Управление торговлей 11Склад и доставка → Отчёты по складу → Остатки и доступность товаровВ наличии, в резерве, доступно
Управление торговлей 11Склад и доставка → Отчёты по складу → Ведомость по товарам на складахДвижение за период

Как настроить отчёт под себя:

  1. Откройте отчёт и задайте дату или период в шапке.
  2. Нажмите Настройки и переключитесь в расширенный режим, если нужен отбор по группе номенклатуры или складу.
  3. На вкладке группировок добавьте нужный разрез: склад, характеристика, серия.
  4. Сохраните вариант отчёта, чтобы не настраивать заново.

В БП 3.0 количество есть только у счетов с количественным учётом: 10, 41, 43. Если в ОСВ по счёту 41 колонки «Количество» нет, включите показатель в настройках отчёта.

Расхождение между отчётами БП и УТ — нормальная ситуация. В БП остаток считается по бухгалтерскому счёту и организации, в УТ — по складскому регистру, где могут быть ордерные склады и резервы.

Откуда 1С берёт остатки: регистры и виртуальные таблицы

Любой отчёт об остатках читает регистр. Документ при проведении пишет в регистр движения: приход со знаком «плюс», расход со знаком «минус». Остаток — это сумма движений на момент времени.

Хранить и пересчитывать все движения каждый раз было бы медленно. Поэтому платформа держит итоги — заранее посчитанные остатки по месяцам. Запрос к виртуальной таблице берёт ближайший итог и досчитывает движения до нужной даты.

Какие виртуальные таблицы есть у регистра накопления вида «Остатки»:

  • 📦 Остатки(Период, Условие) — остаток на момент времени;
  • 📈 Обороты(НачалоПериода, КонецПериода, Периодичность, Условие) — приход и расход;
  • 📊 ОстаткиИОбороты(...) — всё сразу: начальный остаток, приход, расход, конечный остаток.

Ресурсы в таблице получают суффикс: у ресурса Количество будет поле КоличествоОстаток, а в ОстаткиИОбороты — КоличествоНачальныйОстаток, КоличествоПриход, КоличествоРасход, КоличествоКонечныйОстаток.

Где лежат остатки в типовых конфигурациях:

КонфигурацияОбъектОсобенность
Бухгалтерия 3.0Регистр бухгалтерии ХозрасчетныйНоменклатура и склад — субконто счёта
Управление торговлей 11Регистр накопления ТоварыНаСкладахСкладской учёт: склад, характеристика, серия
Управление торговлей 11Регистр накопления СвободныеОстаткиОстаток за вычетом резервов

Состав измерений и ресурсов зависит от релиза. Перед написанием запроса откройте регистр в конфигураторе или в конструкторе запроса и посмотрите реальные поля.

Запрос остатков на языке 1С: рабочие примеры

Писать и проверять запросы удобно в консоли запросов (внешняя обработка) или прямо в конструкторе запроса в конфигураторе. Конструктор сам подставит поля виртуальной таблицы.

Остатки по складу из регистра накопления (УТ 11)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Остатки.Номенклатура КАК Номенклатура,
|	Остатки.Характеристика КАК Характеристика,
|	Остатки.ВНаличииОстаток КАК Количество
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(
|		&Период,
|		Склад = &Склад) КАК Остатки
|ГДЕ
|	Остатки.ВНаличииОстаток > 0
|
|УПОРЯДОЧИТЬ ПО
|	Номенклатура";

Запрос.УстановитьПараметр("Период", Новый Граница(КонецДня(ТекущаяДата()), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Строка(Выборка.Номенклатура) + ": " + Формат(Выборка.Количество, "ЧДЦ=3; ЧН=0"));
КонецЦикла;

Отбор по складу стоит в параметрах виртуальной таблицы, а условие > 0 — в ГДЕ. Это не случайность, об этом ниже.

Остатки на конец дня: ловушка с датой

Если передать в параметр Период просто дату 07.10.2026 0:00:00, вы получите остаток на начало этого дня. Движения за сам день не попадут.

Варианты правильно:

  • 📅 КонецДня(Дата) — почти верно, но движения ровно в 23:59:59 не войдут;
  • ✅ Новый Граница(КонецДня(Дата), ВидГраницы.Включая) — войдут все движения дня;
  • 🧾 Новый Граница(МоментВремени(), ВидГраницы.Исключая) — остаток на момент документа, без его собственных движений.

Последний вариант нужен в модуле документа, когда вы проверяете, хватает ли товара до проведения.

Остатки из регистра бухгалтерии (БП 3.0)

В бухгалтерии остаток лежит на счёте, а номенклатура и склад — субконто. Виды субконто передают массивом, и их порядок задаёт, что окажется в Субконто1 и Субконто2.

ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);

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

Запрос.УстановитьПараметр("Период", Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Запрос.УстановитьПараметр("Организация", Организация);

ТаблицаОстатков = Запрос.Выполнить().Выгрузить();

В ИЕРАРХИИ захватывает субсчета: 41.01, 41.02 и так далее. Если нужен только один субсчёт, используйте Счет = &Счет.

Движение за период: ОстаткиИОбороты

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

Третий параметр — периодичность (День, Месяц), четвёртый — метод дополнения движениями и границами периода. Пустые значения дают одну строку на номенклатуру за весь период.

Почему запрос остатков тормозит и как это исправить

Медленный запрос остатков почти всегда упирается в одну из четырёх причин.

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

// Медленно
|ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период) КАК Т
|ГДЕ Т.Склад = &Склад

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

Исключение — условия на ресурсы. ВНаличииОстаток > 0 в параметры таблицы не поставить: остаток ещё не посчитан. Его место — в ГДЕ.

2. Выключены итоги. Без итогов платформа суммирует все движения с начала учёта. Проверить: Все функции → Стандартные → Управление итогами. Должно быть включено использование итогов, а период рассчитанных итогов — близко к текущему месяцу.

Пересчёт итогов на большой базе нагружает сервер и замедляет работу пользователей. Запускайте его вне рабочего времени.

3. Соединение с виртуальной таблицей без отбора. Классическая ошибка — ЛЕВОЕ СОЕДИНЕНИЕ документа с Остатки(&Период) без условия. Сначала положите нужную номенклатуру во временную таблицу, затем отберите остатки через Номенклатура В (ВЫБРАТЬ ... ИЗ ВТ).

4. Запрос в цикле. Сто запросов по одному товару в сто раз медленнее одного запроса по списку товаров. Передайте массив в параметр и используйте В (&СписокНоменклатуры).

Найти проблемный запрос помогают замер производительности в конфигураторе и технологический журнал на сервере. Замер покажет строку кода, журнал — сам текст запроса к СУБД и его длительность.

Остатки по партиям, сериям и характеристикам

Чем подробнее учёт, тем больше измерений в регистре и тем внимательнее нужно писать запрос.

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

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

Серии. В УТ 11 серия — измерение складского регистра, но заполняется только для видов номенклатуры с учётом по сериям. У остальных товаров поле пустое, и отбор Серия = &Серия такие строки отбросит.

Партии и себестоимость. Количество на складе и стоимость партий в УТ 11 и ERP хранятся в разных регистрах. Складской регистр стоимости не знает. Сумму остатка в БП 3.0 берите из ресурса Сумма регистра бухгалтерии, а в УТ 11 — из отчётов по себестоимости, а не из ТоварыНаСкладах.

Свободный остаток. Для «сколько можно продать» в УТ 11 нужен не физический остаток, а свободный — за вычетом резервов. Его логичнее брать из регистра СвободныеОстатки или из отчёта «Остатки и доступность товаров», чем считать вручную.

Какой остаток вам нужен?

Получить остатки программно и выгрузить наружу

Запрос — не единственный способ. Иногда короче вызвать метод менеджера или отдать данные внешней системе.

Методы менеджера регистра

У менеджера регистра накопления есть метод Остатки(), он возвращает таблицу значений без текста запроса:

Отбор = Новый Структура("Склад", Склад);
Таблица = РегистрыНакопления.ТоварыНаСкладах.Остатки(ТекущаяДата(), Отбор);

Удобно для быстрых проверок. Для отчётов и соединений с другими данными запрос гибче.

Контроль остатков при проведении

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

Порядок в своей доработке:

  1. Установите управляемую блокировку на записи регистра по товарам и складу документа.
  2. Запишите движения.
  3. Выполните запрос к Остатки(&МоментДокумента, ...) по тем же товарам с условием ВНаличииОстаток < 0.
  4. При непустом результате выведите сообщение и установите Отказ = Истина.

Без блокировки два пользователя одновременно продадут последнюю единицу товара.

Внешние интеграции

СпособКогда подходитЧто нужно
ODataСайт, BI, Excel Power QueryПубликация базы на веб-сервере и включение регистра в состав стандартного интерфейса OData
HTTP-сервисСвоя логика, свой формат ответа (JSON)Доработка конфигурации или расширение
COM-соединениеСкрипт на Windows рядом с базойЗарегистрированный V83.COMConnector
Выгрузка файломМаркетплейс, поставщик раз в деньРегламентное задание, пишущее CSV или XML

Для OData остатки регистра накопления читаются функцией Balance:

/odata/standard.odata/AccumulationRegister_ТоварыНаСкладах/Balance(Period=datetime'2026-10-07T23:59:59')?$format=json

Для внешнего доступа создайте отдельного пользователя с правами только на чтение нужных объектов. Не отдавайте интеграции учётную запись администратора.

Если остаток в запросе не совпадает с отчётом

Частая жалоба: «запрос показывает 15, а отчёт — 12». Проверьте по порядку:

  • 🕐 Дата. Отчёт строится на конец дня, а запрос — на начало (см. ловушку с Граница).
  • 🏢 Организация. В БП отчёт может быть отфильтрован по одной организации, а запрос — нет.
  • 🧩 Регистр. Отчёт «Остатки и доступность» в УТ 11 показывает свободный остаток, а запрос к ТоварыНаСкладах — физический.
  • 📄 Непроведённые и отложенные документы. В регистр попадают только проведённые документы. Ордерная схема склада в УТ 11 даёт разницу между «оформлено» и «принято на склад».
  • 🔢 Итоги. Если итоги рассчитаны с ошибкой, помогает их пересчёт через Управление итогами (вне рабочего времени).

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

Можно ли получить остатки на произвольную дату в прошлом?
Да. Передайте дату в параметр Период виртуальной таблицы Остатки. Платформа возьмёт ближайший итог и досчитает движения.
Чем остатки в регистре бухгалтерии отличаются от регистра накопления?
В регистре бухгалтерии остаток считается по счёту и субконто и делится на дебетовый и кредитовый. Поэтому поля называются КоличествоОстатокДт, СуммаОстатокКт и так далее.
Почему в запросе нет поля КоличествоОстаток?
Значит, у регистра другой ресурс. Откройте виртуальную таблицу в конструкторе запроса и посмотрите список полей: суффикс Остаток добавляется к имени каждого ресурса.
Как получить остатки по нескольким складам одной строкой?
Сгруппируйте по номенклатуре и просуммируйте ресурс, а отбор по складам задайте в параметрах таблицы: Склад В (&Склады).
Можно ли запросить остатки без доступа к конфигуратору?
Да. Внешнюю обработку «Консоль запросов» открывают через Файл → Открыть в пользовательском режиме, если у пользователя есть право на открытие внешних обработок.