Практическая работа №10. Регистр сведений 
";


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Практическая работа №10. Регистр сведений



Бывают ситуации, когда хранить информацию в справочнике неудобно. Например, если мы покупаем товар у одного и того же поставщика, то, скорее всего, цена на этот товар будет одной и той же (будет меняться достаточно редко). Было бы удобно, если бы имелась возможность эту цену хранить и автоматически подставлять в документы. Для решения этой задачи необходимо для каждого поставщика для каждого купленного у него товара хранить цену. Задача сильно усложниться, если мы решим хранить эту цену еще и в рамках договора. С одной стороны, это информация справочного характера, т.е. имеет смысл хранить ее в справочнике. С другой стороны, реализовать ее хранение достаточно сложно, причем далеко не все возможности, предоставляемые системой для справочника, нам в этом случае понадобятся. Кроме того, желательно иметь возможность быстро найти нужное нам значение. Для решения подобного рода задач предназначен специальный объект Регистр сведений.

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

Рисунок 10.1.

Создание нового регистра аналогично созданию нового документа или справочника (Рис. 10.1). Кроме того, как только мы стали использовать механизм подсистем для построения интерфейса, необходимо при создании объекта сразу же предусмотреть возможность работы пользователя с этим объектом, т.е. отобразить его на интерфейсе, для чего включить в соответствующую подсистему (Рис. 10.2).

Рисунок 10.2.

Структуру регистра можно задать на закладке Данные. (Рис. 10.3) То, что мы собственно храним в регистре, находится в ресурсе, а те разрезы, в которых нас это информация интересует, находятся в измерениях. В нашем случае необходимо хранить цену для каждого товара, купленного по каждому договору и каждого поставщика, т.е. цена в разрезе поставщиков, договоров и номенклатуры. Следовательно, цена должна быть ресурсом, а контрагент, договор и номенклатура – измерениями. В этом случае система будет контролировать, что для каждого уникального набора значений измерений может быть только одно значение ресурса, т.е. для одного и того же товара по одному договору для одного поставщика может быть только одна цена. Естественно, что необходимо и для измерений и для ресурсов указать соответствующий тип данных.

Рисунок 10.3.

Информацию в регистр пользователь может внести самостоятельно в режиме «1С:Предприятие», используя соответствующую форму списка (Рис. 10.4).

Рисунок 10.4.

Для того, чтобы цена автоматически подставлялась в документе «Приходная накладная», необходимо задействовать обработчик ТоварыНоменклатураПриИзменении. Чтобы получить нужную нам цену, необходимо из всей хранящейся в регистре информации извлечь только ту, которая нам нужна в данный момент, т.е. каким-то образом ее отфильтровать. Сделать это можно с помощью специального объекта Структура. Далее, применив такой фильтр к нашему регистру, можно будет получить интересующую нас цену.

Ниже приведен соответствующий программный код:

&НаСервере

Функция ПолучитьЦену(НоменклатураДокумента)

СтруктураОтбора = Новый Структура;

СтруктураОтбора.Вставить("Контрагент ",Объект.Контрагент);

СтруктураОтбора.Вставить("Договор",Объект.Договор);

СтруктураОтбора.Вставить("Номенклатура", НоменклатураДокумента);

 

РезультатОтбора = РегистрыСведений.ЦеныПоставщиков.Получить(СтруктураОтбора);

 

Возврат РезультатОтбора.Цена;

КонецФункции

&НаКлиенте

Процедура ТоварыНоменклатураСтрокПриИзменении(Элемент)

СтрокаРасчета = Элементы.Товары.ТекущиеДанные;

СтрокаРасчета.Цена = ПолучитьЦену(СтрокаРасчета.Номенклатура);

ТоварыЦенаПриИзменении(Элемент)

КонецПроцедуры

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

Рисунок 10.5.

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

Рисунок. 10.6.

Сама структура регистра будет состоять из 1 измерения и 1 ресурса (Рис. 10.7). Поскольку наш регистр является периодическим, то наряду с существующими измерениями добавляется еще одно Период (Рис. 10.8), и система предоставляет возможность быстро извлечь интересующую нас информацию на произвольный момент времени.

