Капитально об программе 1С 8.0-8.3-8.4, 7.7

Запись в регистр сведений в 1С

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

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

Независимая запись может быть сделана интерактивно(пользователем), либо программно.

Запись в непериодический регистр

Для записи данных создано два служебных объекта «МенеджерЗаписи» и «НаборЗаписей». Последний служит для групповой обработки по установленному отбору измерений или же по абсолютно всем записям регистра (когда отбора нет).

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

Простой код записи в регистр сведений:

менЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
//Номенклатура —  это измерение
менЗаписи.Номенклатура = Справочники.Товары.НайтиПоНаименованию(«Грабли садовые»);
//Цена  — это ресурс
менЗаписи.Цена = 100;
 

Более сложный способ записи (групповой)

набЗаписей = РегистрыСведений.Цены.СоздатьНаборЗаписей();
набЗаписей.Отбор.Номенклатура.Установить(Справочники.Товары.НайтиПоНаименованию(«Грабли садовые»));
набЗаписей.Прочитать();
Если набЗаписей.Количество() = 0 Тогда
        Запись = набЗаписей.Добавить();
Иначе
        //Запись уже существует
       Запись = набЗаписей[0]; 
КонецЕсли;
//пишем значение в Запись (строку регистра);
Запись.Цена = 100;
// Обратите внимание, записываем именно набор, хотя, в данном случае, он состоит всего из одной записи регистра
набЗаписей.Записать();

 

Теперь, запросив данные по измерению «Грабли садовые», мы будем получать значение 100.

Способы чтения записей регистра сведений:

Через менеджер записи

менЗаписи = РегистрыСведений.Цены.ПолучитьМенеджерЗаписи();
менЗаписи.Номенклатура = Справочники.Товары.НайтиПоНаименованию(«Грабли садовые»);
//Отдаем команду на чтение по установленному товару
менЗаписи.Прочитать();
Если менЗаписи.Выбран() Тогда
         Сообщить(«Цена товара «+менЗаписи.Номенклатура +» равна «+менЗаписи.Цена);
Иначе
        Сообщить(«На товар «+менЗаписи.Номенклатура + » цена не установлена»);
КонецЕсли;

 

Через запрос:

Запрос = Новый Запрос («Выбрать * из РегистрСведений.Цены Где Номенклатура.Наименование =»»Грабли садовые»»»);
 
ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
 
Если ВыборкаЗапроса.Следующий() Тогда
        Сообщить(«Цена товара «+ВыборкаЗапроса.Номенклатура +» равна «+ВыборкаЗапроса.Цена);
Иначе //
        Сообщить(«На товар цена не установлена»);
КонецЕсли;
 

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

Работа с периодическим регистром.

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

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

Кроме этого, у регистра появляются дополнительные «виртуальные» таблицы для запроса к данным: СрезПервых и СрезПоследних.

Периодичность регистра может быть «Год», «Месяц», «Квартал», «День», «Секунда» — до такой детальности можно хранить значения.

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

Всё определяется индивидуально для задачи.

Нет необходимости закладывать более точную детальность, чем необходимо: это ухудшит восприятие данных.

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

Запись в периодический регистр:

менЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
менЗаписи.Период = ТекущаяДата();//Система сама преобразует в начало дня
//Номенклатура —  это измерение
менЗаписи.Номенклатура = Справочники.Товары.НайтиПоНаименованию(«Грабли садовые»);
//Цена — это ресурс
менЗаписи.Цена = 100;

Через менеджер записи:

набЗаписей = РегистрыСведений.Цены.СоздатьНаборЗаписей();
набЗаписей.Отбор.Период.Установить(Дата(2017,1,1));
набЗаписей.Отбор.Товар.Установить(Справочники.Товары.НайтиПоНаименованию(«Грабли садовые»));
набЗаписей.Прочитать();
Если набЗаписей.Количество() = 0 Тогда
       Запись = набЗаписей.Добавить();
Иначе
        //Запись уже существует
       Запись = набЗаписей[0];
КонецЕсли;
//пишем значение в Запись (строку регистра);
Запись.Цена = 100;
набЗаписей.Записать();

Чтение из периодического регистра

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

Через запросы

В конструкторе запроса выбирается нужная таблица

из 1 реальной и 2 виртуальных

Задаются данные выборки и параметры виртуальной таблицы:

Получается вот такой текст запроса:

Текст = «ВЫБРАТЬ
| ЦеныСрезПоследних.Период,
| ЦеныСрезПоследних.Номенклатура,
| ЦеныСрезПоследних.Цена
|ИЗ
| РегистрСведений.Цены.СрезПоследних(&Период,Номенклатура.Наименование = «»Грабли садовые»») КАК ЦеныСрезПоследних»;

 

Через команды регистра:

Обратное действие — получение первой цены, установленной на товар

СтруктураРесурсов = РегистрыСведений.Цены.ПолучитьПервое(ТекущаяДата(),Новый Структура(«Номенклатура»,Справочники.Товары.НайтиПоНаименованию(«Грабли садовые»));
//Возвращает структуру, содержащую значения ресурсов.
Сообщить(«Цена «+СтруктураРесурсов.Цена);

 

Работа с документами

Производится аналогично как с набором записей, к которому добавляется реквизит «Регистратор».

Если работаете из модуля проведения обращаетесь к регистру через свойство «Движения»

НаборЗаписей = Движения.Цены;

Если работаете с таким регистром из другого объекта, то не забываете установить свойство «Регистратор», равным нужной  ссылке.

Так вы можете и прочитать и установить движение любого регистратора.

 

Вот и рассмотрены основные приемы работы с регистрами сведений кодом языка 1С и запросов.

Как очистить регистр сведений?

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