Регистры сведений и накопления
Регистры — это «память итогов»: справочники и документы дают исходные данные, а регистры хранят посчитанное по ним состояние.
Регистр — прикладной объект 1С для хранения не отдельных сущностей или событий, а данных, привязанных к измерениям и времени: остатков, оборотов, цен, курсов. Регистры — фундамент учёта и всех отчётов.
Мы уже знаем: справочник хранит списки, документ фиксирует события. Но откуда система мгновенно знает, что на складе сейчас 17 ноутбуков, а курс доллара на прошлый вторник был 92 рубля? Перебирать все документы с начала времён при каждом вопросе — слишком медленно. Ответ хранят регистры: специальные таблицы, заточенные под быстрые срезы и итоги. Это самая мощная и самая «взрослая» часть платформы 1С.
Зачем это нужно на практике
Любой содержательный отчёт в 1С читает данные из регистров, а не из документов напрямую. «Остатки товаров на складе», «Обороты по кассе за месяц», «Ведомость по зарплате», «Курсы валют на дату» — всё это запросы к регистрам. Документы лишь наполняют регистры своими движениями, а регистры отдают быстрые ответы. Понимание регистров отделяет новичка, который «делает формочки», от разработчика, который строит учёт.
Регистр сведений
Регистр сведений хранит значения, привязанные к набору измерений (и, при необходимости, ко времени). Классика — цены и курсы. «Курс доллара на 1 марта — 92, на 2 марта — 91.5». Здесь измерение «Валюта», ресурс «Курс», а сведения периодические (зависят от даты).
Ключевые термины регистра: измерения — по чему различаем записи (Валюта, Товар), ресурсы — что храним (Курс, Цена), реквизиты — вспомогательная информация. Для периодического регистра сведений главный метод — СрезПоследних: он отдаёт актуальные значения на указанную дату. Это виртуальная таблица — платформа вычисляет её на лету:
// Получить курсы всех валют на конкретную дату
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Курсы.Валюта,
| Курсы.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&ДатаОтчёта, ) КАК Курсы";
Запрос.УстановитьПараметр("ДатаОтчёта", '20260301');
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Валюта.Наименование + ": " + Выборка.Курс);
КонецЦикла;
Результат:
Доллар США: 92
Евро: 99,5
Прочитать одну запись можно и без запроса — методом Получить() у менеджера регистра, передав отбор структурой:
Отбор = Новый Структура("Валюта", Справочники.Валюты.НайтиПоКоду("840"));
ЗаписьКурса = РегистрыСведений.КурсыВалют.ПолучитьПоследнее('20260301', Отбор);
Сообщить("Курс доллара: " + ЗаписьКурса.Курс);
Регистр накопления
Регистр накопления хранит то, что накапливается: остатки и обороты. Товары на складах, деньги в кассе, взаиморасчёты с контрагентами. Он умеет складывать приходы и вычитать расходы, отдавая итог. Именно сюда «пишут» документы при проведении.
Есть два вида: регистр остатков (сколько есть сейчас — товары на складе) и регистр оборотов (сколько прошло за период — продажи за месяц). У регистра остатков движения бывают двух видов: Приход (увеличивает) и Расход (уменьшает). Его главные виртуальные таблицы — Остатки, Обороты и ОстаткиИОбороты:
// Остатки товаров на складе на текущий момент
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.Склад,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки() КАК Остатки
|ГДЕ
| Остатки.КоличествоОстаток > 0";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Номенклатура.Наименование
+ " на складе " + Выборка.Склад.Наименование
+ ": " + Выборка.КоличествоОстаток + " шт.");
КонецЦикла;
Обратите внимание: у ресурса Количество в виртуальной таблице остатков появляется поле КоличествоОстаток — платформа сама считает разницу прихода и расхода.
Движения документа
Как данные попадают в регистр накопления? Через движения документа — записи, которые документ формирует при проведении. Мы уже видели это в уроке о проведении: в обработчике ОбработкаПроведения строки заполняют коллекцию Движения.
Движение — запись в регистре, порождённая документом. Комплект всех движений одного документа привязан к нему как к регистратору; при распроведении платформа удаляет их автоматически.
// Внутри ОбработкаПроведения документа "Поступление товаров"
Для Каждого СтрокаТовара Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход; // поступление увеличивает остаток
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТовара.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = СтрокаТовара.Количество;
КонецЦикла;
Продажа сделает то же самое, но с ВидДвиженияНакопления.Расход. Сумма всех приходов минус все расходы по товару и складу — и есть текущий остаток, который отдаёт виртуальная таблица Остатки().
Чем регистры отличаются от справочников и документов
| Объект | Что хранит | Пример |
| Справочник | Списки сущностей | Товары, контрагенты |
| Документ | Факты операций во времени | Продажа, поступление |
| Регистр сведений | Значения по измерениям (часто на дату) | Цены, курсы валют |
| Регистр накопления | Накопленные итоги: остатки и обороты | Остатки на складе, обороты кассы |
Главное отличие: справочник и документ пользователь видит и редактирует напрямую, а регистр — служебное хранилище итогов. Пользователь почти никогда не правит регистр руками: его наполняют документы, а отдаёт он данные отчётам.
Как это работает
Виртуальные таблицы (Остатки, Обороты, СрезПоследних) физически в базе не хранятся — платформа генерирует под них SQL-запрос в момент обращения, подставляя ваши параметры (дату, отбор). Чтобы такие запросы были быстрыми даже на миллионах движений, 1С поддерживает итоги: заранее посчитанные суммы на границах периодов. Поэтому вопрос «остаток на сегодня» отвечается почти мгновенно — платформа берёт ближайший рассчитанный итог и досчитывает лишь хвост движений.
Движения хранятся с полем «регистратор» — ссылкой на документ-источник. Это и позволяет платформе при перепроведении или распроведении убрать ровно записи нужного документа, не трогая чужие. Вся система остатков держится на этой связке «документ → его движения → регистр».
Частые ошибки
- Считать остатки перебором документов вручную. Новички пишут циклы по всем «Реализациям» и «Поступлениям». Это медленно и ненадёжно — для остатков есть регистр накопления и его виртуальная таблица
Остатки(). - Путать имя ресурса и имя поля виртуальной таблицы. Ресурс называется
Количество, но в таблице остатков поле —КоличествоОстаток, в оборотах —КоличествоОборот. Обращение кКоличествов таблице остатков даст ошибку. - Забыть указать дату для периодического регистра сведений.
СрезПоследнихбез даты вернёт последние записи вообще, а не на нужный момент — и курс окажется не тот. - Делать регистром сведений то, что накапливается. Остатки и обороты — задача регистра накопления; регистр сведений не умеет складывать приход и расход, он хранит значение «как есть».
Итоги
- Регистры хранят итоги учёта: справочники и документы дают исходные данные, регистры отдают быстрые срезы и суммы.
- Регистр сведений — значения по измерениям (цены, курсы); периодический читается на дату через
СрезПоследних. - Регистр накопления — остатки и обороты; движения
Приход/Расход, итоги через таблицыОстатки(),Обороты(). - Данные в регистр накопления пишут документы при проведении — через коллекцию
Движенияв обработчике проведения. - Отчёты берут данные из регистров, а не перебирают документы; связка «документ → его движения → регистр» — основа учёта в 1С.