К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить данные из регистра накопления в 1С

Как получить данные из регистра накопления в 1С: запросы к таблицам остатков и оборотов, виртуальные таблицы, СКД, консоль запросов и типовые ошибки разработчика.

Регистр накопления в 1С хранит движения документов — приходы и расходы товаров, денег, взаиморасчётов. Но напрямую из физической таблицы движений данные для отчётов почти никогда не читают: платформа предоставляет виртуальные таблицы «Остатки», «Обороты» и «ОстаткиИОбороты», которые автоматически рассчитывают итоги на нужную дату. Понимание того, какая таблица за что отвечает, — ключ к быстрым и корректным запросам.

Способ получения данных зависит от задачи. Для разового анализа достаточно консоли запросов или отчёта на СКД без единой строки кода. Для программной обработки — проведения, заполнения документов, контроля остатков — используется язык запросов 1С или объектная модель через наборы записей. Ниже разобраны все основные варианты с примерами кода и указанием, когда какой подход выбирать.

Что хранит регистр накопления и какие таблицы доступны

Регистр накопления состоит из измерений (разрезы учёта: склад, номенклатура, контрагент), ресурсов (числовые показатели: количество, сумма) и реквизитов (дополнительная информация о движении). Каждая запись привязана к документу-регистратору и содержит вид движения — приход или расход.

Платформа формирует для регистра несколько логических таблиц. Физическая таблица движений содержит все записи без итогов — обращаться к ней напрямую имеет смысл только для анализа самих движений. Виртуальные таблицы рассчитываются платформой на лету по итоговым данным и работают значительно быстрее при правильном использовании.

Таблицы регистра накопления

Физическая таблица (без виртуальной)

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

Остатки

Сальдо по измерениям на момент времени. Только для регистров вида «Остатки».

Обороты

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

ОстаткиИОбороты

Начальный остаток, обороты и конечный остаток за период. Основа типовых отчётов по складам и расчётам.

Как получить остатки на дату через виртуальную таблицу Остатки

Самая частая задача — узнать, сколько товара осталось на складе на конкретный момент. Для этого служит виртуальная таблица Остатки. В параметрах таблицы передаются период и условие отбора; параметры указываются в скобках после имени таблицы через запятую.

ВЫБРАТЬ

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

Остатки.Склад,

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

ИЗ

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

Параметр &Период задаёт момент времени — если передать дату, остатки будут рассчитаны на начало этой даты. Чтобы получить остатки на конец дня, используйте объект Граница с видом «Включая» или передавайте дату со временем 23:59:59. Это одна из самых частых причин «неправильных» остатков в самописных отчётах.

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

Как получить обороты за период

Когда нужны не остатки, а движение товара — сколько поступило и сколько ушло за месяц — используется виртуальная таблица Обороты. У неё четыре параметра: начало периода, конец периода, периодичность и условие отбора.

ВЫБРАТЬ

Обороты.Номенклатура,

Обороты.КоличествоПриход,

Обороты.КоличествоРасход,

Обороты.КоличествоОборот

ИЗ

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

В параметре периодичности можно указать «День», «Месяц», «Регистратор» и другие значения — тогда в выборке появится поле периода или регистратора, и обороты будут сгруппированы по нему. Оставьте параметр пустым, если нужна одна итоговая строка на комбинацию измерений.

Обратите внимание на ресурсы: Приход и Расход — суммы по видам движения, а Оборот — их разность. Для регистра оборотов (вид регистра «Обороты») доступен только ресурс оборота, таблицы «Остатки» у такого регистра нет.

Остатки и обороты в одном запросе

Отчёт вида «было — пришло — ушло — стало» строится на виртуальной таблице ОстаткиИОбороты. Она принимает начало и конец периода, периодичность и отбор, а возвращает начальный остаток, приход, расход и конечный остаток по каждой комбинации измерений.

ВЫБРАТЬ

Данные.Номенклатура,

Данные.КоличествоНачальныйОстаток,

Данные.КоличествоПриход,

Данные.КоличествоРасход,

Данные.КоличествоКонечныйОстаток

ИЗ

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

Эта таблица тяжелее, чем «Остатки» или «Обороты» по отдельности: платформе приходится рассчитывать и сальдо на начало, и движения за период. Если в отчёте нужен только конечный остаток, не тяните «ОстаткиИОбороты» — запрос к «Остатки» выполнится быстрее.

Маршрут решения

Как выбрать виртуальную таблицу

Нужно сальдо на одну дату (контроль остатков при проведении)Используйте таблицу «Остатки» с параметром периода
Нужны суммы прихода и расхода за интервалИспользуйте таблицу «Обороты» с границами периода
Нужен отчёт с начальным и конечным сальдоИспользуйте таблицу «ОстаткиИОбороты»
Нужно разобрать, какие документы сделали движенияЧитайте физическую таблицу регистра с отбором по регистратору или измерениям

Программное получение данных: объект Запрос и набор записей

