Как добавить записи в регистр сведений
Содержание
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи. .
Например, для того, чтобы в независимый регистр сведений "ЗначенияСвойствОбъектов" с измерениями "Объект", "Свойство" и ресурсом "Значение" добавить одну запись, содержащую значение некоторого свойства выбранной номенклатуры, можно использовать следующий код:
В результате выполнения этого кода новая запись будет добавлена в регистр, или, если регистр уже содержит запись с выбранными значениями измерений "Объект" и "Свойство", — существующая запись будет заменена новой.
Если требуется добавить несколько записей в регистр сведений, можно использовать объект РегистрСведенийНаборЗаписей. .
Например, для того, чтобы в тот же самый регистр сведений "ЗначенияСвойствОбъектов" добавить несколько записей о значениях различных свойств выбранной номенклатуры, можно использовать следующий код (предполагается, что свойства и соответствующие им значения находятся в таблице значений "ТаблицаСвойств", сформированной заранее):
В результате выполнения этого кода новые записи будут добавлены в регистр, или, если регистр уже содержит записи с указанным значением измерения "Объект" (по которому установлен отбор в наборе записей), — существующие записи будут заменены новыми.
Регистры сведений в 1С предназначены для хранения произвольных данных в разрезе нескольких измерений и, при необходимости, в разрезе времени. Рассмотрим подробнее работу с этим прикладным объектом.
Предназначение регистра сведений
Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.
При проектировании разработчик указывает необходимость хранения данных в разрезе времени и минимальную периодичность, с которой записи будут храниться в регистре:
Регистры сведений, для которых указана периодичность, называются периодическими.
Изменение данных в регистре может осуществляться как вручную, так и при помощи документов. Режим записи в регистр определяет разработчик на этапе проектирования:
Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:
- измерения — описывают разрезы, в которых хранится информация;
- период — поле, используемое для разворота данных по времени. Поле добавляется автоматически при указании свойства «Периодичность», отличного от «Непериодический»;
- регистратор — поле, используемое для хранения документа, с которым связана запись. Поле добавляется автоматически при указании свойства «Режим записи» в значение «Подчинение регистратору»;
- ресурсы — непосредственно хранят информацию для комбинации измерений;
- реквизиты — дополнительная произвольная информация, относящаяся к конкретной записи регистра.
Для всех регистров сведений обеспечивается контроль уникальности записей, т.е. в регистре не может быть двух одинаковых записей. Одинаковыми считаются записи, у которых совпадают значения измерений, период (если регистр периодический) и регистратор (если регистр подчинен регистратору).
Добавление записей
Программно добавить записи в регистр сведений можно при помощи:
- объекта НаборЗаписей ;
- объекта МенеджерЗаписи .
Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Объект предназначен в основном для интерактивной работы, но программно с ним также можно работать. На системном уровне МенеджерЗаписи использует объект НаборЗаписей .
Общая схема добавления записей в регистр сведений при помощи объекта НаборЗаписей выглядит так:
- создание объекта НаборЗаписей ;
- наложение отборов на измерения, период (если регистр периодический) и регистратора (если регистр подчинен регистратору);
- добавление и заполнение значений полей записей;
- запись набора записей.
// Добавление записи в независимый непериодический регистр сведений
НаборЗаписей = РегистрыСведений . ВерсииПодсистем . СоздатьНаборЗаписей (); // Этап 1
НаборЗаписей . Отбор . ИмяПодсистемы . Установить ( ИмяПодсистемы ); // Этап 2
// Этап 3
НоваяЗапись = НаборЗаписей . Добавить ();
НоваяЗапись . ИмяПодсистемы = ИмяПодсистемы ;
НоваяЗапись . Версия = НомерВерсии ;
НаборЗаписей . Записать (); // Этап 4
// Добавление записи в независимый периодический регистр сведений
НаборЗаписей = РегистрыСведений . КурсыВалют . СоздатьНаборЗаписей (); // Этап 1
// Этап 2
НаборЗаписей . Отбор . Валюта . Установить ( Доллар );
НаборЗаписей . Отбор . Период . Установить ( НачалоДня ( ТекущаяДата ()));
// Этап3
НоваяЗапись = НаборЗаписей . Добавить ();
НоваяЗапись . Период = ТекущаяДата ();
НоваяЗапись . Валюта = Доллар ;
НоваяЗапись . Курс = 57.92 ;
НоваяЗапись . Кратность = 1 ;
НаборЗаписей . Записать (); // Этап 4
Общая схема добавления записей в регистр сведений при помощи объекта МенеджерЗаписи выглядит так:
- создание объекта МенеджерЗаписи ;
- заполнение значений полей записи;
- запись записи.
// Добавление записи в независимый непериодический регистр сведений
Запись = РегистрыСведений . ВерсииПодсистем . СоздатьМенеджерЗаписи (); // Этап 1
// Этап 2
Запись . ИмяПодсистемы = ИмяПодсистемы ;
Запись . Версия = НомерВерсии ;
Запись . Записать (); // Этап 3
// Добавление записи в независимый периодический регистр сведений
Запись = РегистрыСведений . КурсыВалют . СоздатьМенеджерЗаписи (); // Этап 1
// Этап 2
Запись . Период = ТекущаяДата ();
Запись . Валюта = Доллар ;
Запись . Курс = 57.92 ;
Запись . Кратность = 1 ;
Запись . Записать (); // Этап 3
Изменение записей
Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей и МенеджерЗаписи . Ограничения объекта МенеджерЗаписи были описаны в разделе Добавление записей.
Общая схема редактирования записей регистров сведений:
- создание объекта НаборЗаписей или МенеджерЗаписи ;
- наложение отборов;
- чтение записей базы данных, соответствующих наложенным отборам;
- редактирование прочитанных записей;
- запись отредактированных записей.
// Редактирование записей с использованием объекта НаборЗаписей
НаборЗаписей = РегистрыСведений . КурсыВалют . СоздатьНаборЗаписей (); // Этап 1
// Этап 2
НаборЗаписей . Отбор . Период . Установить ( ДатаКурса );
НаборЗаписей . Отбор . Валюта . Установить ( Доллар );
НаборЗаписей . Прочитать (); // Этап 3
Для Каждого Запись Из НаборЗаписей Цикл
Запись . Курс = 57.84 ; // Этап 4
КонецЦикла;
НаборЗаписей . Записать (); // Этап 5
// Редактирование записей с использованием объекта МенеджерЗаписи
Запись = РегистрыСведений . КурсыВалют . СоздатьМенеджерЗаписи (); // Этап 1
// Этап 2
Запись . Период = ДатаКурса ;
Запись . Валюта = Доллар ;
Запись . Прочитать (); // Этап 3
Если Запись . Выбран () Тогда // Проверка, что запись существует
Запись . Курс = 57.92 ; // Этап 4
Запись . Записать (); // Этап 5
КонецЕсли;
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют» ;
Выборка = Запрос . Выполнить (). Выбрать ();
Пока Выборка . Следующий () Цикл
// обход результата выполнения запроса
КонецЦикла;
Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПоследних.Период,
| КурсыВалютСрезПоследних.Валюта,
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних» ;
Запрос . УстановитьПараметр( «Валюта» , ВыбраннаяВалюта );
Запрос . УстановитьПараметр( «Период» , ВыбраннаяДата );
Выборка = Запрос . Выполнить (). Выбрать ();
Пока Выборка . Следующий () Цикл
// обход результата выполнения запроса
КонецЦикла;
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПервых.Период,
| КурсыВалютСрезПервых.Валюта,
| КурсыВалютСрезПервых.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых» ;
Запрос . УстановитьПараметр( «Валюта» , ВыбраннаяВалюта );
Запрос . УстановитьПараметр( «Период» , ВыбраннаяДата );
Выборка = Запрос . Выполнить (). Выбрать ();
Пока Выборка . Следующий () Цикл
// обход результата выполнения запроса
КонецЦикла;
Кроме чтения запросом возможно использование методов объектной модели.
Для непериодических регистров сведений:
- Выбрать ( Отбор >, Порядок >) — выбирает записи с указанным отбором;
- ВыбратьПоРегистратору ( Регистратор >) — выбирает все записи указанного регистратора;
- Получить ( Отбор >) — получает ресурсы записи с отбором по всем измерениям.
Для периодических регистров сведений:
- Выбрать ( НачалоИнтервала >, КонецИнтервала >, Отбор >, Порядок >) — выбирает записи с указанным отбором, у которых период находится между и ;
- ВыбратьПоРегистратору ( Регистратор >) — выбирает все записи указанного регистратора;
- Получить ( Период >, Отбор >) — получает ресурсы записи с отбором по всем измерениям и периоду;
- ПолучитьПервое ( НачалоПериода >, Отбор >) — получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;
- ПолучитьПоследнее ( КонецПериода >, Отбор >) — получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;
- СрезПервых ( НачалоПериода >, Отбор >) — получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;
- СрезПоследних ( КонецПериода >, Отбор >) — получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.
Удаление записей
Для удаления записи(записей) в независимом регистре сведений необходимо:
- создать набор записей;
- наложить требуемые отборы на измерения и период (если регистр периодический);
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений . КурсыВалют . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Валюта . Установить ( Доллар );
НаборЗаписей . Отбор . Период . Установить ( НачалоДня ( ТекущаяДата ()));
Для удаления записей в подчиненном регистре сведений необходимо:
- создать набор записей;
- наложить отбор на регистратора;
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений . ЦеныНоменклатуры . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Регистратор . Установить ( СсылкаНаДокументРегистратор );
НаборЗаписей . Записать ();
Очистка регистра сведений
Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:
НаборЗаписей = РегистрыСведений . КурсыВалют . СоздатьНаборЗаписей ();
НаборЗаписей . Записать ();
Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:
- получить перечень ссылок всех регистраторов регистра сведений;
- последовательно записать пустой набор записей с отбором по регистраторам из пункта 1.
Запрос = Новый Запрос ( «ВЫБРАТЬ
| ЦеныНоменклатуры.Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры» );
Выборка = Запрос . Выполнить (). Выбрать ();
НаборЗаписей = РегистрыСведений . ЦеныНоменклатуры . СоздатьНаборЗаписей ();
Пока Выборка . Следующий () Цикл
НаборЗаписей . Отбор . Регистратор . Установить ( Выборка . Регистратор );
НаборЗаписей . Записать ();
КонецЦикла;
Остались вопросы?
Спросите в комментариях к статье.
5 комментариев
Для этого примера интересным решением будет использовать независимый регистр сведений с индексированным реквизитом ДокументДвижение, используя его как аналог Регистратора. В этом случае можно будет получить профит при записи регистра.
Не понятно за счет чего может быть профит при записи набора записей независимого регистра сведений. Можете пояснить?
Работа платформы с регистрами сведений несколько раз менялась. 8.3 стала более оптимальной и как бы мне не хотелось «потыкать палочкой» в 8.1 и в ранние версии 8.2, дабы показать как все было плохо, решил этого не делать. Кому станет любопытно «как было» — получит мотивацию изучить вопрос.
Зачем накладывать Отбор, когда создаётся новый набор записей?
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи. .
Например, для того, чтобы в независимый регистр сведений ЗначенияСвойствОбъектов с измерениями Объект, Свойство и ресурсом Значение добавить одну запись, содержащую значение некоторого свойства выбранной номенклатуры, можно использовать следующий код:
В результате выполнения этого кода новая запись будет добавлена в регистр, или, если регистр уже содержит запись с выбранными значениями измерений Объект и Свойство, — существующая запись будет заменена новой.
Если требуется добавить несколько записей в регистр сведений, можно использовать объект РегистрСведенийНаборЗаписей. .
Например, для того, чтобы в тот же самый регистр сведений ЗначенияСвойствОбъектов добавить несколько записей о значениях различных свойств выбранной номенклатуры, можно использовать следующий код (предполагается, что свойства и соответствующие им значения находятся в таблице значений ТаблицаСвойств, сформированной заранее):
Код 1C v 8.х
В результате выполнения этого кода новые записи будут добавлены в регистр, или, если регистр уже содержит записи с указанным значением измерения Объект (по которому установлен отбор в наборе записей), — существующие записи будут заменены новыми.