Остатки товаров в 1С: от готового отчёта до текста запроса
Содержание
Чтобы запросить остатки в 1С, пользователю хватит готового отчёта: в БП 3.0 это Склад → Отчёты → Остатки товаров, в УТ 11 — Склад и доставка → Отчёты по складу → Остатки и доступность товаров. Программисту нужен запрос к виртуальной таблице Остатки регистра накопления или регистра бухгалтерии, с датой и отбором в параметрах таблицы.
Отчёт отвечает на вопрос «сколько лежит», запрос нужен, когда остатки идут в обработку, печатную форму, проверку при проведении или во внешнюю систему.
Готовые отчёты: остатки без программирования
Если задача — узнать, сколько товара на складе на дату, писать запрос не нужно. В типовых конфигурациях отчёты уже есть.
| Конфигурация | Где найти | Что показывает |
|---|---|---|
| Бухгалтерия 3.0 | Склад → Отчёты → Остатки товаров | Количество и сумма по складам на дату |
| Бухгалтерия 3.0 | Склад → Отчёты → Ведомость по товарам на складах | Начальный остаток, приход, расход, конечный остаток за период |
| Бухгалтерия 3.0 | Отчёты → Оборотно-сальдовая ведомость по счёту (41, 10, 43) | Остатки в разрезе субконто счёта |
| Управление торговлей 11 | Склад и доставка → Отчёты по складу → Остатки и доступность товаров | В наличии, в резерве, доступно |
| Управление торговлей 11 | Склад и доставка → Отчёты по складу → Ведомость по товарам на складах | Движение за период |
Как настроить отчёт под себя:
- Откройте отчёт и задайте дату или период в шапке.
- Нажмите
Настройкии переключитесь в расширенный режим, если нужен отбор по группе номенклатуры или складу. - На вкладке группировок добавьте нужный разрез: склад, характеристика, серия.
- Сохраните вариант отчёта, чтобы не настраивать заново.
В БП 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 нужен не физический остаток, а свободный — за вычетом резервов. Его логичнее брать из регистра СвободныеОстатки или из отчёта «Остатки и доступность товаров», чем считать вручную.
Получить остатки программно и выгрузить наружу
Запрос — не единственный способ. Иногда короче вызвать метод менеджера или отдать данные внешней системе.
Методы менеджера регистра
У менеджера регистра накопления есть метод Остатки(), он возвращает таблицу значений без текста запроса:
Отбор = Новый Структура("Склад", Склад);
Таблица = РегистрыНакопления.ТоварыНаСкладах.Остатки(ТекущаяДата(), Отбор);
Удобно для быстрых проверок. Для отчётов и соединений с другими данными запрос гибче.
Контроль остатков при проведении
Современный подход в типовых конфигурациях: документ сначала записывает движения, затем запросом проверяет, не ушёл ли остаток в минус. Если ушёл — проведение отменяется с сообщением.
Порядок в своей доработке:
- Установите управляемую блокировку на записи регистра по товарам и складу документа.
- Запишите движения.
- Выполните запрос к
Остатки(&МоментДокумента, ...)по тем же товарам с условиемВНаличииОстаток < 0. - При непустом результате выведите сообщение и установите
Отказ = Истина.
Без блокировки два пользователя одновременно продадут последнюю единицу товара.
Внешние интеграции
| Способ | Когда подходит | Что нужно |
|---|---|---|
| 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 даёт разницу между «оформлено» и «принято на склад».
- 🔢 Итоги. Если итоги рассчитаны с ошибкой, помогает их пересчёт через
Управление итогами(вне рабочего времени).
Частые вопросы
Можно ли получить остатки на произвольную дату в прошлом?
Период виртуальной таблицы Остатки. Платформа возьмёт ближайший итог и досчитает движения.Чем остатки в регистре бухгалтерии отличаются от регистра накопления?
КоличествоОстатокДт, СуммаОстатокКт и так далее.Почему в запросе нет поля КоличествоОстаток?
Остаток добавляется к имени каждого ресурса.Как получить остатки по нескольким складам одной строкой?
Склад В (&Склады).Можно ли запросить остатки без доступа к конфигуратору?
Файл → Открыть в пользовательском режиме, если у пользователя есть право на открытие внешних обработок.