Рисунок 10.7.

Рисунок 10.8.

Еще одна задача, которую позволяет решить регистр сведений, это взаимосвязь хранимой информации с документами. Например, если мы хотим хранить в системе информацию о том, в каком подразделении работает сотрудник и какой у него оклад, причем, назначение сотрудника в подразделение и установка его ставки оформляется соответствующим кадровым приказом. С одной стороны, если мы сделаем документ и заполним реквизиты справочника, то вся эта информация в систему будет занесена. Однако, в том случае, когда мы удаляем соответствующий документ, информация в справочнике остается, что уже не соответствует положению вещей. Для решения подобного рода задач существует механизм проведения документов. Этот механизм позволяет установить взаимосвязь между данными регистра и документом. Происходит это следующим образом: для записанного документа может быть присвоен статус «Проведен» (определяется значением системного реквизита Проведен). Изменение статуса документа является событием, для которого есть соответствующий обработчик проведения, где можно описать, какие записи в какие регистры формирует данный документ. В том случае, если этот статус снимается (в т.ч. при пометке на удаление), то из регистров автоматически удаляются записи, связанные с этим документом. Статус документа отображается соответствующей пиктограмкой и может быть изменен пользователем.

Для решения этой задачи, создадим новую подсистему «Кадры», которая будет содержать данные, необходимые для ведения кадрового учета, после чего потребуется создать регистр сведений «СведенияОСотрудниках». Будем считать, что в нашей организации нет совместителей, т.е. сотрудник может работать только в одном подразделении и получать там какой-то оклад. Структура регистра сведений должна быть следующей: измерение Сотрудник и ресурсы Подразделение и Оклад. При этом, следует обратить внимание на то, что в ресурсе может храниться значение ссылочного типа, т.е. в нашем случае ссылка на справочник Подразделения (Рис. 10.9).

Рисунок 10.9.

Далее, наверное, наши сотрудники со временем могут переходить из подразделения в подразделения или получать другой оклад, поэтому сделаем регистр периодическим, с периодичностью месяц. Далее для того, чтобы в наш регистр попадали данные из документа необходимо указать способ записи «Подчинение регистратору» (Рис. 10.10). В этом случае у регистра появится дополнительное поле «Регистратор», в котором будет указан документ, сформировавший эти записи.

Рисунок 10.10.

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

Создадим документ Кадровый приказ. Данный документ будет отражать кадровые изменения в подразделении, поэтому будет иметь реквизит «Подразделение» и табличную часть, с указанием сотрудника и его оклада (Рис. 10.11).

Рисунок 10.11.

Чтобы документ формировал записи в регистр необходимо на закладке Движения настроить следующие свойства (Рис. 10.12):

Проведение – разрешить (для данного документа может быть статус «проведен»)

Удалять движения – автоматически (при отмене проведения данного документа, сформированные им записи в регистрах будут удалены)

Указать те регистры, в которые будут сформированы записи.

Рисунок 10.12.

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

Рисунок 10.13.

В результате работы конструктора в модуле документа будет создана процедура обработчик события проведение.

Процедура ОбработкаПроведения(Отказ, Режим)

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

// Данный фрагмент построен конструктором.

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

Движения.СведенияОСотрудниках.Записывать = Истина;

Для Каждого ТекСтрокаСостав Из Состав Цикл

Движение = Движения.СведенияОСотрудниках.Добавить();

Движение.Период = Дата;

Движение.Сотрудник = ТекСтрокаСостав.Сотрудник;

Движение.Подразделение = Подразделение;

Движение.Оклад = ТекСтрокаСостав.Оклад;

КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

КонецПроцедуры

В режиме «1С:Предприятие» у пользователя появляется возможность провести или снять с проведения проведенный документ (Рис. 10.14).

Рисунок 10.14.

Обратите внимание, по умолчанию наш регистр не отобразился автоматически в интерфейсе. Чтобы посмотреть результат наших действий, самостоятельно добавьте регистр в интерфейс (Рис. 10.15).

Рисунок 10.15.


 



Поделиться:


Последнее изменение этой страницы: 2021-03-09; просмотров: 531; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.15.70.191 (0.008 с.)