Первый шаг в 1С — абсолютно бесплатно.

📋Регистр сведений в 1С 8.3

Определение

Регистр сведений — это объект метаданных, предназначенный для хранения произвольной информации в разрезе нескольких измерений . На основе этого объекта платформа создаёт в базе данных таблицу, где может храниться любая информация, «привязанная» к набору измерений .

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

Второе важное отличие: регистр сведений может хранить не только актуальные значения, но и историю их изменения во времени. Такой регистр называется периодическим .

Когда использовать регистр сведений вместо справочника: если значение реквизита может меняться со временем, и нужно отслеживать историю изменений (например, цены товаров, курсы валют, ставки налогов), справочник не подойдёт — он хранит только последнее значение . В таких случаях используется периодический регистр сведений.

Состав регистра сведений

Структура регистра сведений описывается тремя видами полей :

Измерения — это «координаты» или разрезы, в которых хранится информация. Например, в регистре цен измерениями могут быть номенклатура и тип цен. Измерения формируют ключ записи и определяют уникальность .

Ресурсы — это основная хранимая информация. В примере с ценами ресурсом будет сама цена товара .

Реквизиты — это вспомогательная информация, относящаяся к записи. Например, фамилия менеджера, установившего цену, или комментарий . Вместе с измерениями и ресурсами можно хранить дополнительную произвольную информацию — для этого и служат реквизиты .

Свойства регистра сведений в конфигураторе

При создании регистра сведений в дереве конфигурации заполняются следующие свойства:

Имя — идентификатор для обращения из кода. Например: Цены, КурсыВалют.

Периодичность — определяет, будет ли регистр хранить историю изменений во времени. Возможные значения: «В пределах секунды», «В пределах дня», «В пределах месяца», «В пределах квартала», «В пределах года», «В пределах регистратора» . Если периодичность не задана, регистр хранит только актуальные значения.

Режим записи — определяет способ внесения изменений. Значение «Независимый» означает, что данные вводятся вручную или программно, без привязки к документам. Значение «Подчинение регистратору» означает, что каждая запись связана с документом-регистратором .

Представление записи и Представление списка — названия для отображения пользователю. Например: «Цена» и «Цены на номенклатуру» .

Основные формы — формы списка и записи. Система может генерировать их автоматически, либо разработчик создаёт собственные .

Периодичность: как это работает

Периодический регистр сведений всегда содержит служебное поле Период типа Дата, добавляемое системой автоматически . Это поле указывает, к какому моменту времени относится запись.

При записи данных платформа приводит значение периода к началу того интервала, в который он попадает. Например, если периодичность «В пределах месяца», а в записи указана дата 08.04.2024, регистр сохранит значение периода 01.04.2024 .

Это позволяет устанавливать цены «задним числом» или «на будущее» — система сама определит, какая цена действовала на конкретную дату.

Уникальность записей

Система контролирует уникальность записей в регистре сведений. Ключ записи формируется из значений всех измерений и периода (для периодических регистров) .

В регистре не может быть двух записей с одинаковым ключом. Это означает, например, что в периодическом регистре цен не может существовать двух записей о цене одной и той же номенклатуры на одну и ту же дату .

Программная работа с регистром сведений

Чтение одной записи (МенеджерЗаписи)

Для независимых регистров (не подчинённых регистратору) можно читать отдельные записи через менеджер записи :

// Чтение записи по ключу

Запись = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();

Запись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор");

Запись.Период = ТекущаяДата();

Запись.Прочитать();

Сообщить("Цена: " + Запись.Цена);

 

Получение последнего значения (метод ПолучитьПоследнее)

Наиболее частый сценарий — получить актуальное значение ресурса на определённую дату :

// Чтение записи по ключу

// Получить последнюю цену на текущую дату

Отбор = Новый Структура("Номенклатура", СсылкаНаНоменклатуру);

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

Цена = ЗначенияРесурсов.Цена;

 

Получение первого значения (самого раннего) (метод ПолучитьПервое())

ЦенаНаНачало = РегистрыСведений.Цены.ПолучитьПервое(НачалоГода(ТекущаяДата()), Отбор).Цена;

Работа с набором записей

Набор записей позволяет обрабатывать множество записей в рамках одной транзакции :

// Создание набора

Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей();

// Установка отбора (если не установить — перезапишется весь регистр!)

Набор.Отбор.Номенклатура.Установить(СсылкаНаНоменклатуру, Истина);

Набор.Отбор.Период.Установить(ТекущаяДата(), Истина);

