Работа с регистрами накопления в 1С:Предприятие — одна из ключевых задач для разработчиков, бухгалтеров и аналитиков. Эти объекты хранят данные о движениях товаров, денежных средств, расчетов с контрагентами и других изменяющихся во времени показателей. Однако не всегда очевидно, как быстро и корректно получить актуальные остатки — особенно если речь идет о больших объемах данных или нестандартных периодах.

В этой статье мы разберем 5 проверенных способов получения остатков регистров накопления — от стандартных отчетов до сложных программных конструкций. Вы узнаете, как избежать типичных ошибок при работе с виртуальными таблицами, почему иногда остатки не сходятся с оборотками, и как оптимизировать запросы для ускорения работы. Материал будет полезен как начинающим 1С-разработчикам, так и опытным специалистам, которые хотят систематизировать свои знания.

Особое внимание уделим разнице между остатками на начало/конец периода и остатками по состоянию на дату — этот нюанс часто становится причиной ошибок в отчетности. Также рассмотрим, как работать с остатками в разрезе измерений и какие инструменты платформы 1С 8.3 помогут автоматизировать процесс.

1. Стандартные отчеты 1С для остатков регистров накопления

Самый простой способ получить остатки — воспользоваться встроенными отчетами платформы. Они не требуют знания языка запросов и подходят для большинства типовых задач. Рассмотрим основные инструменты:

  • 📊 "Оборотно-сальдовая ведомость по регистру накопления" — показывает остатки на начало и конец периода, а также обороты. Доступна через меню Отчеты → Стандартные → Оборотно-сальдовая ведомость по регистру.
  • 📈 "Анализ регистра накопления" — позволяет детализировать остатки по измерениям и ресурсам. Находится в Отчеты → Анализ → Анализ регистра накопления.
  • 🔍 "Универсальный отчет" — гибкий инструмент для создания произвольных отчетов по регистрам. Вызывается через Отчеты → Универсальный отчет.

Чтобы воспользоваться стандартным отчетом, выполните следующие шаги:

  1. Откройте нужный отчет через главное меню.
  2. В поле "Регистр накопления" выберите требуемый регистр (например, ТоварыНаСкладах или ВзаиморасчетыСКонтрагентами).
  3. Укажите период (дату начала и конца) или конкретную дату для остатков.
  4. При необходимости добавьте отборы по измерениям (склад, организация, контрагент).
  5. Нажмите "Сформировать".

☑️ Подготовка к формированию отчета

Выполнено: 0 / 4

Стандартные отчеты удобны своей простотой, но имеют ограничения:

  • 🚫 Нет возможности сложной группировки данных (например, остатки по нескольким измерениям одновременно).
  • 🚫 Не всегда корректно работают с большими объемами данных (может "подвисать" интерфейс).
  • 🚫 Не поддерживают произвольные вычисления (например, остатки в процентах от общего объема).
⚠️ Внимание: Если в отчете остатки не совпадают с ожидаемыми значениями, проверьте настройки учета в регистре. Частая ошибка — неверно указанный признак Периодичность (например, "По регистратору" вместо "По дате").

2. Получение остатков через консоль запросов

Для более гибкой работы с остатками используйте консоль запросов (Сервис → Консоль запросов в конфигураторе). Этот метод позволяет:

  • 🎯 Точно указать период и условия отбора.
  • 📊 Группировать данные по нескольким измерениям.
  • ⚡ Оптимизировать производительность за счет правильных индексов.

Базовый запрос для получения остатков на конец периода:

ВЫБРАТЬ

ОстаткиНакопления.Склад КАК Склад,

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

ОстаткиНакопления.КоличествоОстаток КАК Остаток

ИЗ

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

ГДЕ

ОстаткиНакопления.Организация = &Организация

Где:

  • &Период — дата, на которую нужно получить остатки (например, ДАТАВРЕМЯ(2026, 12, 31, 23, 59, 59)).
  • &Организация — ссылка на организацию (можно получить через Справочники.Организации.НайтиПоНаименованию()).

