Регистры сведений и накопления

Регистры — это «память итогов»: справочники и документы дают исходные данные, а регистры хранят посчитанное по ним состояние.

Регистр — прикладной объект 1С для хранения не отдельных сущностей или событий, а данных, привязанных к измерениям и времени: остатков, оборотов, цен, курсов. Регистры — фундамент учёта и всех отчётов.

Мы уже знаем: справочник хранит списки, документ фиксирует события. Но откуда система мгновенно знает, что на складе сейчас 17 ноутбуков, а курс доллара на прошлый вторник был 92 рубля? Перебирать все документы с начала времён при каждом вопросе — слишком медленно. Ответ хранят регистры: специальные таблицы, заточенные под быстрые срезы и итоги. Это самая мощная и самая «взрослая» часть платформы 1С.

Зачем это нужно на практике

Любой содержательный отчёт в 1С читает данные из регистров, а не из документов напрямую. «Остатки товаров на складе», «Обороты по кассе за месяц», «Ведомость по зарплате», «Курсы валют на дату» — всё это запросы к регистрам. Документы лишь наполняют регистры своими движениями, а регистры отдают быстрые ответы. Понимание регистров отделяет новичка, который «делает формочки», от разработчика, который строит учёт.

Регистр сведений

Регистр сведений хранит значения, привязанные к набору измерений (и, при необходимости, ко времени). Классика — цены и курсы. «Курс доллара на 1 марта — 92, на 2 марта — 91.5». Здесь измерение «Валюта», ресурс «Курс», а сведения периодические (зависят от даты).

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

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Валюта.Наименование + ": " + Выборка.Курс);
КонецЦикла;

Результат:

Доллар США: 92
Евро: 99,5

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

Отбор = Новый Структура("Валюта", Справочники.Валюты.НайтиПоКоду("840"));
ЗаписьКурса = РегистрыСведений.КурсыВалют.ПолучитьПоследнее('20260301', Отбор);
Сообщить("Курс доллара: " + ЗаписьКурса.Курс);

Регистр накопления

Регистр накопления хранит то, что накапливается: остатки и обороты. Товары на складах, деньги в кассе, взаиморасчёты с контрагентами. Он умеет складывать приходы и вычитать расходы, отдавая итог. Именно сюда «пишут» документы при проведении.

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

// Остатки товаров на складе на текущий момент
Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Остатки.Номенклатура,
    |   Остатки.Склад,
    |   Остатки.КоличествоОстаток
    |ИЗ
    |   РегистрНакопления.ТоварыНаСкладах.Остатки() КАК Остатки
    |ГДЕ
    |   Остатки.КоличествоОстаток > 0";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Номенклатура.Наименование
        + " на складе " + Выборка.Склад.Наименование
        + ": " + Выборка.КоличествоОстаток + " шт.");
КонецЦикла;

Обратите внимание: у ресурса Количество в виртуальной таблице остатков появляется поле КоличествоОстаток — платформа сама считает разницу прихода и расхода.

Движения документа

Как данные попадают в регистр накопления? Через движения документа — записи, которые документ формирует при проведении. Мы уже видели это в уроке о проведении: в обработчике ОбработкаПроведения строки заполняют коллекцию Движения.

Движение — запись в регистре, порождённая документом. Комплект всех движений одного документа привязан к нему как к регистратору; при распроведении платформа удаляет их автоматически.

// Внутри ОбработкаПроведения документа "Поступление товаров"
Для Каждого СтрокаТовара Из Товары Цикл

    Движение = Движения.ТоварыНаСкладах.Добавить();
    Движение.ВидДвижения  = ВидДвиженияНакопления.Приход;   // поступление увеличивает остаток
    Движение.Период       = Дата;
    Движение.Номенклатура = СтрокаТовара.Номенклатура;
    Движение.Склад        = Склад;
    Движение.Количество   = СтрокаТовара.Количество;

КонецЦикла;

Продажа сделает то же самое, но с ВидДвиженияНакопления.Расход. Сумма всех приходов минус все расходы по товару и складу — и есть текущий остаток, который отдаёт виртуальная таблица Остатки().

Чем регистры отличаются от справочников и документов

ОбъектЧто хранитПример
СправочникСписки сущностейТовары, контрагенты
ДокументФакты операций во времениПродажа, поступление
Регистр сведенийЗначения по измерениям (часто на дату)Цены, курсы валют
Регистр накопленияНакопленные итоги: остатки и оборотыОстатки на складе, обороты кассы

Главное отличие: справочник и документ пользователь видит и редактирует напрямую, а регистр — служебное хранилище итогов. Пользователь почти никогда не правит регистр руками: его наполняют документы, а отдаёт он данные отчётам.

Как это работает

Виртуальные таблицы (Остатки, Обороты, СрезПоследних) физически в базе не хранятся — платформа генерирует под них SQL-запрос в момент обращения, подставляя ваши параметры (дату, отбор). Чтобы такие запросы были быстрыми даже на миллионах движений, 1С поддерживает итоги: заранее посчитанные суммы на границах периодов. Поэтому вопрос «остаток на сегодня» отвечается почти мгновенно — платформа берёт ближайший рассчитанный итог и досчитывает лишь хвост движений.

Движения хранятся с полем «регистратор» — ссылкой на документ-источник. Это и позволяет платформе при перепроведении или распроведении убрать ровно записи нужного документа, не трогая чужие. Вся система остатков держится на этой связке «документ → его движения → регистр».

Частые ошибки

  • Считать остатки перебором документов вручную. Новички пишут циклы по всем «Реализациям» и «Поступлениям». Это медленно и ненадёжно — для остатков есть регистр накопления и его виртуальная таблица Остатки().
  • Путать имя ресурса и имя поля виртуальной таблицы. Ресурс называется Количество, но в таблице остатков поле — КоличествоОстаток, в оборотах — КоличествоОборот. Обращение к Количество в таблице остатков даст ошибку.
  • Забыть указать дату для периодического регистра сведений. СрезПоследних без даты вернёт последние записи вообще, а не на нужный момент — и курс окажется не тот.
  • Делать регистром сведений то, что накапливается. Остатки и обороты — задача регистра накопления; регистр сведений не умеет складывать приход и расход, он хранит значение «как есть».

Итоги

  • Регистры хранят итоги учёта: справочники и документы дают исходные данные, регистры отдают быстрые срезы и суммы.
  • Регистр сведений — значения по измерениям (цены, курсы); периодический читается на дату через СрезПоследних.
  • Регистр накопления — остатки и обороты; движения Приход/Расход, итоги через таблицы Остатки(), Обороты().
  • Данные в регистр накопления пишут документы при проведении — через коллекцию Движения в обработчике проведения.
  • Отчёты берут данные из регистров, а не перебирают документы; связка «документ → его движения → регистр» — основа учёта в 1С.
Проверьте себя
1. Нужно быстро узнать, сколько товара сейчас лежит на складе. Откуда правильнее всего взять эту цифру?
AПеребрать в цикле все документы поступлений и реализаций и вручную сложить
BИз виртуальной таблицы Остатки() регистра накопления
CИз реквизита «Количество» справочника Номенклатура
DИз константы ОстатокНаСкладе
2. Чем регистр сведений принципиально отличается от регистра накопления?
AРегистр сведений хранит значения по измерениям (цены, курсы), а регистр накопления складывает приход/расход, давая остатки и обороты
BРегистр сведений быстрее, а регистр накопления медленнее
CРегистр сведений заполняется пользователем, а регистр накопления — программистом в конфигураторе
DНикакой разницы, это синонимы одного объекта