Главная » Файлы » Справка на Примерах 1С » Регистры Сведений

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

Через минуту Вы получите "Гостевой доступ"




Регистры сведений 1c 8
2012 Май 23, 20:34

1с8 Регистры сведений

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

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

Во-вторых регистр сведений имеет назначаемый разработчиком состав ключевых реквизитов, называемых измерениями.
Комбинация ключевых реквизитов однозначно идентифицирует запись, то есть двух или более записей с одинаковыми значениями ключевых реквизитов не может быть по-определению.
То есть, к примеру, в регистре сведений, хранящем информацию о длительности рабочих дней с реквизитами "Дата" и "Длительность", реквизит "Дата" будет ключевых, а "Длительность" нет, поскольку в регистре сведений должна быть только одна запись для каждой даты.

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

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

Ну и напоследок ответ на вопрос, как осуществлять чтение и запись регистра сведений.

Чтение регистра сведений лучше всего осуществлять с помощью запроса.
Работа с запросами является отдельной темой и в рамках данной статьи не рассматривается.
Однако можно читать записи и без запроса с помощью нескольких методов объекта "РегистрСведенийМенеджер".
Методы "Выбрать" и "ВыбратьПоРегистратору" позволяют получить выборку записей с учетом заданного отбора.
Метод "Получить" позволяет получить одну запись, для которой в параметрах метода передается отбор по всем ключевым реквизитам.
Методы "ПолучитьПервое" и "ПолучитьПоследнее" позволяют получить соответственно первую или последнюю запись периодического регистра сведений, удовлетворяющую заданному в параметрах метода отбору.
Методы "СрезПервых" и "СрезПоследних" позволяют получить соответственно срез первых или последних записей, удовлетворяющих заданному в параметрах метода отбору.
Кроме этих методов есть еще два метода, "СоздатьМенеджерЗаписи" и "СоздатьНаборЗаписей", с помощью которых можно создать соответсвенно объект "РегистрСведенийМенеджерЗаписи" или "РегистрСведенийНаборЗаписей", после чего задать значения всех или некоторых ключевых реквизитов и с помощью метода объекта "Прочитать" выполнить чтение в объект записей из базы, удовлетворяющих присвоенным значениям ключевых реквизитов.
В итоге получаем объект, содержащий нужные нам одну или несколько записей.

Запись же в регистр сведений производится с помощью уже упомянутых методов "СоздатьМенеджерЗаписи" и "СоздатьНаборЗаписей" объекта "РегистрСведенийМенеджер".
Можно либо создать объект, после чего заполнить реквизиты записи или список записей и записать объект с помощью метода "Записать".
Либо создать объект, задать значения всех или некоторых ключевых реквизитов, чтобы с помощью метода объекта "Прочитать" выполнить чтение в объект записей из базы, удовлетворяющих присвоенным значениям ключевых реквизитов, после чего выполнить метод "Очистить", после чего уже выполнить метод "Удалить" или заполнить реквизиты записи или список записей и записать объект с помощью метода "Записать".

 

Как добавить запись в непериодический независимый регистр сведений?

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

НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура); 
НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство); 

НоваяЗапись = НаборЗаписей.Добавить(); 
НоваяЗапись. Номенклатура = ТекущаяНоменклатура; 
НоваяЗапись.Свойство = ТекущееСвойство; 
НоваяЗапись.Значение = ТекущееЗначение; 

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

 

Как считать содержимое непериодического независимого регистра сведений "СобственныеКонтрагенты"?

 

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

// Перебрать записи в цикле… 
Для Каждого Запись из НаборЗаписей Цикл 
РегистрКонтрагент = Запись.Контрагент; 
РегистрВидСвязи = Запись.ВидСвязи; 
РегистрОбъект = Запись.Объект; 
КонецЦикла; 

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



ВЫБРАТЬ 
 * 
ИЗ 
 РегистрыСведений.СобственныеКонтрагенты

 

Как удалить все записи из независимого регистра сведений?

 

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

 

Как удалить записи независимого регистра сведений с отбором по конкретной организации?

 

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

 

Как добавить запись в периодический независимый регистр сведений?

 

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

НаборЗаписей.Отбор.Валюта.Установить(ТекущаяВалюта); 
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата); 

НовЗапись = НаборЗаписей.Добавить(); 
НовЗапись.Валюта = ТекущаяВалюта; 
НовЗапись.Период = ТекущаяДата; 
НовЗапись.Курс = ТекущийКурс; 
НовЗапись.Кратность = ТекущаяКратность; 

НаборЗаписей.Записать(Истина);

 

Как прочитать (изменить) записи в периодическом независимом регистре сведений?

 

НаборЗаписей = РегистрыСведений.Валюты.СоздатьНаборЗаписей(); 
НаборЗаписей.Отбор.Период.Установить(ДатаЗаписи); 

НаборЗаписей.Прочитать(); 

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

 // Чтение и сообщение данных полей записи. 
 Сообщить(Строка(Запись.Период) + " " + Строка(Запись.Валюта) + " " + Строка(Запись.Курс)); 

 // Изменение данных полей записи. 
 Запись.Курс = 0; 

КонецЦикла; 

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

 

Как удалить записи в периодическом независимом регистре сведений?

 

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

 