В коде модулей данные регистра получают двумя способами. Основной — объект Запрос: текст запроса, установка параметров, выполнение и обход результата через Выбрать() или выгрузку в таблицу значений через Выгрузить(). Запрос неизменно предпочтительнее, когда нужны итоги по нескольким измерениям.

Второй способ — набор записей: РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей(). Он подходит для чтения и изменения движений конкретного документа: установите отбор по регистратору, вызовите Прочитать() — и получите таблицу движений. Использовать набор записей для получения итогов по складу или номенклатуре нельзя — он не считает остатки.

Порядок получения остатков в коде
  1. 1
    Создайте объект Запрос и задайте текст с обращением к виртуальной таблице
  2. 2
    Установите параметры: период (лучше через Границу), значения отборов
  3. 3
    Выполните запрос и выгрузите результат в таблицу значений или обойдите выборку
  4. 4
    Проверьте результат на тестовых данных с известными остатками
  5. 5
    При нехватке производительности вынесите отборы в параметры виртуальной таблицы, а не в секцию ГДЕ

Получение данных без кода: консоль запросов и СКД

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

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

Также данные движений видны из интерфейса: в форме документа по кнопке «Ещё» доступны движения по регистрам, а полный список записей регистра открывается через «Все функции» → «Регистры накопления». Это удобно для разбора конкретного документа, но не для итогов.

Типичные ошибки и проверка результата

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

Отдельный класс ошибок — фильтрация в секции ГДЕ вместо параметров виртуальной таблицы и обращение к физической таблице с последующей группировкой вместо использования «Остатков». Оба приёма дают верный результат, но на больших базах приводят к полному сканированию таблицы движений и тайм-аутам.

Типичные ошибки
01
Передача даты без времени в «Остатки»: движения за этот день не попадают в результат — используйте Границу с видом «Включая»
02
Отбор в секции ГДЕ вместо параметра виртуальной таблицы: резкое падение скорости на больших регистрах
03
Попытка получить остатки из регистра вида «Обороты»: у него нет таблицы «Остатки», запрос упадёт с ошибкой
04
Контроль остатков на текущую дату при проведении задним числом: документ проводится, хотя на его момент товара не было
05
Чтение итогов набором записей: набор читает только движения регистратора, остатки он не считает
Контрольные точки

Как проверить результат

Сверка остатка по тестовому товару
Норма

Остаток из запроса совпадает с типовым отчётом по регистру на ту же дату и границу

Тревожный признак

Расхождение — проверьте момент времени и отборы

Скорость выполнения запроса
Норма

Запрос к виртуальной таблице с отборами в параметрах выполняется быстро

Тревожный признак

Запрос «висит» — вероятно, отборы вынесены в ГДЕ или читается физическая таблица

Полнота данных за период
Норма

Сумма прихода минус расход сходится с разностью конечного и начального остатка

Тревожный признак

Не сходится — проверьте границы периода и периодичность

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

Итог

Что важно запомнить

Итоги регистра накопления получают через виртуальные таблицы: «Остатки» — сальдо на момент, «Обороты» — движение за период, «ОстаткиИОбороты» — полная картина для отчётов. Момент времени задавайте через Границу, отборы — в параметрах таблицы, результат сверяйте с типовым отчётом.

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

Чем регистр накопления вида «Остатки» отличается от вида «Обороты»?

Регистр вида «Остатки» хранит приход и расход как разнонаправленные движения, и платформа умеет рассчитывать по нему сальдо — для него доступна виртуальная таблица «Остатки». Регистр вида «Обороты» просто суммирует значения ресурсов за период; понятия остатка у него нет, и обратиться к таблице «Остатки» для него нельзя — запрос завершится ошибкой.

Почему запрос к «Остаткам» не видит документ, проведённый сегодня?

Если в параметр периода передана дата без времени, остатки рассчитываются на начало дня — до всех движений этого дня. Передайте дату со временем 23:59:59 или объект Граница с видом «Включая», чтобы движения дня вошли в расчёт.

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

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

Что быстрее: запрос к виртуальной таблице или группировка физической таблицы движений?

Запрос к виртуальной таблице с отборами в параметрах практически всегда быстрее: платформа использует заранее рассчитанные итоги. Группировка физической таблицы заставляет читать все записи движений за период, что на крупных базах приводит к длительному выполнению и блокировкам.

Как получить обороты в разрезе документов?

В таблице «Обороты» укажите в параметре периодичности значение «Регистратор» — в результате появится поле с документом, и обороты будут сгруппированы по каждому регистратору. Альтернатива — запрос к физической таблице движений с отбором по периоду и группировкой по регистратору.

Нужны ли итоги регистра пересчитывать вручную, если запрос возвращает старые данные?

Если итоги актуальны, виртуальные таблицы возвращают корректные данные сразу после проведения документов. Подозрение на рассинхронизацию возникает редко — обычно после восстановления базы или сбоев. В таком случае администратор выполняет пересчёт итогов регистра штатными средствами (например, через режим управления итогами или тестирование и исправление), предварительно сделав резервную копию.