Приветствую Вас ГостьВторник, 14.05.2024, 04:06

Каталог статей


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

Взаимодействие объектов встроенного языка для работы с регистрами сведений

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

РегистрСведенийЗапись.<имя>. Предоставляет доступ к записи регистра сведений. Объект не создается непосредственно, а предоставляется другими объектами, связанными с регистром сведений. Например, данный объект представляет записи регистра в наборе записей.

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

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

Измерения

Измерения, к значениям которых необходим быстрый доступ (например, при реализации отборов), следует располагать первыми, далее – в порядке убывания «популярности в отборах». Таким образом будет обеспечиваться возможность эффективного применения индексов при реализации задач чтения информации из таблицы регистра.

Также необходимо иметь в виду, что, например, SQL Server накладывает определенное ограничение – не более 16 полей в индексе. Поэтому работа с регистрами, имеющими очень большое количество измерений, может быть неэффективна по скорости из-за невозможности использования индексов.

Если в регистре сведений есть набор данных для разных измерений, и в конфигураторе попытаться удалить измерение, то система выдаст ошибку, что записи стали не уникальными.

Свойства:

  • Ведущее

Свойство Ведущее имеет смысл использовать лишь тогда, когда измерение имеет тип ссылки на объект базы данных. Установка свойства Ведущее будет говорить о том, что запись регистра сведений представляет интерес, пока существует тот объект, ссылка на который выбрана в качестве значения этого измерения в этой записи. При удалении объекта все записи регистра сведений по этому объекту тоже будут автоматически удалены.

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

  • Основной отбор

Если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование "Основной отбор по периоду" включает основной отбор для период для периодических регистров.

  • Запрет незаполненных значений

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

В отношении поля Период для периодических регистров сведений и в отношении поля Регистратор регистра сведений с подчиненным режимом записи подобная проверка выполняется всегда.

Периодичность

Если записи подчинены регистратору, то у регистра добавляется служебное поле "Регистратор", в которое записывается ссылуа на документ, который совершил проводки. Так же добавляются поля "Номер строки" и "Активность".

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

Для того чтобы поле Регистратор стало ключевым, необходимо для такого регистра сведений (с режимом записи Подчинение регистратору) установить для свойства Периодичность значение "По позиции регистратора".

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

Еще одной особенностью регистра, подчиненного регистратору является то, что появляется служебное поле "Активно", которое можно менять. Снять или установить активность можно только для всех записей набора записей, подчиненных некоему регистратору. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени.

Индексы

Непериодический регистр сведений

Измерение1 + [Измерение2 +...]

Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании.

Этот индекс создается, если есть хоть одно измерение регистра.

ИзмерениеN + Измерение1 + [Измерение2 +...]

Индекс, включающий все измерения. Первое поле – ИзмерениеN, затем все остальные измерения в том порядке, в котором они заданы при конфигурировании.

Этот индекс создается, если:

  • для измерения измерениеN задано свойство Индексировать или свойство Ведущее;
  • измерениеN – не первое измерение;
  • измерениеN – не единственное измерение.

Реквизит + Измерение1 + [Измерение2 +...]

Индекс, в котором первое поле – Реквизит, затем все измерения в том порядке, в котором они заданы при конфигурировании.

Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать.

Ресурс + Измерение1 + [Измерение2 +...]

Индекс, в котором первое поле – Ресурс, затем все измерения в том порядке, в котором они заданы при конфигурировании.

Этот индекс создается, если для ресурса свойство Индексировать установлено в значение Индексировать.

В данный индекс включается поле Ресурс, и затем все измерения в том порядке, в котором они заданы в составе регистра как объекта конфигурации.

Периодический регистр сведений

Период + [Измерение1 + ...]

Этот индекс создается всегда для любого периодического регистра сведений.

Измерение1 + [Измерение2 +...] + Период

Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании, и поле Период.

Этот индекс создается, если есть хоть одно измерение регистра.

ИзмерениеN + Период + Измерение1 + [Измерение2 +...]

Индекс, включающий поле Период и все измерения. Первое поле – ИзмерениеN, затем поле Период, затем все остальные измерения в том порядке, в котором они заданы при конфигурировании.

Этот индекс создается, если:

  • для измерения измерениеN свойство Индексировать установлено в значение Индексировать;
  • измерениеN – не единственное измерение.

Дополнительный индекс для регистра сведений, подчиненного регистратору

Регистратор + НомерСтроки

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

Регистр сведений с периодичностью «По позиции регистратора»

Период + Регистратор + НомерСтроки

Регистратор + НомерСтроки

Эти индексы создаются всегда для любого регистра сведений с периодичностью По позиции регистратора.

Измерение1 + [Измерение2 + ...] + Период + Регистратор + НомерСтроки

Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании, поле Период, поле Регистратор и поле НомерСтроки.

Этот индекс создается, если есть хоть одно измерение регистра.

Измерение + Период + Регистратор + НомерСтроки

Этот индекс создается, если для измерения свойство Индексировать установлено в значение Индексировать.