Как в периодическом независимом регистре сведений "КурсыВалют" удалить все записи по валютам с наименованиями "EUR" и "USD", период которых меньше 01 января 2005 года?

 

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ 
| * 
|ИЗ 
| РегистрСведений.КурсыВалют КАК КурсыВалют 
|ГДЕ 
| (КурсыВалют.Период >= ДАТАВРЕМЯ(2005, 1, 1) 
| ИЛИ 
| НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""USD"") 
| И 
| НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""EUR""))"; 



ТаблицаОставляемыхЗаписей = Запрос.Выполнить().Выгрузить(); 

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); 
НаборЗаписей.Загрузить(ТаблицаОставляемыхЗаписей); 
НаборЗаписей.Записать();

 

Как прочитать данные, актуальные на определенную дату, из регистра сведений "Курсы валют" с отбором по нескольким валютам (отбор по измерениям)?

 

Запрос = Новый Запрос; 
МассивВалют = Новый Массив; 
МассивВалют.Добавить(Валюта1); 
МассивВалют.Добавить(Валюта2); 

Запрос.УстановитьПараметр("МассивВалют", МассивВалют); 
Запрос.УстановитьПараметр("ДатаПолучения", ДатаПолучения); 

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

ТаблицаКурсов = Запрос.Выполнить().Выгрузить();

 

Как поменять период у записей периодического независимого регистра, соответствующих ряду условий?

 

Процедура ЗаменаПериода() 

 Запрос = Новый Запрос; 
 Запрос.Текст = "ВЫБРАТЬ 
 | ОтветственныеЛицаОрганизации.Период, 
 | ОтветственныеЛицаОрганизации.СтруктурнаяЕдиница, 
 | ОтветственныеЛицаОрганизации.ОтветственноеЛицо 
 |ИЗ 
 | РегистрСведений.ОтветственныеЛицаОрганизации КАК ОтветственныеЛицаОрганизации 
 |ГДЕ 
 | ОтветственныеЛицаОрганизации.Период <= ДАТАВРЕМЯ(2005, 1, 1) 
 | И 
 | ОтветственныеЛицаОрганизации.СтруктурнаяЕдиница.Наименование | ПОДОБНО "Групп-Трейдинг" 
 | И 
 | (ОтветственныеЛицаОрганизации.Должность.Наименование ЕСТЬ NULL 
 | ИЛИ 
 | НЕ(ОтветственныеЛицаОрганизации.Должность.Наименование | ПОДОБНО "Продавец" 
 | ИЛИ 
 | ОтветственныеЛицаОрганизации.Должность.Наименование | ПОДОБНО "Кладовщик"))"; 

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

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

 Пока Выборка.Следующий() Цикл 
 Запись.Период = Выборка.Период; 
 Запись.СтруктурнаяЕдиница = Выборка.СтруктурнаяЕдиница; 
 Запись.ОтветственноеЛицо = Выборка.ОтветственноеЛицо;
 
 Запись.Прочитать(); 
 
 Если Запись.Выбран() Тогда 
 Запись.Период = Дата(2004, 1, 1); 
 Запись.Записать(); 
 КонецЕсли; 
 КонецЦикла; 

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

 

Как "сделать периодическим" реквизит уже заполненного справочника?

 

Запрос = Новый Запрос; 
Запрос.Текст = "ВЫБРАТЬ 
| &ДатаУстановки КАК Период, 
| Проекты.Ссылка КАК Проект, 
| Проекты.Ответственный 
|ИЗ 
| Справочник.Проекты КАК Проекты 
|ГДЕ 
| (НЕ(Проекты.ЭтоГруппа)) И (НЕ(Проекты.Ответственный = &Ответственный))"; 

Запрос.УстановитьПараметр("Ответственный", Справочники.Пользователи.ПустаяСсылка()); 
Запрос.УстановитьПараметр("ДатаУстановки", Дата(2000,1,1)); 

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

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

 

Как добавить записи в регистр сведений, подчиненный регистратору?

 

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



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

 

Как прочитать (изменить) записи в регистре сведений, подчиненном регистратору?

 

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

 

Как удалить записи из регистра сведений, подчиненного регистратору?

 

Запрос = Новый Запрос; 
Запрос.Текст = " 
| ВЫБРАТЬ 
| ЦеныНоменклатурыКонтрагентов.Регистратор 
|ИЗ 
| РегистрСведений.ЦеныНоменклатурыКонтрагентов КАК ЦеныНоменклатурыКонтрагентов"; 

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

НаборЗаписей = РегистрыСведений.ЦеныНоменклатурыКонтрагентов.СоздатьНаборЗаписей(); 
Пока Выборка.Следующий() Цикл 
 НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор); 
 НаборЗаписей.Записать(); 
КонецЦикла;
Категория: Регистры Сведений | Добавил: c1
Просмотров: 26730 | Загрузок: 0 | Рейтинг: 5.0/1

Выразить благодарность - Поделиться с друзьями!

 

Здесь все о технической стороне 1С!

 

Узнай, как правильно администрировать 1С Предприятие
Регистрируйся на бесплатный 7-ми дневный курс сейчас:

Ваш E-Mail в безопасности



Всего комментариев: 0
avatar