Регистр сведений

Материал из 1C-WIKI.RU (1С википедия)
Перейти к: навигация, поиск

Общие сведения

Регистр сведений – объект конфигурации 1С:Предприятие 8 предназначенный для описания структуры хранения данных в разрезе нескольких измерений.

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

Информация в регистре сведений хранится в виде набора строк (записей). Каждая строка содержит набор измерений и соответствующие им значения ресурсов. Комбинация измерений однозначно идентифицирует запись.

Периодичность

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

  • Непериодический
  • По позиции регистратора
  • В пределах секунды
  • В пределах дня
  • В пределах месяца
  • В пределах квартала
  • В пределах года

Если регистр не периодический, то поле "Период" для него не создается.

Примеры использования

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

На рисунке ниже приведен пример регистра сведений "Курсы валют" из типовой конфигурации 1С "Комплексная автоматизация". ПримерРегистраСведенийКурсыВалют.png

Периодичность данного регистр сведений установлена в значение "В пределах дня", меньше не нужно, т.к. курсы валют не изменяются в течении дня. Желтым фоном выделена одна запись регистра сведений, зеленым комбинация измерений, однозначно идентифицирующая запись, т.е. для указанного набора измерений (Период: 07.11.2011 и Валюта: EUR) регистр сведений может содержать только один набор значений ресурсов. Это позволяет избежать занесения в регистр информации о разных курсах одной валюты в один день.

Режим записи

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

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

Регистры, записываемые независимо, могут свободно редактироваться вручную или средствами встроенного языка. При этом если измерение такого регистра назначено как "ведущее" и значением измерения является ссылка на объект базы данных, то будет считаться, что запись регистра имеет смысл, только пока существует этот объект. Например, если назначить ведущим измерение "Конкурент", то считается, что запись имеет смысл только как информация по данному конкуренту. Соответственно, при удалении конкурента записи по нему будут удалены автоматически.

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

Основные объектные отличия регистра сведений от регистра накопления

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

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

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

Функциональные возможности регистра сведений

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

  • создание, изменение и удаление записей;
  • выбор записей в заданном интервале по заданным критериям;
  • выбор записей по регистратору;
  • получение значений ресурсов записей, соответствующих указанному периоду и значениям измерений;
  • получение значений ресурсов наиболее ранних и наиболее поздних записей регистра, соответствующих указанному периоду и значениям измерений.

Для получения наиболее поздних/ранних записей регистра сведений используется функция СрезПоследних/СрезПервых объекта РегистрСведенийМенеджер.<Имя регистра сведений>, либо виртуальная таблица СрезПоследних/СрезПервых регистра сведений, в случае когда выборка данных осуществляется запросом.

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

Чтение одной записи(структура):

// Для периодического:
// Получить(<Период>, <Отбор>)
// ПолучитьПервое(<НачалоПериода>, <Отбор>)
// ПолучитьПоследнее(<КонецПериода>, <Отбор>)
// Для непериодического:
// Получить(<Отбор>)
Доллары = Справочники.Валюты.НайтиПоНаименованию("USD");
Отбор = Новый Структура;
Отбор.Вставить("Валюта", Доллары);
Курсы = РегистрыСведений.КурсыВалют;
ТекКурс = Курсы.ПолучитьПоследнее(ТекущаяДата(), Отбор);
Сообщить("Текущий курс доллара: " + ТекКурс.Курс + " руб.");

Срез первых/последних(таблица значений):

// СрезПервых(<НачалоПериода>, <Отбор>)
// СрезПоследних(<КонецПериода>, <Отбор>)
Отбор = Новый Структура("ТипЦен, Номенклатура");
Отбор.ТипЦен = ТипЦены; // Какой тип цены
Отбор.Номенклатура = Номенклатура; // Для какой номенклатуры
// Цена в регистре сведений до Рабочей даты включительно
Цена = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних( РабочаяДата(), Отбор);

Запросом(выборка): Единственый способ получения данных по виду сравнения не только "равно"

// Чтение данных на определенную дату из регистра сведений
Запрос = Новый Запрос;
	
МассивВалют = Новый Массив;

МассивВалют.Добавить(Валюта1);
МассивВалют.Добавить(Валюта2);

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

РезультатЗапроса = Запрос.Выполнить();
ТаблицаКурсов = РезультатЗапроса.Выгрузить();
// или так
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(" "+Выборка.Валюта+": "+Выборка.Курс);
КонецЦикла;

Чтение по одному измерению нескольких(выборка): Важно! Структура отбора может содержать только один элемент.

// Для периодического:
// Выбрать(<НачалоИнтервала>, <КонецИнтервала>, <Отбор>, <Порядок>)
// Для непериодического:
// Выбрать(<Отбор>, <Порядок>)
// Для подчиненного:
// ВыбратьПоРегистратору(<Регистратор>)

// Пример:
ОтборВалют = Новый Структура("Валюта", ВыбВалюта); 
ВыборкаКурсовВалют = РегистрыСведений.КурсыВалют.Выбрать(,,ОтборВалют);
Пока ВыборкаКурсовВалют.Следующий() Цикл
    Сообщить("Дата " + ВыборкаКурсовВалют.Период + 
    " Валюта "+СокрЛП(ВыборкаКурсовВалют.Валюта) +
    ", Курс "+  ВыборкаКурсовВалют.Курс );
КонецЦикла;

Чтение/запись одной(записи):

Курс = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Курс.Валюта = ВыбВалюта;	// все измерения обязательны для заполнения
Курс.Период = ТекущаяДата();	// + период для периодического + регистратор для подчиненного
// Курс.Записать(); - если вызвать здесь, то удалим запись, т.к. не задали значение ресурсов
Курс.Прочитать();
Если Не Курс.Выбран() Тогда
	Курс.Период = ТекущаяДата();
	Курс.Валюта = ВыбВалюта;
	Курс.Курс = 41.35;
	Курс.Кратность = 1;
КонецЕсли;
Если ВвестиЧисло(Курс.Курс, "Введите курс на сегодня",15,5) Тогда
	Курс.Записать();
КонецЕсли;

Чтение/запись нескольких(набор записей):

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

Если НаборЗаписей.Количество() = 0 Тогда
	НовыйНомер = НаборЗаписей.Добавить();
	НовыйНомер.Организация = Организация;
	НовыйНомер.Период = НачалоГода(Дата);
	НовыйНомер.Номер = 2; ном=1;
ИначеЕсли НаборЗаписей.Количество() = 1 Тогда
	НовыйНомер = НаборЗаписей[0];
	ном = НовыйНомер.Номер;
	НовыйНомер.Номер = ном+1;
КонецЕсли;
НаборЗаписей.Записать();	// удаляет все старые записи согласно отбору и добавляет строки из НаборЗаписей

Параметр "Замещение" метода Записать(); по умолчанию имеет значение Истина, т. е. существующие записи этого регистратора в регистре сведений будут удалены.

Дело в том, что в любом регистре запись с конкретным ключом записи всегда уникальна. Для непериодического независимого регистра сведений ключом записи является конкретная комбинация значений измерений. То есть запись с определенной комбинацией значений измерений может присутствовать только в единственном экземпляре. Попытка записать новую запись с тем же набором значений измерений привела бы к ошибке. Кроме того, в подобной работе можно удариться в другую крайность. Если не применить отбор, то при записи система попытается заместить все существующие записи регистра. В результате, добавляя новый набор записей с замещением, мы бы удалили все ранее введенные записи регистра!

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

Источники

Система программ 1С:Предприятие 8

help1c.com