Реквизит + Период + Регистратор + НомерСтроки

Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать.

Ресурс + Период + Регистратор + НомерСтроки

Этот индекс создается, если для ресурса свойство Индексировать установлено в значение Индексировать.

Последовательность событий

Последовательность событий при сохранении данных из формы записи регистра сведений (записать и закрыть)

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

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

Последовательность событий при сохранении данных из формы набора записей регистра сведений (записать и закрыть)

МоментВремени и Граница

Момент времени - комбинация даты и ссылки на документ. Позволяет разделить и упорядочить документы в пределах одной секунды, выстраивая все документы в однозначную последовательность. Момент времени имеет один метод – Сравнить(), при помощи которого возможно сравнение двух моментов времени между собой.

МоментВремени() - это момент непосредственно ПЕРЕД позицией документа (аналог РассчитатьРегистрыНа(ТекущийДокумент() в 7-рке), а если необходимо получить момент непосредственно после позиции документа, то используйте объект Граница.

МоментСразуПослеДокумента = Новый Граница(ДокументСсылка,ВидГраницы.Включая);

Момент = Новый МоментВремени(ТекДокумент.Дата, ТекДокумент.Ссылка); // создает объект момент времени по ссылке и дате документа.

Момент времени и Границу можно передавать в качестве входного параметра виртуальных таблиц регистров сведений

Шаблоны использования

  • // Пример: получить текущую цену из периодического регистра сведений "Цены".

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

  •     // Пример: Получить начальную цену из периодического регистра сведений Цены.

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

  •     // Пример: активизировать требуемую строку списка регистра сведений.

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

  •     // Пример: показать номенклатуру, цена на которую была установлена в заданную дату и время.

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

  •     // Пример: добавить новое значение цены в регистр "Цены".

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

ВАЖНО! Так как при работе с менеджером записи система по умолчанию работает через набор записей, то доступна возможность управления процессом записи, например через событие "ПередЗаписью". Однако надо иметь ввиду, что если после чтения записи изменяются значения её ключевых свойств (период или измерение), то при записи происходит 2 записи набора записей (см картинку выше):

  1. запись пустого набора для старого значения ключевых полей
  2. запись набора с новыми данными.

Соответственно событие "ПередЗаписью" срабатывает дважды и это надо учитывать.

  •     // Добавить запись через набор записей

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

  • // Пример, получить значение ресурса по набору измерений. Для метода Получить() обязательна передача параметра, содержащего структуру отбора значений по всем измерениям.

    СтруктураОтбора = Новый Структура;
    СтруктураОтбора.Вставить("ФизическоеЛицо", ПроверяемоеЛицо);
    СтруктураОтбора.Вставить("Подразделение", ВыбранноеПодразделение);
    СтруктураРесурсов = РегистрыСведений.Сотрудники.Получить(СтруктураОтбора);
    
    Должность = СтруктураРесурсов.Должность;

  •     // Пример: удалить все записи регистра сведений за текущий месяц.

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

  •     // Пример: удалить все записи регистра сведений через выборку по отбору.    

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

  • // Пример получения записей регистра сведений, исключая границы интервала

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

  •     // Пример: удалить все записи (полностью очистить регистр).

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

  •     // Пример: показать изменение цен на элемент номенклатуры в течение года.

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

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

Что лучше? Создать несколько регистров с большим количеством ресурсов или, наоборот, создать много регистров, но с меньшим количеством ресурсов?

При ответе на это вопрос надо учитывать:

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

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

Учет потенциальных модификаций состава регистра. Если в перспективе может потребоваться добавить новые измерения и весь список измерений можно разбить на логические группы, то предпочтительнее создать несколько регистров, которые содержат отдельный логический набор измерений.

Время получения данных, необходимых для работы механизмов решения. Например, при работе некоторого механизма важно получать данные объекта и данные, связанные с данным объектом. Очевидно, что получение этих связанных данных из нескольких ресурсов одного регистра (одной таблицы) будет происходить в общем случае быстрее, нежели получение этих данных из нескольких регистров (нескольких таблиц).

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

«Слабое звено». Если данные одного из ресурсов нужно модифицировать очень часто, то объем базы будет расти существеннее, если в составе регистра много ресурсов. Особенно, если какой-нибудь из ресурсов будет являться хранилищем значений, в котором будет храниться картинка или бинарные данные. Такие данные вообще целесообразнее выделять в отдельный регистр.

Эффективность применения индексов.  Расстановки измерений регистра сведений имеет важное значение. Измерения, к значениям которых необходим быстрый доступ (например, при реализации отборов), следует располагать первыми, далее – в порядке убывания «популярности в отборах». Таким образом будет обеспечиваться возможность эффективного применения индексов при реализации задач чтения информации из таблицы регистра.

!

Пример проектирования регистра сведений можно посмотреть здесь https://career.i-neti.ru/struktura-registra-svedeniy-1s/

Категория: Регистры | Добавил: leshic (31.01.2022)
Просмотров: 1782 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0