| 01.01.2003
| | | | Монитор 19"
| | | | Розничная
| | | | 1500,00
| | | 01.01.2003
| | | | Монитор 19"
| | | | Оптовая
| | | | 1400,00
| | | 01.01.2003
| | | | Мышь 2х кноп.
| | | | Розничная
| | | | 1,50
| | | 01.02.2003
| | | | Монитор 19"
| | | | Розничная
| | | | 1350,00
| | | 01.02.2003
| | | | Монитор 19"
| | | | Оптовая
| | | | 1300,00
| | | 01.02.2003
| | | | Мышь 2х кноп.
| | | | Розничная
| | | | 1,20
|
Дата
| Указывается дата или момент времени, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние записи.
| |
Дата приема
| | Иванов
| | | | Темп плюс
| | | | Маркетинг
| | | | маркетолог
| | | | 12.01.2003
| | | Иванов
| | | | Темп плюс
| | | | Отдел продаж
| | | | продавец-консультант
| | | | 11.01.2003
| | | Иванов
| | | | Белый свет
| | | | Отдел разработки
| | | | программист
| | | | 11.01.2003
|
| Такая структура регистра сведений предполагает, что сотрудник может работать в одной организации в разных подразделениях, но он не может занимать разные должности внутри подразделения одной и той же организации. Если требуется хранить и такие сведения, то нужно ресурс Должность сделать измерением.
| |
| Некоторые измерения регистра сведений можно назначить ведущими, что возможно только для измерений, которые являются ссылками на объекты базы данных. Это нужно сделать, если записи регистра не имеют смысла без данного объекта. Тогда удаление объекта базы данных приведет к автоматическому удалению записей регистра сведений, ссылающихся на этот объект. Например, записи о курсе валюты не имеют смысла, если сама валюта была удалена. |
Для непериодических регистров сведений:
Получить(<структура>)
Структура должна содержать ключи, соответствующие именам измерений регистра (в произвольном порядке). В качестве значений структуры передаются значения измерений, по которым следует осуществлять отбор.
Для непериодического регистра сведений:
Выбрать (<Отбор>, <Порядок>)
Для периодических регистров сведений:
Получить(<Период>, <структура>)
где Период ? это дата или момент времени, на который требуется получить значения ресурсов.
Метод Получить возвращает структуру, ключи которой совпадают с именами ресурсов,
Для периодического регистра сведений:
Выбрать(<Начало интервала>, <Конец интервала>, <Отбор>, <Порядок>)
Параметр Отбор ? это структура только с одним элементом, которая задает фильтр по полю. Ключ структуры описывает имя поля, а значение структуры ? значение отбора по этому полю. В качестве полей для отбора могут задаваться измерения, для которых в Конфигураторе задан признак индексирования или которые являются ведущими.
Параметры Начало интервала и Конец интервала позволяют задать границы интервала и могут иметь тип «дата», МоментВремени или Граница.
Приведем пример выборки записей периодического регистра сведений за определенный период по заданной валюте:
<Имя измерения>
| Набор полей, содержащий значения измерений регистра.Имена полей соответствуют именам измерений.
| |
<Имя реквизита>
| Набор полей, содержащий значения реквизитов регистра.
| |
<Имя ресурса>
| Набор полей, который содержит значения ресурсов регистра.
| |
Источник
| 01.01.2002
| | | Рубль
| | | | 1
| | | | 1
| |
| | 01.01.2002
| | | EUR
| | | | 26,6172
| | | | 1
| | | | РБК
| | 01.02.2002
| | | EUR
| | | | 26,4306
| | | | 1
| | | | РБК
| | 01.03.2002
| | | EUR
| | | | 26,7634
| | | | 1
| | | | РБК
| | 02.04.2002
| | | EUR
| | | | 27,2497
| | | | 1
| | | | РБК
| | 01.05.2002
| | | EUR
| | | | 28,1785
| | | | 1
| | | | РБК
| | 01.06.2002
| | | EUR
| | | | 29,3711
| | | | 1
| | | | РБК
| | 01.06.2002
| | | USD
| | | | 31,3058
| | | | 1
| | | | РБК
| | 01.05.2002
| | | USD
| | | | 31,1951
| | | | 1
| | | | ЦБ РФ
| | 01.04.2002
| | | USD
| | | | 31,1741
| | | | 1
| | | | РБК
| | 01.03.2002
| | | USD
| | | | 30,9404
| | | | 1
| | | | ЦБ РФ
| | 01.02.2002
| | | USD
| | | | 30,6797
| | | | 1
| | | | РБК
| | 01.01.2002
| | | USD
| | | | 30,1372
| | | | 1
| | | | ЦБ РФ
|
Данный запрос просто выбирает все записи регистра сведений, не производя никакую дополнительную их обработку. Чтобы получить записи за определенный период или по конкретной валюте, необходимо добавить в запрос условие ГДЕ.
Допустим, нам нужны записи за первый квартал по валюте «EUR», тогда для решения этой задачи нам понадобится следующий запрос:
| ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют
| |
| ГДЕ Валюта = &ВыбВалюта И Период МЕЖДУ &НачДата И &КонДата
| | Результат запроса будет
| 01.01.2002
| | | EUR
| | | | 26,6172
| | | | 1
| | | | РБК
| | 01.02.2002
| | | EUR
| | | | 26,4306
| | | | 1
| | | | РБК
| | 01.03.2002
| | | EUR
| | | | 26,7634
| | | | 1
| | | | РБК
|
Чтобы систематизировать знания об основной таблице регистра сведений, приведем список всех полей, которые она предоставляет:
Измерения:
| | | ФизЛицо
| | | | СправочникСсылка.Физлица
| | | |
| | Сотрудник
| | | | СправочникСсылка.Сотрудники
| | |
| | | | Организация
| | | | СправочникСсылка.Организации
| |
| | | Подразделение
| | | | СправочникСсылка.Подразделения
| | | |
| | Номенклатура
| | | | СправочникСсылка.Номенклатура
| | |
| | | | ТипЦен
| | | | СправочникСсылка.ТипыЦен
| | | |
| | Организация
| | | | СправочникСсылка.Организация
| | |
| | | | Физлицо
| | | | СправочникСсылка.Физлица
| |
| | | Подразделение
| | | | СправочникСсылка.Подразделения
| |
| | | Должность
| | | | СправочникСсылка.Должности
| | | |
Код:
РегЦены = РегистрыСведений.ЦеныКонкурентов;
Отбор = Новый Структура("Конкурент", ВыбКонкурент);
тзЦеныКонкурента = РегЦены.СрезПоследних(ВыбДата,Отбор);
Метод СрезПервых действует аналогично методу СрезПоследних, за исключением того, что он выбирает срез наиболее ранних записей по отношению к заданной дате или моменту времени. Для извлечения данных из регистров сведений могут также применяться запросы, описанные в конце этой главы.
Курс
| EUR
| | | | 30,8717
| | | GBR
| | | | 49,4375
| | | USD
| | | | 31,4568
| | | рубль
| | | | 1
|
Чтобы получить курс конкретной валюты, можно указать условие получения таблицы среза последних записей:
| ВЫБРАТЬ Период, Валюта, Курс
| |
| ИЗ РегистрСведений.КурсыВалют. |
| 01.08.2002
| | | EUR
| | | | 30,8717
|
| 01.01.2002
| | | EUR
| | | | 26,6172
|
Менеджер регистра сведений
Объект РегистрСведенийМенеджер предоставляет доступ к действиям с конкретным регистром. Этот объект позволяет открыть нужную выборку с помощью методов Выбрать и ВыбратьПоРегистратору, создать новый набор записей, создать менеджер записи и ключ записи, через него можно получить форму и макет регистра сведений.
Менеджер регистров сведений
Объект РегистрыСведенийМенеджер через свои свойства предоставляет доступ к объектам РегистрСведенийМенеджер. Свойство глобального контекста РегистрыСведений является объектом именно этого типа, например:
РегКурсы= РегистрыСведений.КурсыВалют;
ОтвСотр = РегистрыСведений.ОтветственныеСотрудники;
Объект РегистрыСведенийМенеджер является коллекцией, и для него доступен обход элементов с помощью конструкции «Для Каждого».
Менеджер записи регистра сведений
Для операций над одной записью регистра сведений применяется объект РегистрСведенийМенеджерЗаписи. Этот объект существует только у независимого регистра сведений, т.е. не подчиненного регистратору.
Например, следующая программа удаляет безвозвратно все записи из регистра сведений КурсыВалютРасчетаЗарплаты:
| Выборка = РегистрыСведений. КурсыВалютРасчетаЗарплаты.Выбрать();
| |
| Пока Выборка.Следующий() Цикл
| |
| МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи();
| |
| МенеджерЗаписи.Удалить();
| |
Модуль набора записей
У набора записей регистра есть собственный модуль, который открывается из окна редактирования свойств регистра. Можно считать, что модуль набора записей является аналогом модуля любого другого прикладного объекта, например, модуля справочника или модуля документа.
В модуле набора записей регистра могут располагаться процедуры-обработчики событий ПередЗаписью и ПриЗаписи:
МоментВремени
| Содержит момент времени записи регистра.
| |
Набор записей регистра сведений
Набор записей позволяет оперировать сразу несколькими записями регистра. Набор записей можно целиком прочитать из базы данных, добавить в него записи или изменить их, целиком записать в базу данных. Это основной способ добавления и редактирования записей регистра сведений.
У документов есть свойство Движения, которое предоставляет доступ к наборам записей этого документа по каждому регистру. Как правило, при проведении документов сначала добавляются записи в набор, а затем набор записывается в базу данных. Можно создать новый набор записей из объекта РегистрСведенийМенеджер, если вызвать его метод СоздатьНаборЗаписей. Пока отбор не установлен, набор записей будет распространяться на весь регистр.
Например:
РегКурсы = РегистрыСведений.КурсыВалют;
Отбор = Новый Структура("Валюта",ВыбВалюта);
СтруктураРесурсы = РегКурсы.Получить(ВыбДата, Отбор);
Сообщить(СтруктураРесурсы.Курс);
Сообщить(СтруктураРесурсы.Кратность);
Если записи с такой комбинацией измерений и периода (для периодических регистров) не найдено, то в элементах структуры будут пустые значения.
Следующие методы применимы только для периодического регистра сведений:
Метод ПолучитьПоследнее имеет следующий синтаксис:
ПолучитьПоследнее (<Конец периода>, <структура>)
Если он не находит запись в регистре по данной комбинации измерений точно на заданный период, то возвращается ближайшая более ранняя запись,
РегКурсы= РегистрыСведений.КурсыВалют;
Отбор = Новый Структура("Валюта",ВыбВалюта);
СтруктураРесурсы = РегКурсы.ПолучитьПоследнее(ВыбДата, Отбор);
Сообщить(СтруктураРесурсы.Курс);
Сообщить(СтруктураРесурсы.Кратность);
Метод ПолучитьПервое действует аналогично методу ПолучитьПоследнее, за исключением того, что он получает наиболее ранние значения ресурсов по отношению к заданной дате или моменту времени.
Метод СрезПоследних позволяет получить наиболее поздние записи регистра, соответствующие указанным измерениям, например, можно получить курсы всех валют на заданную дату. Метод возвращает таблицу значений с найденными записями. Структура таблицы значений совпадает со структурой регистра сведений:
РегКурсы = РегистрыСведений.КурсыВалют;
тзКурсыВалютНаДату = РегКурсы.СрезПоследних(ВыбДата);
Метод СрезПоследних позволяет задать отбор по измерениям регистра с помощью второго параметра, имеющего тип Структура. В переданной структуре должны содержаться те измерения, по которым должны быть отфильтрованы записи. В каждом элементе структуры задается имя и значение отбора. Например, следующая программа получает последние актуальные цены по товарам заданного конкурента:
Выборка= РегистрыСведений.КурсыВалют.Выбрать();
Пока Выборка.Следующий() Цикл
| Сообщить(СокрЛП(Выборка.Валюта) + " " +
| |
| СокрЛП(Выборка.Период) + " " +
| | КонецЦикла;
Выборку можно ограничить только нужными записями, используя параметры метода Выбрать.
Синтаксис метода Выбрать следующий:
НомерСтроки
| Содержит номер строки, определяемый как порядковый номер записи в наборе записей.
| |
Оптовая цена
| | Монитор 19"
| | | | 340,00
| | | |
| |
| | | Монитор LCD 22"
| | | |
| | | | 1999,00
| |
| | | Мышь 2х кноп.
| |
| | | | 1,70
| | | | 1.50
|
| Необходимо учитывать одно важное свойство регистра сведений: каждая запись однозначно определяется комбинацией измерений. Если в регистр добавить запись с точно такими же измерениями, как уже существующая, то новая запись перезапишет прежнюю, или будет выдано сообщение об ошибке, в зависимости от варианта записи.
| |
Основная таблица
| Предоставляет доступ ко всем записям регистра.
| |
Основная таблица регистра сведений
Продемонстрируем, как с помощью запросов можно получать информацию из регистра КурсыВалют, который имеет одно ведущее измерение Валюта, два ресурса ? Курс и Кратность и реквизит Источник, показывающий, откуда взялась информация о курсе. Этот регистр является периодическим с периодом День, значит, в регистре будет храниться история изменения курсов валют за каждый день.
Самый простой случай ? получение всех записей регистра КурсыВалют:
| ВЫБРАТЬ* ИЗ РегистрСведений.КурсыВалют
| |
Ниже приведен
ПередЗаписью
Это событие возникает перед записью набора регистра сведений. В процедуре-обработчике можно проверить набор записей на наличие ошибок и отказаться от записи.
Период
| Содержит период, к которому относится запись регистра.Используется только для периодических регистров.
| |
Периодичность
| | | В пределах дня
| |
|
| Таблица записей этого регистра будет такова:
| |
| | | В пределах дня
| |
| Следующий запрос покажет только нужные поля из этого регистра:
| ВЫБРАТЬ Период, Организация,
| |
| Физлицо, Должность, Состояние
| |
| ИЗ РегистрСведений.СведенияОСотрудниках
| |
Создадим новый пустой набор
//создадимновый пустой набор записей, действующий на весь регистр
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
//установим отбор по дате и валюте
//если этого не сделать, то весь регистр
//будет переписан новым набором
Набор.Отбор.Валюта.Значение = ВыбВалюта;
Набор.Отбор.Период.Значение = ВыбДата;
Набор.Отбор.Валюта.Использование = Истина;
Набор.Отбор.Период.Использование = Истина;
//добавим запись в набор (не в базу данных)
НовЗапись = Набор.Добавить();
НовЗапись.Валюта = ВыбВалюта;
НовЗапись.Период = ВыбДата;
НовЗапись.Курс = НовыйКурс;
//запишем набор в базу данных
//записи по заданному отбору будут переписаны
Набор.Записать(Истина);
Набор.Прочитать();
тзЗаписи = Набор.Выгрузить();
Набор.Загрузить(тзЗаписи);
Набор.Записать();
При выгрузке структура таблицы значений полностью соответствует структуре набора. При загрузке загружаются только те колонки, имена которых в наборе и таблице значений совпадают. Можно выгружать в массив и загружать из массива только одну колонку набора записей, для чего предназначены методы ВыгрузитьКолонку и ЗагрузитьКолонку. Выгружаются и загружаются записи, имеющие тот же индекс, что и элементы массива (индексация записей набора и элементов массива начинается с 0).
МассивКурсов = Набор.ВыгрузитьКолонку("Курс");
Набор.ЗагрузитьКолонку(МассивКурсов,"Курс");
Для удаления записей из набора существует два метода: Удалить и Очистить. Первый метод удаляет запись с заданным индексом, хотя в качестве параметра можно передавать и саму запись (объект типа РегистрСведенийЗапись). Второй метод полностью очищает набор, удаляя все записи. Обратите внимание, что записи удаляются из набора, а не из регистра сведений.
Нач = Новый МоментВремени(ВыбДатаВремяНачала);
Кон = Новый Граница(ВыбДатаВремяОкончания,ВидГраницы.Включая);
Отбор = Новый Структура("Валюта", ВыбВалюта);
Выборка = РегистрыСведений.КурсыВалют.Выбрать(Нач,Кон,Отбор);
Пока Выборка.Следующий() Цикл
| Сообщить(СокрЛП(Выборка.Валюта) + " " +
|
| СокрЛП(Выборка.Период) + " " +
| КонецЦикла;
непериодического регистра сведений понимаются значения
РегКурсы= РегистрыСведений.КурсыВалют;
Выборка = РегКурсы.Выбрать();
МенеджерЗаписи = РегКурсы.СоздатьМенеджерЗаписи();
Набор = РегКурсы.СоздатьНаборЗаписей();
ФормаСписка = РегКурсы.ПолучитьФормуСписка();
ОсновнойМакет = РегКурсы.ПолучитьМакет("Основной");
Объект РегистрСведенийМенеджер позволяет обращаться к «итогам» регистра. Под «итогами» непериодического регистра сведений понимаются значения ресурсов по заданным измерениям, а для периодических регистров сведений можно получить первое и последнее значение по указанным измерениям, а также срез первых и срез последних записей.
Для обращения к «итогам» регистра сведений применяются методы Получить, ПолучитьПервое и ПолучитьПоследнее, СрезПервых и СрезПоследних, а также запросы (см. главу Запросы). При получении среза первых и среза последних записей, как правило, не указывается одно или несколько измерений.
Метод Получить имеет два варианта синтаксиса:
ПриЗаписи
Данное событие возникает после записи набора в информационную базу, но до окончания транзакции. В обработчике события также можно отказаться от записи набора.
Регистратор
| Содержит ссылку на документ-регистратор движения.
| |
Приведем пример обращения к одному из регистров, записываемых регистраторами (документами).
Возьмем регистр СведенияОСотрудниках и рассмотрим
РегистрСведенийКлючЗаписи
| Этот объект нужен для идентификации записи. Он используется для позиционирования в списке на конкретной записи регистра.
| |
| Объекты для работы с регистрами сведений взаимосвязаны друг с другом. Из одних объектов с помощью свойств и методов можно получить другие объекты.
| |
| Графически эту взаимосвязь можно представить следующим образом:
| |
| Далее более подробно описаны типичные действия над регистром сведений с помощью этих объектов. |
РегистрСведенийМенеджер
| Операции над регистром сведений, получение выборки, создание новых наборов записей, доступ к формам и макетам регистра сведений.
| |
РегистрСведенийМенеджерЗаписи
| Позволяет модифицировать запись регистра сведений в базе данных, считать ее из базы данных, отредактировать, записать или удалить.
| |
РегистрСведенийНаборЗаписей
| Операции над несколькими записями, их одновременное считывание и запись в базу данных.
| |
РегистрСведенийСписок
| Обеспечивает управление списком записей регистра сведений в форме в элементе управления ТабличноеПоле.
| |
РегистрСведенийВыборка
| Обеспечивает обход записей регистра сведений (перебор).
| |
РегистрСведенийЗапись
| Доступ к одной записи набора регистра сведений. Объект возвращается методами других объектов, например, методом Добавить объекта РегистрСведенийНаборЗаписей.
| |
РегистрыСведенийМенеджер
| Предоставляет доступ к объектам РегистрСведенийМенеджер через свои свойства. Свойство глобального контекста РегистрыСведений является объектом именно этого типа.
| |
Реквизиты регистра сведений
При создании регистра сведений, кроме измерений и ресурсов, можно определить реквизиты регистра. Их можно представить как дополнительные колонки в таблице записей регистра. Реквизиты содержат сопроводительную информацию для каждой записи регистра.
Например, в регистр сведений КурсыВалют можно добавить реквизит Источник, который будет показывать, откуда была получена информация о курсе валюты. Разработчик может использовать реквизиты для отбора нужных записей при обходе выборки или при использовании запроса.
Следующий пример выбирает все записи регистра, у которых реквизит равен определенному значению:
Выборка= РегистрыСведений.КурсыВалют.Выбрать();
Пока Выборка.Следующий() Цикл
| Если Выборка.Источник = ЗаданныйИсточник Тогда
| | КонецЦикла;
Режим записи
При редактировании свойств регистра в Конфигураторе можно указать режим записи: «Независимый» и «Подчинение регистратору», что определяет, как будут вноситься записи в регистр: вручную или документами.
Под регистратором понимается документ, которому принадлежат движения по этому регистру. Обычно при проведении документа формируются движения по регистру, но это необязательно. Движения могут быть сформированы из любого места программы, лишь бы они были привязаны к документу-регистратору.
СрезПервых
(&ВыбДата, Валюта=&ВыбВалюта);
СрезПоследних
(&ВыбДата, Валюта=&ВыбВалюта);
Условие
| Указывается условие на языке запросов. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние. Условие будет применяться к исходным записям, а не к уже отобранным.
| |
Следующий запрос получает последние актуальные курсы всех валют на заданную дату (или на момент времени):
| ИЗ РегистрСведений.КурсыВалют. |
Виртуальная таблица получения среза первых записей
Виртуальная таблица получения среза первых записей полностью аналогична по структуре и параметрам таблице для среза последних. Например, следующий запрос покажет первый введенный в систему курс для заданной валюты:
| ВЫБРАТЬПериод, Валюта, Курс
| |
| ИЗ РегистрСведений. КурсыВалют. |
Виртуальная таблица получения среза последних записей
Если мы вернемся к регистру сведений КурсыВалют и проанализируем, для чего обычно он используется, то выясним, что, как правило, требуется узнать последние актуальные курсы валют на рабочую дату или, в общем случае, на произвольную дату. Причем чаще требуется узнать курс какой-то одной валюты.
Для получения данной информации служит виртуальная таблица среза последних записей регистра сведений. По структуре она полностью идентична основной таблице, рассмотренной выше. Особенности заключаются в ее назначении и параметрах вызова:
Виртуальные таблицы
| Предназначены для получения значений ресурсов регистра сведений на заданный момент по указанным измерениям. Виртуальные таблицы могут быть получены с использованием специальных ключевых слов, например, СрезПервых, СрезПоследних и т.д. При этом можно указать и параметры получаемой виртуальной таблицы ? момент времени, измерения и ресурсы. |
Для наглядного представления регистров сведений
| Для наглядного представления регистров сведений с тремя измерениями, подошел бы куб или таблица с вложенными группировками. Примером такого регистра может служить регистр сведений МестаРаботыСотрудников с измерениями Сотрудник, Органи-зация, Подразделение и ресурсами Должность, ДатаПриема.
|
| Структура регистра сведений МестаРаботыСотрудников такова:
|
Через набор записей можно обращаться к уже существующим записям регистра сведений. Для этого нужно установить свойство Отбор и прочитать записи из базы данных. Свойство Отбор является объектом типа Отбор, свойства которого совпадают с именами измерений регистра сведений и являются объектами типа ЭлементОтбора.
Выборка из регистра сведений
Объект РегистрСведенийВыборка предназначен для динамического обхода записей регистра сведений. При этом записи считываются из базы данных порциями по мере выборки. Такая схема рационально использует память и позволяет перебрать множество записей регистра,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|