Перейти к основному содержимому

Регистры 1С — записи, срезы, остатки

Разработчику Архитектору
Загрузка эмулятора 1С…

Регистр в жизненном цикле документа

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

Записи в регистр обычно попадают при проведении документа — в модуле объекта документа формируют движения. Платформа записывает движения в транзакции вместе с документом.

Тип регистраВопрос, на который отвечает
Сведений (независимый)Какое значение реквизита сейчас?
Сведений (периодический)Какое значение было на дату?
Накопления (остатки)Сколько осталось на складе?
Накопления (обороты)Сколько пришло/ушло за период?

Обзор метаданных — в 112.md; проведение — в 117.md.


Запись в регистр программно

Набор записей

&НаСервере
Процедура ЗаписатьЦену(Номенклатура, Цена, ДатаЗаписи)
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.Установить(Номенклатура);
Набор.Прочитать();

Запись = Набор.Добавить();
Запись.Период = ДатаЗаписи;
Запись.Номенклатура = Номенклатура;
Запись.Цена = Цена;

Набор.Записать();
КонецПроцедуры

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

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

При проведении в процедуре ОбработкаПроведения заполняют Движения.ИмяРегистра:

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

Отмена проведения удаляет связанные движения автоматически.


Чтение регистра сведений

Менеджер записи и СрезПоследних

Для периодического регистра «цена на дату»:

&НаСервере
Функция ЦенаНаДату(Номенклатура, Дата)
Возврат РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(
Дата, Новый Структура("Номенклатура", Номенклатура)).Цена;
КонецФункции

В запросе используют виртуальную таблицу СрезПоследних / СрезПервых:

"ВЫБРАТЬ
| Цены.Номенклатура,
| Цены.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены"

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


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

Остатки

"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(, Номенклатура = &Номенклатура) КАК Остатки"

Виртуальная таблица Остатки возвращает текущий (или на конец периода) остаток по измерениям.

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

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

Параметры дат и отборов подставляют через &Нач, &Кон и условия в скобках после имени таблицы.


Выборка по регистратору

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

Набор = РегистрыНакопления.ОстаткиТоваров.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.Прочитать();

Или запрос с условием ГДЕ Регистратор = &Документ.


Практические правила

  • Движения документа формируйте только в проведении, а не при каждой записи черновика.
  • Для отчётов по большим объёмам используйте виртуальные таблицы, а не обход документов в цикле.
  • Индексируйте измерения регистра, по которым часто фильтруют в ГДЕ.
  • Срезы сведений и остатки накопления — разные виртуальные таблицы; не путайте синтаксис.

Конструктор запроса
В конфигураторе откройте «Конструктор запроса» → выберите регистр → платформа подставит корректное имя виртуальной таблицы и параметры.


Связанные материалы


Практика 15 минут

  1. Найдите в учебной конфигурации регистр накопления.
  2. Составьте запрос к Остатки с одним измерением в отборе.
  3. Добавьте период и перейдите на ОстаткиИОбороты — сравните поля результата.

Лаборатория — остатки после проведения (50 минут)

Связка с мини-складом.

  1. Проведите два документа ПоступлениеТоваров с разной номенклатурой на одном складе.
  2. Выполните запрос остатков:
ВЫБРАТЬ
Остатки.Номенклатура.Наименование КАК Товар,
Остатки.КоличествоОстаток КАК Остаток
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК Остатки
ГДЕ
Остатки.КоличествоОстаток > 0
  1. Создайте документ расхода (расширение практикума в 1121.md) с видом движения Расход.
  2. Повторите запрос — остаток уменьшился.
  3. Отмените проведение расхода — остаток вернулся.

Контроль: сумма остатков по запросу совпадает с ручным подсчётом поступлений минус расходы.

Срез цен (если создан регистр сведений)

ВЫБРАТЬ
Цены.Номенклатура,
Цены.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены

Сравните с РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(&Дата, Отбор) в коде — результат должен совпасть.


Проверка себя

  • Чем движение документа отличается от записи в независимый регистр сведений?
  • Когда нужен СрезПоследних, а когда достаточно СрезПервых?
  • Почему остатки через обход проведённых документов — плохая идея на большой базе?

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").