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