Получение остатков товаров на каждый день в 1С:Предприятие — одна из самых востребованных задач при анализе динамики запасов, планировании закупок или формировании отчетности. Стандартные отчеты (например, "Ведомость по товарам на складах") часто выдают остатки только на текущую дату или за период в целом, что не всегда удобно. Между тем, с помощью запросов 1С и виртуальных таблиц можно выгрузить детализированные данные по дням — и сегодня мы разберем, как это сделать правильно.
Многие разработчики и аналитики сталкиваются с проблемами: запрос работает слишком долго, выдает некорректные данные или вообще не возвращает результатов. Причины кроются в неверном использовании виртуальных таблиц, отсутствии индексов или неправильной логике расчета. В этой статье вы найдете готовые примеры кода, объяснение принципов работы виртуальных таблиц остатков, а также советы по оптимизации для крупных баз данных.
Мы рассмотрим:
- 🔹 Какие виртуальные таблицы использовать для остатков по дням
- 🔹 Как избежать ошибок с датами и разрезами
- 🔹 Примеры запросов для 1С:Управление торговлей, ERP и Бухгалтерии
- 🔹 Способы ускорения медленных запросов
1. Виртуальные таблицы для остатков: какую выбрать
В 1С:Предприятие 8 для работы с остатками предназначены две ключевые виртуальные таблицы:
- 📊 ОстаткиТоваров — содержит остатки на указанную дату (или диапазон дат) с возможностью группировки по складам, номенклатуре, характеристикам и т.д. Подходит для статичных отчетов.
- 📈 ОстаткиТоваров.Обороты — возвращает остатки на каждый день периода с учетом всех движений документов. Именно она нужна для анализа динамики.
Основное отличие: первая таблица показывает "срез" на конкретную дату, а вторая — историю изменений по дням. Например, если вам нужно узнать, сколько товара было на складе 01.01.2026, 02.01.2026 и так далее — используйте ОстаткиТоваров.Обороты.
Важно: в конфигурациях типа 1С:Бухгалтерия аналогичные таблицы называются ОстаткиМатериалов или ОстаткиНоменклатуры — уточняйте названия в синтакс-помощнике (F1 в конструкторе запросов).
⚠️ Внимание: В некоторых версиях 1С:УТ 10.3 и КА 1.1 виртуальная таблицаОстаткиТоваров.Оборотыможет отсутствовать. В этом случае используйте комбинацию изРегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты()с параметромПериодичность = День.
2. Базовый запрос: остатки по дням за период
Рассмотрим простейший пример запроса, который вернет остатки товара на каждый день за указанный период. Допустим, нам нужны данные по номенклатуре "Стул офисный" на складе "Основной" с 01.01.2026 по 31.01.2026:
ВЫБРАТЬ
ОстаткиТоваровОбороты.Период КАК Дата,
ОстаткиТоваровОбороты.Номенклатура КАК Товар,
ОстаткиТоваровОбороты.Склад КАК Склад,
ОстаткиТоваровОбороты.КоличествоОстаток КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
День,
Номенклатура В (&СписокНоменклатуры),
Склад В (&СписокСкладов)
) КАК ОстаткиТоваровОбороты
УПОРЯДОЧИТЬ ПО
Дата
Где:
- 📅
&НачалоПериодаи&КонецПериода— параметры запроса с датами начала и конца периода. - 📦
&СписокНоменклатурыи&СписокСкладов— массивы с отбором по номенклатуре и складам (можно передать пустые массивы для выгрузки всех данных). - 🔄
Периодичность = День— обязательный параметр для получения остатков на каждый день.
Если вам не нужны все поля, оставьте только необходимые (например, Дата и Остаток), чтобы ускорить выполнение.
Чтобы проверить корректность запроса, сначала выполните его без отборов по номенклатуре и складам. Так вы убедитесь, что данные вообще формируются, а уже потом добавляйте фильтры.
3. Расширенные возможности: группировка и дополнительные поля
Базовый запрос можно модифицировать для решения специфических задач. Например, добавить:
- 🏷️ Характеристики номенклатуры (цвет, размер и т.д.)
- 💰 Суммовые остатки (не только количественные)
- 📦 Серии товаров (если ведется учет по сериям)
Пример запроса с суммовыми остатками и характеристиками:
ВЫБРАТЬ
Остатки.Период КАК Дата,
Остатки.Номенклатура КАК Товар,
Остатки.ХарактеристикаНоменклатуры КАК Характеристика,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Количество,
Остатки.СуммаОстаток КАК Сумма
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
День,
Номенклатура В (&СписокНоменклатуры),
Склад В (&СписокСкладов)
) КАК Остатки
УПОРЯДОЧИТЬ ПО
Дата,
Товар
Для удобства анализа можно добавить вычисляемые поля, например, стоимость единицы товара:
ВЫБРАТЬ
...,
Остатки.СуммаОстаток / Остатки.КоличествоОстаток КАК ЦенаЗаЕдиницу
⚠️ Внимание: Деление на ноль! Если остаток по количеству равен 0, запрос вернет ошибку. Чтобы избежать этого, используйте конструкцию ВЫРАЗИТЬ(Остатки.СуммаОстаток / НУЛЬ(Остатки.КоличествоОстаток, 1) КАК Число(15, 2)).
4. Оптимизация запросов: как ускорить работу
Запросы остатков по дням могут выполняться долго, особенно на крупных базах с миллионами движений. Вот несколько способов оптимизации:
| Проблема | Решение | Эффект |
|---|---|---|
| Долгое выполнение на большом периоде | Разбить период на подпериоды (например, по месяцам) и объединить результаты | Ускорение в 5-10 раз |
| Запрос "виснет" при выгрузке всех товаров | Добавить отбор по конкретной номенклатуре или группе | Снижение нагрузки на сервер |
| Ненужные поля в результате | Оставить только необходимые колонки (например, только Дата и Остаток) |
Уменьшение объема данных |
| Отсутствуют индексы | Проверить наличие индексов по полям Номенклатура, Склад, Период в регистре накопления |
Ускорение фильтрации |
Еще один эффективный прием — использование временных таблиц для промежуточных данных. Например, если вам нужно рассчитать остатки по сложной формуле, сначала сохраните базовые данные во временную таблицу, а затем выполните над ними дополнительные операции.
Пример с временной таблицей:
// Создаем временную таблицу с остатками
ВЫБРАТЬ
Остатки.Период КАК Дата,
Остатки.Номенклатура КАК Товар,
Остатки.КоличествоОстаток КАК Остаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(...) КАК Остатки;
// Добавляем вычисляемые поля
ВЫБРАТЬ
ВТ_Остатки.Дата,
ВТ_Остатки.Товар,
ВТ_Остатки.Остаток,
ВТ_Остатки.Остаток * 1.1 КАК ОстатокСНаценкой
ИЗ
ВТ_Остатки
Использование временных таблиц снижает нагрузку на сервер, так как промежуточные данные не пересчитываются при каждом обращении.
5. Типичные ошибки и как их избежать
Даже опытные разработчики иногда допускают ошибки при работе с остатками по дням. Вот наиболее распространенные:
- 🗓️ Неверный период. Если в параметре
КонецПериодауказать дату раньше, чем вНачалоПериода, запрос вернет пустой результат. Всегда проверяйте порядок дат. - 🔍 Отсутствие отборов. Запрос без фильтров по номенклатуре или складам может "подвесить" базу. Всегда ограничивайте выборку.
- 📉 Игнорирование виртуальных таблиц. Попытка рассчитать остатки "вручную" через обороты документов часто приводит к ошибкам в расчетах.
- 🔄 Неправильная периодичность. Если указать
Периодичность = МесяцвместоДень, вы получите остатки только на конец каждого месяца.
Частая проблема — несовпадение остатков с данными стандартных отчетов. Причины:
- В запросе не учтены все склады или номенклатурные группы.
- Используется другая дата инвентаризации.
- В настройках регистра накопления отключен учет по характеристикам или сериям.
Чтобы диагностировать проблему, сравните:
- Данные вашего запроса.
- Результаты стандартного отчета (например, "Ведомость по товарам").
- Движения документов за период (через отчет "Анализ субконто").
Что делать, если запрос возвращает пустой результат?
1. Проверьте, что период не пустой (например, не ДатаНачала = ДатаОкончания).
2. Убедитесь, что в базе есть движения по указанной номенклатуре/складу за этот период.
3. Попробуйте выполнить запрос без отборов — если данные появились, проблема в фильтрах.
4. Проверьте права доступа: возможно, у пользователя нет прав на чтение регистра накопления.
6. Примеры для разных конфигураций 1С
Синтаксис запросов может slightly отличаться в зависимости от конфигурации. Ниже — адаптированные примеры для популярных решений.
1С:Управление торговлей 11 (УТ 11)
Используйте регистр ТоварыНаСкладах:
ВЫБРАТЬ
Остатки.Период КАК Дата,
Остатки.Номенклатура КАК Товар,
Остатки.КоличествоОстаток КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
День
) КАК Остатки
1С:ERP Управление предприятием 2
Аналогично УТ 11, но с учетом особенностей ERP (например, можно добавить аналитику по подразделениям):
ВЫБРАТЬ
Остатки.Период КАК Дата,
Остатки.Номенклатура КАК Товар,
Остатки.Склад КАК Склад,
Остатки.Подразделение КАК Подразделение,
Остатки.КоличествоОстаток КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(...) КАК Остатки
1С:Бухгалтерия 3.0
Здесь используются другие регистры:
ВЫБРАТЬ
Остатки.Период КАК Дата,
Остатки.Номенклатура КАК Товар,
Остатки.Количество КАК Остаток
ИЗ
РегистрНакопления.Товары.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
День
) КАК Остатки
⚠️ Внимание: В 1С:Бухгалтерии учет товаров может вестись не только в регистреТовары, но и вТоварыНаСкладах(если включена соответствующая функциональность). Уточните структуру хранения в вашей базе.
7. Автоматизация: как выгружать остатки регулярно
Если остатки по дням нужны регулярно (например, для анализа продаж или планирования закупок), имеет смысл автоматизировать процесс. Варианты:
- 🤖 Регламентное задание. Настройте автоматическую выгрузку данных в файл (например,
CSVилиExcel) с помощью регламентного задания. Пример кода для выгрузки вExcel:Процедура ВыгрузитьОстаткиВExcel()Запрос = Новый Запрос(ТекстЗапроса);
Результат = Запрос.Выполнить();
ТаблицаДокумента = Новый ТаблицаДокумента;
ТаблицаДокумента.Вывести(Результат);
ТаблицаДокумента.Записать("C:\Остатки\Остатки_по_дням.xlsx");
КонецПроцедуры
- 📊 Внешняя обработка. Разработайте обработку с гибкими настройками (период, склады, номенклатура) и кнопкой выгрузки. Это удобно для пользователей без доступа к конфигуратору.
- 🔄 Обмен данными. Настройте автоматический экспорт остатков в внешнюю систему (например, Power BI или Google Sheets) через
HTTP-сервисыилиREST API.
Для крупных баз рекомендуется выгружать данные почастям (например, по неделям) и объединять их во внешней системе. Это снизит нагрузку на сервер 1С.
Убедиться, что на сервере достаточно свободного места для файлов выгрузки|Проверить права пользователя на запись в папку|Протестировать запрос на небольшом периоде|Настроить архивацию старых файлов|Добавить уведомление об ошибках на email-->
8. Альтернативные способы получения остатков
Если запросы работают слишком медленно или не подходят по другим причинам, рассмотрите альтернативные методы:
- 📄 Отчет "Анализ доступности товаров". В 1С:УТ и ERP этот отчет позволяет получить остатки с детализацией по дням через графический интерфейс (без программирования). Путь:
Отчеты → Товары → Анализ доступности товаров. - 📈 Регистры сведений. Если нужно хранить историю остатков для быстрого доступа, создайте регистр сведений с периодичностью
Деньи наполняйте его данными через регламентное задание. - 🔗 Внешние обработки. Готовые обработки (например, "Универсальный отчет по остаткам") часто содержат оптимизированные алгоритмы для выгрузки данных по дням.
Для сложных аналитических задач (например, прогнозирования спроса) можно экспортировать остатки в Power BI или Excel и строить там графики динамики. Пример связи с Power BI:
- Выгрузите данные в
CSVчерез запрос. - Подключите файл к Power BI Desktop.
- Постройте визуализацию с осью времени (например, график остатков по дням).
Если вам нужна реальная аналитика, а не просто выгрузка данных, обратите внимание на специализированные решения, такие как 1С:Аналитика или Qlik Sense, которые умеют работать с историческими данными 1С.
Для долговременного хранения истории остатков лучше использовать внешние системы (OLAP-кубы, базы данных). Это разгрузит рабочую базу 1С и ускорит аналитику.
FAQ: Частые вопросы по остаткам в 1С
Как получить остатки по дням для конкретного товара?
Добавьте в запрос отбор по номенклатуре:
ГДЕ Остатки.Номенклатура = &Товар
Где &Товар — параметр запроса со ссылкой на нужный элемент справочника Номенклатура.
Почему запрос возвращает остатки только на конец периода?
Скорее всего, вы используете виртуальную таблицу ОстаткиТоваров вместо ОстаткиТоваров.Обороты. Замените ее на:
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(..., День)
Как ускорить запрос на большой базе (100+ Гб)?
Рекомендации:
- Разбейте период на более мелкие интервалы (например, по месяцам) и объедините результаты.
- Используйте временные таблицы для промежуточных данных.
- Добавьте отбор по конкретному складу или группе номенклатуры.
- Проверьте наличие индексов в регистре накопления.
Можно ли получить остатки по дням в стандартном отчете без программирования?
Да, в 1С:УТ 11 и ERP 2 используйте отчет "Анализ доступности товаров":
- Откройте отчет по пути
Отчеты → Товары → Анализ доступности товаров. - В настройках выберите периодичность "День".
- Укажите нужный период и склады.
- Нажмите "Сформировать".
В результате вы получите таблицу с остатками на каждый день.
Как выгрузить остатки по дням в Excel с сохранением форматирования?
Используйте следующий код:
Процедура ВыгрузитьВExcel()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Период КАК Дата,
| Остатки.Номенклатура КАК Товар,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(...) КАК Остатки";
Результат = Запрос.Выполнить();
Таблица = Новый ТаблицаЗначений;
Таблица.Загрузить(Результат);
Экспорт = Новый ЭкспортВExcel;
Экспорт.УстановитьДанные(Таблица);
Экспорт.Форматирование.АвтоПодборШириныКолонок = Истина;
Экспорт.Записать("C:\Остатки.xlsx");
КонецПроцедуры
Для красивого оформления добавьте:
- Заголовки колонок (
Таблица.Колонки[0].Заголовок = "Дата"). - Условное форматирование (например, красный цвет для отрицательных остатков).
- Автофильтры (
Экспорт.Форматирование.Автофильтр = Истина).