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