вторник, 20 мая 2014 г.

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

На следующей схеме изображено взаимодействие объектов встроенного языка для работы с регистрами сведений.


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

// 1. Глобальный контекст
//    РегистрыСведений

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

// 2. объект РегистрыСведенийМенеджер
//    .<имя регистра сведений>
//    [<имя регистра сведений>]
//    Для Каждого ... Из ... Цикл ... КонецЦикла;

// Пример: получить начальную цену из периодического регистра сведений "Цены".
ИмяРегистра = "Цены";
Услуга = Справочники.Номенклатура.НайтиПоНаименованию("Диагностика");
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Услуга);
Цена = РегистрыСведений[ИмяРегистра].ПолучитьПервое(ТекущаяДата(), Отбор).Цена;

// 3. объект РегистрСведенийМенеджер.<имя>
//    СоздатьКлючЗаписи()

// Пример: активизировать требуемую строку списка регистра сведений.
СтруктураКлючевыхПолей = Новый Структура;
СтруктураКлючевыхПолей.Вставить("Период", Дата("20040331000000"));
СтруктураКлючевыхПолей.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("0000006"));
Элементы.Материалы.ТекущаяСтрока = РегистрыСведений.Цены.СоздатьКлючЗаписи(СтруктураКлючевыхПолей);

// 4. объект РегистрСведенийМенеджер.<имя>
//    СоздатьНаборЗаписей()

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

// 5. объект РегистрСведенийМенеджер.<имя>
//    СоздатьМенеджерЗаписи()

// Пример: добавить новое значение в регистр "Цены".
Запись = РегистрСведений.Цены.СоздатьМенеджерЗаписи();
Запись.Период = ТекущаяДата();
Запись.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0000005");
Запись.Цена = 568;
Запись.Записать();

// 6. объект РегистрСведенийНаборЗаписей.<имя>
//    [<индекс элемента коллекции>]4
//    Для  Каждого ... Из ... Цикл ... КонецЦикла;

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

// 7. объект РегистрСведенийВыборка.<имя>
//    Выбрать()
//    ВыбратьПоРегистратору()

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

// 8. объект РегистрСведенийМенеджер.<имя>
//    Выбрать()
//    ВыбратьПоРегистратору()

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


Работа с формой записи регистра сведений осуществляется при помощи РегистрСведенийМенеджерЗаписи.<имя>, который, в свою очередь, использует объект РегистрСведенийНаборЗаписей.<имя>.
Особенности внутренней реализации объекта РегистрСведенийМенеджерЗаписи.<имя> таковы, что в случае сохранения существующей записи регистра сведений обработчики события ПередЗаписью() и ПриЗаписи() модуля набора записей будут вызваны дважды: сначала для старого набора записей (с количеством записей 0) и затем для нового (с количеством записей 1).


ПРИМЕЧАНИЕ. Заливкой выделены события, выполняющиеся в транзакции записи.


Добавить комментарий

Комментариев нет :

Отправить комментарий