// Добавление записи в набор

НоваяЗапись = Набор.Добавить();

НоваяЗапись.Период = ТекущаяДата();

НоваяЗапись.Номенклатура = СсылкаНаНоменклатуру;

НоваяЗапись.Цена = 15000;

// Запись набора в базу

Набор.Записать(Истина); // Истина — заменить существующие записи по отбору

 

Важно: если отбор в наборе не установлен, метод Записать() перезапишет весь регистр. Для периодических регистров обязательно устанавливать отбор по периоду .

 

Чтение набора записей

Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей();

Набор.Отбор.Номенклатура.Установить(СсылкаНаНоменклатуру, Истина);

Набор.Прочитать();

Для Каждого Запись Из Набор Цикл

Сообщить("Дата: " + Запись.Период + ", Цена: " + Запись.Цена);

КонецЦикла;

Выгрузка и загрузка набора

Набор можно выгрузить в таблицу значений и загрузить обратно :

// Выгрузка

ТаблицаЗначений = Набор.Выгрузить();

// Загрузка

Набор.Загрузить(ТаблицаЗначений);

Работа с регистром сведений на форме

Автоматическая форма списка

Система может автоматически сгенерировать форму списка регистра сведений. Пользователь сможет просматривать записи, добавлять новые, удалять, сортировать и отбирать данные .

Форма записи

Для просмотра и редактирования отдельной записи используется форма записи. Система генерирует её автоматически или разработчик создаёт собственную .

Вывод регистра на форму справочника

Часто возникает задача показать данные регистра прямо в карточке элемента справочника (например, цены на форму номенклатуры). Реализуется через реквизит формы типа «Набор записей» :

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Получаем набор записей из реквизита формы

РСЦены = РеквизитФормыВЗначение("Цены");

// Устанавливаем отбор по текущему элементу

РСЦены.Отбор.Номенклатура.Установить(Объект.Ссылка, Истина);

// Читаем данные

РСЦены.Прочитать();

// Возвращаем в реквизит формы

ЗначениеВРеквизитФормы(РСЦены, "Цены");

КонецПроцедуры

Однако: такой подход делает форму справочника «тяжёлой» — при каждом открытии выполняется серверный вызов и чтение регистра . В типовых конфигурациях рекомендуется вместо этого выводить гиперссылку, открывающую отдельную форму списка регистра с отбором .

Клиент vs Сервер: особенности работы

Регистры сведений доступны как на сервере, так и на клиенте, но запись и чтение данных выполняются на сервере. На клиенте можно только вызывать серверные процедуры.

Чтение на сервере:

&НаСервере

Функция ПолучитьЦену(Номенклатура, ДатаЦены)

Отбор = Новый Структура("Номенклатура", Номенклатура);

Возврат РегистрыСведений.Цены.ПолучитьПоследнее(ДатаЦены, Отбор).Цена;

КонецФункции

 

Вызов с клиента:

&НаКлиенте

Процедура ЗаполнитьЦену()

Цена = ПолучитьЦену(Номенклатура, ДатаДокумента);

КонецПроцедуры

Для регистров, подчинённых регистратору, чтение текущих значений также выполняется через менеджер регистра. Однако менеджер записи (СоздатьМенеджерЗаписи()) доступен только для независимых регистров .

Итоговая сводка

Регистр сведений — объект для хранения произвольных данных в разрезе измерений с возможностью отслеживания истории изменений во времени.

Состав: измерения (разрезы), ресурсы (хранимые значения), реквизиты (дополнительная информация).

Периодичность — определяет, хранит ли регистр историю. Если задана, автоматически добавляется поле «Период».

Режим записи — «Независимый» (ручной ввод) или «Подчинение регистратору» (записи создаются документами).

Ключ записи — совокупность измерений и периода. Регистр не может содержать две записи с одинаковым ключом.

 

Основные методы:

ПолучитьПоследнее(Дата, Отбор) — получить актуальное значение ресурса.

ПолучитьПервое(Дата, Отбор) — получить самое раннее значение.

СоздатьМенеджерЗаписи() — работа с одной записью (для независимых регистров).

СоздатьНаборЗаписей() — работа с множеством записей.

Набор.Прочитать() / Набор.Записать() — чтение и запись набора. Важное правило: при записи набора обязательно устанавливать отбор, иначе перезапишется весь регистр.

📋 Регистр накопления в 1С 8.3

Определение

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

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