Для остатков на начало периода используйте виртуальную таблицу ОстаткиИОбороты:

ВЫБРАТЬ

ОстаткиИОбороты.Склад КАК Склад,

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

ОстаткиИОбороты.КоличествоНачальныйОстаток КАК ОстатокНаНачало

ИЗ

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

💡

Чтобы ускорить выполнение запроса, добавьте условие ИНДЕКСИРОВАТЬ ПО для часто используемых полей, например: ИНДЕКСИРОВАТЬ ПО Склад, Номенклатура.

Виртуальная таблица Назначение Пример использования
Остатки() Остатки на конкретную дату Анализ текущих запасов на складе
ОстаткиИОбороты() Остатки на начало/конец периода + обороты Формирование оборотно-сальдовой ведомости
Обороты() Только обороты за период Анализ движения товаров за месяц
СрезПоследних() Последние записи по измерениям Поиск актуальных цен номенклатуры
⚠️ Внимание: При работе с виртуальными таблицами ОстаткиИОбороты и Обороты всегда указывайте оба параметра периода (&Начало и &Конец). Если передать только одну дату, платформа может некорректно интерпретировать запрос.

3. Программное получение остатков на встроенном языке

Для автоматизации задач (например, загрузки остатков в внешнюю систему или формирования сложных отчетов) используйте встроенный язык 1С. Основные методы:

Способ 1. Через менеджер регистра:

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

ДатаОкончания,

Организация = Справочники.Организации.НайтиПоНаименованию("ООО Ромашка"),

Склад = Справочники.Склады.ОсновнойСклад

);

Для Каждого СтрокаОстатка Из Остатки Цикл

Сообщить(СтрокаОстатка.Номенклатура.Наименование + ": " + СтрокаОстатка.КоличествоОстаток);

КонецЦикла;

Способ 2. Через запрос с параметрами:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

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

|ИЗ

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

Запрос.УстановитьПараметр("Дата", ТекущаяДата());

Запрос.УстановитьПараметр("Склад", Справочники.Склады.ОсновнойСклад);

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Ключевые различия методов:

  • 🔹 Менеджер регистра проще в использовании, но менее гибок (нельзя делать сложные группировки).
  • 🔹 Запрос позволяет использовать полный синтаксис языка запросов, но требует больше кода.
Как получить остатки по нескольким регистрам одновременно?

Используйте конструкцию ОБЪЕДИНИТЬ в запросе:

ВЫБРАТЬ

"Товары" КАК ТипРегистра,

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

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

ИЗ

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

ОБЪЕДИНИТЬ

ВЫБРАТЬ

"Деньги" КАК ТипРегистра,

ОстаткиДенег.Валюта,

ОстаткиДенег.СуммаОстаток

ИЗ

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

При программной работе с остатками учитывайте:

  • 🔸 Производительность: Запросы к виртуальным таблицам могут тормозить на больших базах. Используйте отборы по измерениям.
  • 🔸 Транзакции: Если остатки нужны для проводок, оберните код в транзакцию (НачатьТранзакцию()/ЗафиксироватьТранзакцию()).
  • 🔸 Права доступа: Проверьте, что у пользователя есть права на чтение регистра (ПрофилиГруппДоступа).

4. Распространенные ошибки и их решения

При работе с остатками регистров накопления разработчики часто сталкиваются с типичными проблемами. Разберем самые частые:

Ошибка 1. Остатки не совпадают с оборотками

Причина: Неправильно указан период в виртуальной таблице. Например, запрашиваете остатки на 31.12.2026, но в таблице ОстаткиИОбороты передаете период с 01.01.2026 по 31.12.2026. В этом случае остаток на конец периода будет равен остатку на 31.12, а не на 01.01 следующего года.

Решение: Для остатков на конец дня используйте:

Остатки(&ДатаКонца, )

Для остатков на начало дня:

Остатки(&ДатаНачала, )

Ошибка 2. Пустой результат запроса

