Регистры сведений
Описание:
Основная задача регистра сведений – хранить существенную для прикладной задачи информацию, состав которой развернут по определенной комбинации значений и, при необходимости, развернут во времени. Регистры сведений информация в которых развернута во времени, называются периодическими.
Например, если мы хотим хранить информацию о ценах конкурентов на продаваемые нами товары, то собранная информация о ценах разворачивается по товарам и конкурентам. А если мы хотим отслеживать динамику изменений цен, и будем заносить их периодически, то хранимая информация разворачивается также и во времени.
Регистр сведений, фактически, представляет собой массив данных, необходимый, чтобы реализовать функцию, которая может выдать необходимую информацию по определенному набору аргументов. Аргументы функции называются измерениями, а результат функции – ресурсами. В приведенном выше примере регистр “ЦеныКонкурентов” будет содержать измерения “Конкурент” и “Товар”, и ресурс “Цена”. Ресурсов может быть больше чем один: например, можно хранить оптовую и розничную цены.
Для разворота этой информации во времени используется поле “Период” регистра. Оно не вносится в качестве измерения, а добавляется системой автоматически при создании периодического регистра.
Для периодических регистров сведений система поддерживает такие стандартные операции, как получение наиболее позднего или наиболее раннего значения по определенной комбинации измерений (например, получение последней введенной цены по конкретному товару и конкретному конкуренту), а также получения среза наиболее поздних или ранних значений. Например, могут быть получены все последние введенные цены по различным товарам и конкурентам.
Если регистр не периодический, то поле “Период” для него не создается. В приведенном примере регистр “ЦеныКонкурентов” может быть непериодическим, если мы не хотим хранить историю изменения цен, а хотим иметь только актуальные цены. Тогда функция регистра сможет ответить на вопрос “какая сейчас цена у такого-то конкурента на такой-то товар”, но не сможет ответить на вопрос “какая была цена у такого-то конкурента на такой-то товар в начале года”.
Из описанных принципов работы регистра сведений вытекает то, что в системе может быть только одна запись с определенным набором и периодом измерений.
Действительно, по одному товару по одному конкуренту может быть только одна цена. Если по какой-либо причине мы можем получить несколько цен и хотим занести эту информацию в базу данных, то нам нужно создать еще одно измерение для хранения того значения, по которому эти цены могут различаться. Например, можно завести измерение “ИсточникИнформации”. Тогда можно будет вводить цены конкурентов в разрезе источников.
Уникальность записей по набору измерений принципиально отличает регистры сведений от регистров накоплений, которые позволяют вводить несколько записей с одинаковым значением измерений и периодом.
Строки регистра сведений, содержащие информацию о значениях ресурсов для определенных значений измерений и конкретного периода, называются записями. Записи в регистр сведений можно вносить двумя способами: вручную или документами.
Эти два варианта влияют на способ внесения информации, а не на основную логику работы регистра.
Документ, которым вносится запись в регистр сведений, называется регистратором.
Регистры, записываемые независимо, могут свободно редактироваться вручную или средствами встроенного языка. При этом если измерение такого регистра назначено как “ведущее” и значением измерения является ссылка на объект базы данных, то будет считаться, что запись регистра имеет смысл, только пока существует этот объект. Например, если назначить ведущим измерение “Конкурент”, то считается, что запись имеет смысл только как информация по данному конкуренту. Соответственно, при удалении конкурента записи по нему будут удалены автоматически.
Если регистр записывается регистратором, то это значит, что записи будут жестко подчинены регистраторам – документам. Обычно это значит, что записи будут порождаться при проведении документов. Соответственно, при удалении документа записи будут удаляться автоматически. В отличие от ведущих измерений, регистратор может быть только один.
В программных модулях для общих действий над регистром сведений (поиск, выбор и создание записей регистра) служит объект РегистрСведенийМенеджер.<Имя регистра сведений>. Для чтения, записи и удаления отдельных записей регистра сведений, не управляемого регистраторами, служит объект РегистрСведенийМенеджерЗаписи.<Имя регистра сведений>. Для считывания и занесения набора записей в базу данных по определенному условию отбора служит объект РегистрСведенийНаборЗаписей.<Имя регистра сведений>. Для динамического обхода записей регистра служит объект РегистрСведенийВыборка.<Имя регистра сведений>.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
// Периодический регистр сведений ЦеныНоменклатуры // Измерения: Номенклатура, ТипЦен // Ресурсы: Валюта, Цена /// Как прочитать записи регистра сведений в 1с 8.3, 8.2 /// с возможностью отбора и упорядочивания Процедура КакПрочитатьЗаписиРегистраСведений() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.ТипЦен КАК ТипЦен, | ЦеныНоменклатуры.Валюта, | ЦеныНоменклатуры.Цена, | ЦеныНоменклатуры.Период, | ЦеныНоменклатуры.Регистратор, | ЦеныНоменклатуры.НомерСтроки, | ЦеныНоменклатуры.Активность |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры |ГДЕ | ТипЦен = &ПараметрТипЦен |УПОРЯДОЧИТЬ ПО | Номенклатура УБЫВ"; ВыборкаЦен = Справочники.ТипыЦенНоменклатуры.Выбрать(); ПервыйПопавшийсяТипЦен = ВыборкаЦен.Следующий(); Запрос.УстановитьПараметр("ПараметрТипЦен", ПервыйПопавшийсяТипЦен.Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщить( Строка(ВыборкаДетальныеЗаписи.Период) + " " + ВыборкаДетальныеЗаписи.Номенклатура + " " + ВыборкаДетальныеЗаписи.ТипЦен + " " + ВыборкаДетальныеЗаписи.Цена ); КонецЦикла; КонецПроцедуры /// Как получить наиболее поздние записи (срез последних) /// регистра сведений на указанную дату (включительно) /// в 1с 8.3, 8.2 Процедура СрезПоследнийЗаписейРегистраСведений() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Период, | ЦеныНоменклатурыСрезПоследних.Регистратор, | ЦеныНоменклатурыСрезПоследних.НомерСтроки, | ЦеныНоменклатурыСрезПоследних.Активность, | ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен, | ЦеныНоменклатурыСрезПоследних.Номенклатура, | ЦеныНоменклатурыСрезПоследних.Валюта, | ЦеныНоменклатурыСрезПоследних.Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | &ПараметрДата, ТипЦен = &ПараметрТипЦен | ) КАК ЦеныНоменклатурыСрезПоследних"; ВыборкаЦен = Справочники.ТипыЦенНоменклатуры.Выбрать(); ПервыйПопавшийсяТипЦен = ВыборкаЦен.Следующий(); Запрос.УстановитьПараметр("ПараметрДата", '20140131'); Запрос.УстановитьПараметр("ПараметрТипЦен", ВыборкаЦен.Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщить( Строка(ВыборкаДетальныеЗаписи.Период) + " " + ВыборкаДетальныеЗаписи.Номенклатура + " " + ВыборкаДетальныеЗаписи.ТипЦен + " " + ВыборкаДетальныеЗаписи.Цена ); КонецЦикла; КонецПроцедуры /// Как сделать отбор движений регистра сведений по регистратору /// в 1с 8.3, 8.2 Процедура ВыборкаДвиженийРегистраПоРегистратору() // отберем движения по регистру сведений первого попавшегося // документа "Установка цен номенклатуры" ВыбДок = Документы.УстановкаЦенНоменклатуры.Выбрать(); Если ВыбДок.Следующий() Тогда ВыбРег = РегистрыСведений.ЦеныНоменклатуры.ВыбратьПоРегистратору( СсылкаНаДокумент); Пока ВыбРег.Следующий() Цикл Сообщить(ВыбРег.Номенклатура.Наименование + " " +ВыбРег.Цена); КонецЦикла; КонецЕсли; КонецПроцедуры // Периодический регистр сведений КурсыВалют // Измерения: Валюта // Ресурсы: Курс, Кратность /// Как добавить новую записи регистра сведений в 1с 8.3, 8.2 /// Как изменить/удалить существующую запись регистра сведений /// в 1с 8.3, 8.2 Процедура КакДобавитьИзменитьИлиУдалитьЗаписьРегистраСведений() // добавление новой записи НоваяЗапись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); НоваяЗапись.Период = ТекущаяДата(); НоваяЗапись.Курс = 50; НоваяЗапись.Кратность = 1.0; // НоваяЗапись.Валюта = СсылкаНаВалюту; // НоваяЗапись.Записать(); //Отбор = Новый Структура("Валюта", СсылкаНаВалюту); Выборка = РегистрыСведений.КурсыВалют.Выбрать('20130101', '20131231');//, Отбор); Пока Выборка.Следующий() Цикл // изменение существующей МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи(); МенеджерЗаписи.Прочитать(); МенеджерЗаписи.Курс = 25; // МенеджерЗаписи.Записать(); // удаление существующей //Выборка.ПолучитьМенеджерЗаписи().Удалить(); КонецЦикла; КонецПроцедуры /// Как работать с набором записей регистра сведений в 1с 8.3, 8.2 Процедура РаботаСНаборомЗаписейРегистраСведений() НаборКурсов = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); //НаборКурсов.Отбор.Валюта.Установить(СсылкаНаВалюту); НаборКурсов.Отбор.Период.Установить(ТекущаяДата()); НаборКурсов.Прочитать(); Если НаборКурсов.Количество() = 0 Тогда НовыйКурс = НаборКурсов.Добавить(); //НовыйКурс.Валюта = СсылкаНаВалюту; НовыйКурс.Период = ТекущаяДата(); ИначеЕсли НаборКурсов.Количество() = 1 Тогда НовыйКурс = НаборКурсов[0]; КонецЕсли; НовыйКурс.Курс = 0; НовыйКурс.Кратность = 1; НаборКурсов.Записать(); КонецПроцедуры |
Источник: http://helpme1c.ru/registry-svedenij-v-yazyke-1s-8-v-primerax
Leave a Reply