Регистр накопления не предназначен для интерактивного редактирования пользователем. Его модификация производится на основе алгоритмов работы других объектов базы данных — как правило, при проведении документов . Это ключевая особенность: пользователь не редактирует регистр напрямую, а проводит документы, которые формируют движения.

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

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

Структура регистра накопления описывается несколькими видами полей .

Измерения — это разрезы, в которых хранится информация. Набор измерений характеризует уникальность записей и определяет, в каком разрезе накапливаются данные. Например, в регистре остатков товаров измерениями могут быть «Номенклатура» и «Склад» .

Ресурсы — это то, что накапливается. Ресурс для регистра накопления может быть только числового типа. Например, «Количество» и «Стоимость» .

Реквизиты — это вспомогательная информация, которая не влияет на формирование остатков и оборотов, но может использоваться для анализа движений. Например, комментарий или ссылка на сотрудника, создавшего запись .

Кроме того, у каждой записи регистра накопления есть стандартные реквизиты, которые присутствуют автоматически: Период (дата записи), Регистратор (документ, создавший движение), Номер строки (уникален в пределах регистратора), Активность (влияет на попадание записи в виртуальные таблицы) и Вид движения (Приход или Расход) .

Свойства регистра накопления в конфигураторе

При создании регистра накопления в дереве конфигурации заполняются следующие свойства:

Имя — идентификатор для обращения из кода. Например: ОстаткиМатериалов, Продажи.

Вид регистра — определяет, будет ли регистр хранить остатки или только обороты. Возможные значения: «Остатки» и «Обороты» .

Расширенное представление списка — заголовок, отображаемый в окне списка записей регистра. Например: «Движения по регистру Остатки материалов» .

Регистраторы — список документов, которые могут создавать движения в этом регистре. Задаётся на вкладке «Регистраторы» или через настройку движений документа .

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

Существует два вида регистров накопления .

Регистр накопления остатков позволяет хранить как итоговые значения ресурсов — остатки, так и изменения этих ресурсов — обороты. Типичный пример: регистр «ОстаткиМатериалов», который хранит остатки материалов на складах .

Регистр накопления оборотов хранит только изменения ресурсов — обороты. Значения остатков для него не имеют смысла. Типичный пример: регистр «Выручка», который накапливает информацию об объёмах продаж за период. Поскольку регистр оборотов не накапливает остатки, для него не имеет значения направление движения — приход или расход. Накапливается только величина изменения ресурса .

Выбор вида регистра определяется задачей. Если нужно отвечать на вопрос «сколько осталось?» — используется регистр остатков. Если нужно отвечать на вопрос «сколько было за период?» — достаточно регистра оборотов .

Связь с регистратором

Изменение состояния регистра накопления происходит, как правило, при проведении документа. Поэтому каждая запись регистра связана с определённым документом — регистратором .

В общем случае значение поля «Период» может не совпадать с датой документа. Например, документ «План продаж» может внести в регистр записи о предполагаемых продажах несколькими разными датами .

Система обеспечивает контроль уникальности записей: в регистре накопления не может находиться двух записей, относящихся к одной и той же строке одного и того же документа .

Программная работа с регистром накопления

Виртуальные таблицы: Остатки и Обороты

Основной способ получения данных из регистра накопления — обращение к виртуальным таблицам, которые система рассчитывает автоматически на основе движений .

Получение остатков (для регистра вида «Остатки»):

// Получить остатки материалов на складах на текущую дату

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.Материал,

| Остатки.Склад,

| Остатки.КоличествоОстаток

|ИЗ

| РегистрНакопления.ОстаткиМатериалов.Остатки КАК Остатки";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Материал + " на " + Выборка.Склад +

": " + Выборка.КоличествоОстаток);

КонецЦикла;

 

Получение оборотов (для любого вида регистра):

// Получить обороты продаж за январь 2024

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Обороты.Номенклатура,

| Обороты.Клиент,

| Обороты.КоличествоОборот,

| Обороты.ВыручкаОборот

|ИЗ

| РегистрНакопления.Продажи.Обороты(

| НачалоМесяца(Дата(2024,1,1)),

| КонецМесяца(Дата(2024,1,1))) КАК Обороты";

Результат = Запрос.Выполнить();

 

Виртуальные таблицы позволяют получить остатки или обороты на любой момент времени, с отборами по измерениям и в различных разрезах .

Формирование движений документа вручную

Если конструктор движений не используется, движения можно создать программно в процедуре ОбработкаПроведения :

Процедура ОбработкаПроведения(Отказ, Режим)