Причины:

  • 🔴 Не указаны обязательные отборы (например, по организации).
  • 🔴 Неверный формат даты (передаете строку вместо Дата).
  • 🔴 Отсутствуют права на регистр у текущего пользователя.

Ошибка 3. Долгое выполнение запроса

Причины и решения:

Проблема Решение
Отсутствуют индексы по измерениям Добавьте ИНДЕКСИРОВАТЬ ПО в запрос
Слишком широкий период Разбейте запрос на подпериоды
Выборка всех полей (Остатки.*) Укажите только нужные поля
Использование РАЗЛИЧНЫЕ без необходимости Уберите РАЗЛИЧНЫЕ, если не нужны уникальные записи
📊 С какой ошибкой при работе с регистрами накопления вы сталкивались чаще?
Остатки не сходятся с оборотками
Запрос выполняется слишком долго
Пустой результат запроса
Ошибки прав доступа
Другая проблема

Для диагностики проблем используйте:

  • 🛠 План запроса (Запрос.Выполнить().ВыгрузитьПлан()) — покажет "узкие места".
  • 📝 Журнал регистрации — проверьте, нет ли ошибок при записи в регистр.
  • 🔍 Тестовый запрос — упростите запрос до минимального рабочего варианта.

5. Оптимизация работы с большими регистрами

Если регистр накопления содержит миллионы записей (например, ВзаиморасчетыСКонтрагентами в крупной компании), стандартные методы могут работать медленно. Рассмотрим способы оптимизации:

1. Разделение данных по периодам

Instead of querying the entire history, split the period into chunks (e.g., by month) and aggregate results:

Процедура ПолучитьОстаткиПоМесяцам(НачалоПериода, КонецПериода)

Результат = Новый ТаблицаЗначений;

ТекущаяДата = НачалоПериода;

Пока ТекущаяДата <= КонецПериода Цикл

КонецМесяца = КонецМесяца(ТекущаяДата);

Запрос = Новый Запрос(

"ВЫБРАТЬ ... ИЗ РегистрНакопления.Взаиморасчеты.Остатки(&Дата, )"

);

Запрос.УстановитьПараметр("Дата", КонецМесяца);

// Обработка результата

ТекущаяДата = НачалоСледующегоМесяца(ТекущаяДата);

КонецЦикла;

КонецПроцедуры

2. Использование временных таблиц

Для сложных отчетов предварительно сохраните данные во временную таблицу:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.Контрагент КАК Контрагент,

| Остатки.СуммаОстаток КАК Сумма

|ПОМЕСТИТЬ ВТ_Остатки

|ИЗ

| РегистрНакопления.Взаиморасчеты.Остатки(&Дата, ) КАК Остатки";

Запрос.Выполнить();

Запрос2 = Новый Запрос;

Запрос2.Текст =

"ВЫБРАТЬ

| ВТ.Контрагент,

| СУММА(ВТ.Сумма) КАК Итог

|ИЗ

| ВТ_Остатки КАК ВТ

|СГРУППИРОВАТЬ ПО ВТ.Контрагент";

3. Настройка индексов в конфигураторе

Откройте регистр в конфигураторе и проверьте:

  • 📌 Индексированы ли измерения, по которым часто делаются отборы.
  • 📌 Оптимизированы ли ресурсы (например, для числовых полей используйте тип Число(15,2) вместо Число(30,10)).
💡

Для регистров с более чем 1 млн записей обязательно используйте постраничную выборку (ПОМЕСТИТЬ + ЛИМИТ) или разбиение по периодам.

Дополнительные советы:

  • 💡 Архивируйте старые данные (например, старше 3 лет) в отдельные регистры.
  • 💡 Используйте Периодический режим записи, если не нужна история по каждому движению.
  • 💡 Для аналитических отчетов создайте отдельные регистры с агрегированными данными.

6. Сравнение методов: какой выбрать?

Выбор способа получения остатков зависит от задачи, объема данных и требуемой производительности. Сведем ключевые критерии в таблицу:

