Работа с регистрами накопления в 1С:Предприятие — одна из ключевых задач для разработчиков, бухгалтеров и аналитиков. Эти объекты хранят данные о движениях товаров, денежных средств, расчетов с контрагентами и других изменяющихся во времени показателей. Однако не всегда очевидно, как быстро и корректно получить актуальные остатки — особенно если речь идет о больших объемах данных или нестандартных периодах.
В этой статье мы разберем 5 проверенных способов получения остатков регистров накопления — от стандартных отчетов до сложных программных конструкций. Вы узнаете, как избежать типичных ошибок при работе с виртуальными таблицами, почему иногда остатки не сходятся с оборотками, и как оптимизировать запросы для ускорения работы. Материал будет полезен как начинающим 1С-разработчикам, так и опытным специалистам, которые хотят систематизировать свои знания.
Особое внимание уделим разнице между остатками на начало/конец периода и остатками по состоянию на дату — этот нюанс часто становится причиной ошибок в отчетности. Также рассмотрим, как работать с остатками в разрезе измерений и какие инструменты платформы 1С 8.3 помогут автоматизировать процесс.
1. Стандартные отчеты 1С для остатков регистров накопления
Самый простой способ получить остатки — воспользоваться встроенными отчетами платформы. Они не требуют знания языка запросов и подходят для большинства типовых задач. Рассмотрим основные инструменты:
- 📊 "Оборотно-сальдовая ведомость по регистру накопления" — показывает остатки на начало и конец периода, а также обороты. Доступна через меню
Отчеты → Стандартные → Оборотно-сальдовая ведомость по регистру. - 📈 "Анализ регистра накопления" — позволяет детализировать остатки по измерениям и ресурсам. Находится в
Отчеты → Анализ → Анализ регистра накопления. - 🔍 "Универсальный отчет" — гибкий инструмент для создания произвольных отчетов по регистрам. Вызывается через
Отчеты → Универсальный отчет.
Чтобы воспользоваться стандартным отчетом, выполните следующие шаги:
- Откройте нужный отчет через главное меню.
- В поле "Регистр накопления" выберите требуемый регистр (например,
ТоварыНаСкладахилиВзаиморасчетыСКонтрагентами). - Укажите период (дату начала и конца) или конкретную дату для остатков.
- При необходимости добавьте отборы по измерениям (склад, организация, контрагент).
- Нажмите "Сформировать".
☑️ Подготовка к формированию отчета
Стандартные отчеты удобны своей простотой, но имеют ограничения:
- 🚫 Нет возможности сложной группировки данных (например, остатки по нескольким измерениям одновременно).
- 🚫 Не всегда корректно работают с большими объемами данных (может "подвисать" интерфейс).
- 🚫 Не поддерживают произвольные вычисления (например, остатки в процентах от общего объема).
⚠️ Внимание: Если в отчете остатки не совпадают с ожидаемыми значениями, проверьте настройки учета в регистре. Частая ошибка — неверно указанный признак Периодичность (например, "По регистратору" вместо "По дате").
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),
Склад = &Склад
) КАК Остатки
Обратите внимание, что время указывается в формате ДАТАВРЕМЯ(Год, Месяц, День, Часы, Минуты, Секунды).
Почему остатки в отчете не совпадают с данными в регистре?
Частые причины:
- В отчете не учтены все измерения (например, не указан склад).
- Период в отчете отличается от периода движений в регистре.
- В конфигурации настроены дополнительные отборы (например, по организации).
- Данные в регистре были исправлены ретроактивно, но не перепроводились документы.
Для диагностики сравните данные через запрос к виртуальной таблице ОстаткиИОбороты с детализацией по датам.
Можно ли получить остатки по регистру накопления без прав на конфигуратор?
Да, если у вас есть права на:
- Чтение регистра накопления (настраивается в ролях).
- Использование консоли запросов (
Сервис → Консоль запросов). - Формирование стандартных отчетов.
Если прав недостаточно, обратитесь к администратору базы за настройкой роли. Пример минимальных прав для чтения остатков:
Права:
- Чтение: РегистрНакопления.ТоварыНаСкладах (все поля)
- Использование: КонсольЗапросов
Как экспортировать остатки регистра накопления в Excel?
Способ 1. Через стандартный отчет:
- Сформируйте отчет (например, "Оборотно-сальдовая ведомость").
- Нажмите "Еще → Выгрузить" и выберите формат
Excel.
Способ 2. Программно:
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
ТаблицаExcel = Новый ТабличныйДокумент;
ТаблицаExcel.Вывести(РезультатЗапроса);
ТаблицаExcel.Записать("C:\Остатки.xlsx", ТипФайлаТабличногоДокумента.Excel);
Для большого объема данных используйте ПакетныйРежим:
Пакет = Новый ПакетЗапросов;
Пакет.Добавить(ТекстЗапроса);
Результат = Пакет.Выполнить().Выгрузить();
Что делать, если запрос к регистру накопления выполняется слишком долго?
Порядок действий:
- Проверьте план выполнения запроса (
.ВыгрузитьПлан()). Ищите операцииПолноеСканирование. - Добавьте индексы по измерениям в запрос:
ИНДЕКСИРОВАТЬ ПО Склад, Номенклатура. - Разбейте период на более мелкие интервалы (по месяцам/неделям).
- Используйте временные таблицы для промежуточных результатов.
- Если регистр очень большой (>10 млн записей), рассмотрите архивацию старых данных.
Пример оптимизированного запроса:
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
СУММА(Остатки.КоличествоОстаток) КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК Остатки
ИНДЕКСИРОВАТЬ ПО Номенклатура
СГРУППИРОВАТЬ ПО Остатки.Номенклатура