// Разрешаем запись движений

Движения.ОстаткиМатериалов.Записывать = Истина;

// Обходим табличную часть документа

Для Каждого ТекСтрока Из Материалы Цикл

// Добавляем новую запись в набор движений

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Материал = ТекСтрока.Материал;

Движение.Склад = Склад;

Движение.Количество = ТекСтрока.Количество;

КонецЦикла;

КонецПроцедуры

 

Для расхода вид движения устанавливается как ВидДвиженияНакопления.Расход .

Использование конструктора движений

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

Пример кода, который генерирует конструктор :

Процедура ОбработкаПроведения(Отказ, Режим)

Движения.ОстаткиМатериалов.Записывать = Истина;

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Склад = Склад;

Движение.Количество = ТекСтрокаМатериалы.Количество;

КонецЦикла;

КонецПроцедуры

Прямое создание набора записей

Иногда движения нужно создать не из документа, а программно — например, при начальном заполнении или корректировке :

// Создаём набор записей регистра

Набор = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();

// Добавляем запись

Запись = Набор.Добавить();

Запись.Период = ТекущаяДата();

Запись.Материал = СсылкаНаНоменклатуру;

Запись.Склад = СсылкаНаСклад;

Запись.Количество = 100;

// Записываем набор

Набор.Записать();

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

Форма списка регистра

Система может автоматически сгенерировать форму списка регистра накопления. Она позволяет пользователю просматривать записи, выполнять сортировку и отбор . В форме списка нельзя редактировать записи регистра, но можно анализировать движения .

Форма набора записей

Форма набора записей позволяет редактировать записи регистра: добавлять, удалять и изменять их. Это может использоваться администратором для корректировки движений .

Вывод остатков на форму

Часто возникает задача показать остатки прямо на форме — например, остаток денег в кассе на форме журнала документов . Реализуется через реквизит формы и виртуальную таблицу:

&НаСервере

Функция ПолучитьОстаток()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.КоличествоОстаток

|ИЗ

| РегистрНакопления.Касса.Остатки КАК Остатки";

Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда

Возврат 0;

КонецЕсли;

Выборка = Результат.Выбрать();

Выборка.Следующий();

Возврат Выборка.КоличествоОстаток;

КонецФункции

 

Обращение к базе данных для получения остатков всегда выполняется на сервере, поэтому функция должна иметь директиву &НаСервере .

Клиент vs Сервер: особенности работы

Регистры накопления доступны как на сервере, так и на клиенте, но чтение данных и запись движений выполняются на сервере. На клиенте можно только вызывать серверные процедуры и функции.

Чтение остатков на сервере:

&НаСервере

Функция ПолучитьОстатокМатериала(Материал, Склад)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.КоличествоОстаток

|ИЗ

| РегистрНакопления.ОстаткиМатериалов.Остатки(

| , Материал = &Материал

| И Склад = &Склад) КАК Остатки";

Запрос.УстановитьПараметр("Материал", Материал);

Запрос.УстановитьПараметр("Склад", Склад);

Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда

Возврат 0;

КонецЕсли;

Выборка = Результат.Выбрать();

Выборка.Следующий();

Возврат Выборка.КоличествоОстаток;

КонецФункции

 

Вызов с клиента:

&НаКлиенте

Процедура ПоказатьОстаток()

Остаток = ПолучитьОстатокМатериала(ТекущийМатериал, ТекущийСклад);

Сообщить("Остаток: " + Остаток);

КонецПроцедуры

Рекомендации по выбору измерений

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

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

Нарушение этого принципа ведёт к непроизводительному использованию ресурсов системы и замедлению работы .

Итоговая сводка

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

Состав: измерения (разрезы), ресурсы (накапливаемые числовые данные), реквизиты (вспомогательная информация). Стандартные реквизиты: Период, Регистратор, Номер строки, Активность, Вид движения.

Виды регистров: «Остатки» (хранит остатки и обороты) и «Обороты» (хранит только обороты).

Регистратор — документ, создающий движения. Каждая запись связана с регистратором.

 

Основные способы работы:

Виртуальные таблицы Остатки и Обороты — для получения итоговых данных через запрос.

Конструктор движений — для автоматической генерации кода проведения документа.

Процедура ОбработкаПроведения — для ручного формирования движений. СоздатьНаборЗаписей() — для программной записи движений вне документа.

Важное правило выбора измерений: для регистра остатков измерения должны быть такими, чтобы движения по ним происходили в обе стороны — и приход, и расход.