Метод Сложность Производительность Гибкость Когда использовать
Стандартные отчеты ⭐⭐ Быстрый анализ без программирования
Консоль запросов ⭐⭐ ⭐⭐⭐ ⭐⭐⭐ Сложные отборы, группировки
Встроенный язык (менеджер регистра) ⭐⭐ ⭐⭐ ⭐⭐ Автоматизация в обработках
Встроенный язык (запрос) ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ Сложная логика, интеграции
Оптимизированные запросы (временные таблицы) ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐ Большие объемы данных (>1 млн записей)

Рекомендации по выбору:

  • 🔹 Для разовых проверок используйте стандартные отчеты или консоль запросов.
  • 🔹 Для регулярных отчетов (ежедневных/ежемесячных) пишите обработки на встроенном языке.
  • 🔹 Для интеграций (обмен с сайтом, CRM) применяйте оптимизированные запросы с временными таблицами.
  • 🔹 Для больших баз (>50 ГБ) рассматривайте выгрузку данных в OLAP-кубы или внешние СУБД.
⚠️ Внимание: Если вы работаете с облачной версией 1С:Fresh, некоторые методы (например, прямые SQL-запросы) могут быть ограничены. Уточните возможности вашего тарифа в личном кабинете.

FAQ: Частые вопросы по остаткам регистров накопления

Как получить остатки по регистру накопления на конкретную дату и время?

Используйте виртуальную таблицу Остатки() с точным указанием даты и времени. Пример:

ВЫБРАТЬ

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

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

ИЗ

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

ДАТАВРЕМЯ(2026, 12, 31, 14, 30, 0),

Склад = &Склад

) КАК Остатки

Обратите внимание, что время указывается в формате ДАТАВРЕМЯ(Год, Месяц, День, Часы, Минуты, Секунды).

Почему остатки в отчете не совпадают с данными в регистре?

Частые причины:

  1. В отчете не учтены все измерения (например, не указан склад).
  2. Период в отчете отличается от периода движений в регистре.
  3. В конфигурации настроены дополнительные отборы (например, по организации).
  4. Данные в регистре были исправлены ретроактивно, но не перепроводились документы.

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

Можно ли получить остатки по регистру накопления без прав на конфигуратор?

Да, если у вас есть права на:

  • Чтение регистра накопления (настраивается в ролях).
  • Использование консоли запросов (Сервис → Консоль запросов).
  • Формирование стандартных отчетов.

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

Права:

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

- Использование: КонсольЗапросов

Как экспортировать остатки регистра накопления в Excel?

Способ 1. Через стандартный отчет:

  1. Сформируйте отчет (например, "Оборотно-сальдовая ведомость").
  2. Нажмите "Еще → Выгрузить" и выберите формат Excel.

Способ 2. Программно:

РезультатЗапроса = Запрос.Выполнить().Выгрузить();

ТаблицаExcel = Новый ТабличныйДокумент;

ТаблицаExcel.Вывести(РезультатЗапроса);

ТаблицаExcel.Записать("C:\Остатки.xlsx", ТипФайлаТабличногоДокумента.Excel);

Для большого объема данных используйте ПакетныйРежим:

Пакет = Новый ПакетЗапросов;

Пакет.Добавить(ТекстЗапроса);

Результат = Пакет.Выполнить().Выгрузить();

Что делать, если запрос к регистру накопления выполняется слишком долго?

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

  1. Проверьте план выполнения запроса (.ВыгрузитьПлан()). Ищите операции ПолноеСканирование.
  2. Добавьте индексы по измерениям в запрос: ИНДЕКСИРОВАТЬ ПО Склад, Номенклатура.
  3. Разбейте период на более мелкие интервалы (по месяцам/неделям).
  4. Используйте временные таблицы для промежуточных результатов.
  5. Если регистр очень большой (>10 млн записей), рассмотрите архивацию старых данных.

Пример оптимизированного запроса:

ВЫБРАТЬ

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

СУММА(Остатки.КоличествоОстаток) КАК Остаток

ИЗ

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

ИНДЕКСИРОВАТЬ ПО Номенклатура

СГРУППИРОВАТЬ ПО Остатки.Номенклатура