Взаимосвязь регистров

Добавил admin | Взаимосвязь регистров | Вторник 6 октября 2009 22:22

Для работы с регистром накопления средствами встроенного языка применяются следующие объекты:

РегистрыНакопленияМенеджер

Предоставляет доступ к объектам РегистрНакопленияМенеджер через свои свойства. Свойство глобального контекста РегистрыНакопления является объектом именно этого типа.

РегистрНакопленияМенеджер

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

РегистрНакопленияНаборЗаписей

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

РегистрНакопленияЗапись

Обеспечивает доступ к одной записи набора регистра накопления. Этот объект возвращается методами других объектов, например, методом Добавить у объекта РегистрНакопленияНаборЗаписей.

РегистрНакопленияВыборка

С помощью этого объекта можно организовать обход записей регистра накопления (перебор).

РегистрНакопленияСписок

Обеспечивает управление списком записей регистра накопления в форме в элементе управления ТабличноеПоле.

РегистрНакопленияКлючЗаписи

Этот объект нужен для идентификации записи в списке. Он используется для позиционирования в списке на конкретной записи регистра.

Объекты для работы с регистрами накопления взаимосвязаны друг с другом. Из одних объектов с помощью свойств и методов можно получить другие объекты. Графически эту взаимосвязь можно представить следующим образом:

Далее более подробно описаны типичные действия над регистром накопления с помощью этих объектов.

Менеджер регистров накопления

Объект РегистрыНакопленияМенеджер через свои свойства предоставляет доступ к объектам РегистрНакопленияМенеджер. Свойство глобального контекста РегистрыНакопления является объектом именно этого типа, например:

РегОстатки = РегистрыНакопления.ОстаткиТоваров;
РегПродажи = РегистрыНакопления.Продажи;

Менеджер регистра накопления

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

Примеры:

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

Объект РегистрНакопленияМенеджер позволяет обращаться к итогам регистра. Под итогами регистра накопления понимаются сумма значений ресурсов по заданным измерениям. Для обращения к итогами обычно применяются методы Обороты и Остатки, а также запросы. При получении итогов можно не указывать одно или несколько измерений, тогда будут получены сводные итоги по ресурсам с учетом только указанных измерений.

Метод Остатки применим только для регистра остатков и не применим для регистра оборотов. Метод Обороты применим как для регистра оборотов, так и для регистра остатков.

Метод Остатки имеет следующий синтаксис:

Остатки(<Момент времени>, <Отбор>, <Измеренмя>, <Ресурсы>)

Ниже описаны параметры метода Остатки:

Момент времени

Параметр может содержать дату, момент времени или объект типа Граница. Он указывает, на какой момент времени нужно получить остатки регистра.

Отбор

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

Измерения

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

Ресурсы

Содержит список ресурсов, для которых надо получить остатки. Если не указано, то будут рассчитаны остатки по всем ресурсам. Метод Остатки возвращает таблицу значений, содержащую колонки с измерениями, указанными в параметре Измерения, и колонки с ресурсами, указанными в параметре Ресурсы.

Следующий пример извлекает из регистра СтоимостнойУчетНоменклатуры количество и стоимость выбранного товара:

РегМенеджер = РегистрыНакопления.СтоимостнойУчетНоменклатуры;
Отбор = Новый Структура("Номенклатура",ВыбТовар);


тзОстатки = РегМенеджер.Остатки(,Отбор);


Если тзОстатки.Количество() > 0 Тогда


	КоличествоТовара = тзОстатки[0].Количество;


	СтоимостьТовара = тзОстатки[0].Сумма;


КонецЕсли;
 

Метод Обороты имеет следующий синтаксис:

Обороты(<Начало периода>, <Конец периода>,

<Отбор>, <Измерения>, <Ресурсы>)

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

//обращение к регистру остатков

Отбор = Новый Структура("Номенклатура",ВыбТовар);


тзОбороты = РегистрыНакопления.УчетНоменклатуры.Обороты(,,Отбор);


Если тзОбороты.Количество() > 0 Тогда


	ПриходТовара = тзОбороты[0] .КоличествоПриход;


	РасходТовара = тзОбороты[0].КоличествоРасход;


КонецЕсли;


 


//обращение к регистру оборотов


Отбор = Новый Структура("Номенклатура",ВыбТовар);


тзОбороты = РегистрыНакопления.Продажи.Обороты(,,Отбор);


Если тзОбороты.Количество() > 0 Тогда


	ОборотТовара = тзОбороты[0].Сумма;


КонецЕсли;

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

ПересчитатьИтоги

Позволяет осуществить полный пересчет итогов регистра накопления.

ПолучитьПериодРассчитанныхИтогов

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

УстановитьПериодРассчитанныхИтогов

Устанавливает месяц, на который рассчитывается итоги. Обратите внимание, что доступ к итогам регистра возможен всегда. Граница рассчитанных итогов влияет лишь на производительность получения итогов по данному регистру. Актуальность итогов регистров можно также установить интерактивно, используя пункт меню «Операции -> Управление итогами»:

Набор записей регистра накопления

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

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

Можно создать новый набор записей из объекта РегистрНакопленияМенеджер, если вызвать его метод СоздатьНаборЗаписей, например:



Набор = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();


Набор.Отбор.Регистратор.Значение = ВыбДок;


Движ = Набор.Добавить();


Движ.Регистратор = ВыбЦок;


Движ.Номенклатура = ВыбТовар;


Движ.Контрагент = ВыбКонтрагент;


Движ.Период = РабочаяДата;


Движ.Количество = Количество;


Движ.Сумма = Сумма;


Набор.Записать(Ложь); //добавить к набору записей по документу


 

Внимание! При записи набора методом Записать с параметром Истина сначала удаляются все записи с заданным отбором, а затем на их место записываются новые. Если передать параметр Ложь, то запись будет добавлена к уже существующим. Напомним, что, в отличие от регистра сведений, для регистра накопления две записи с одинаковыми полями — вполне нормальная ситуация.

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

Например:

Набор = РегистрыНакопления. Продажи. СоздатьНаборЗаписей () ;


Набор.Отбор.Регистратор.Значение = ВыбДок;


Набор.Прочитать();


Для Каждого движ Из Набор Цикл


	Сообщить(движ.Сумма);


КонецЦикла;

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


Набор.Прочитать() ;


тзЗаписи = Набор.Выгрузить{);


Набор.Загрузить(тзЗаписи);


Набор.Записать();


 

Можно выгружать в массив и загружать из массива только одну колонку набора записей, для чего предназначены методы ВыгрузитьКолонку и ЗагрузитьКолонку:


МассивОстатков = Набор.ВыгрузитьКолонку("Количество");


Набор.ЗагрузитьКолонку(МассивОстатков,"Количество");

Выгружаются и загружаются записи, имеющие тот же индекс, что и элементы массива (индексация записей набора и элементов массива начинается с 0).

Для удаления записей из набора существует два метода Удалить и Очистить. Первый метод удаляет запись с заданным индексом, но в качестве параметра можно передавать и саму запись (объект типа РегистрНакопленияЗапись). Второй метод полностью очищает набор, удаляя все записи. Обратите внимание, что записи удаляются из набора, а не из регистра накопления. Для чтения записей или итогов регистра, кроме методов Выбрать, Остатки и Обороты, могут быть использованы запросы, о чем рассказано ниже в этой главе. О самом механизме запросов вы можете прочитать в главе «Запросы».

Модуль набора записей

У набора записей регистра накопления есть собственный модуль, который открывается из окна редактирования свойств регистра. Можно считать, что модуль набора записей является аналогом модуля любого другого прикладного объекта, например, модуля справочника или модуля документа. В модуле набора записей регистра накопления могут располагаться процедуры-обработчики событий ПередЗаписью и ПриЗаписи. Их назначение точно такое же, как у модуля набора записей регистра сведений, описанного в предыдущей главе.

Выборка из регистра накопления

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

Выборка = РегистрыНакопления.Остатки.Выбрать();


Пока Выборка.Следующий() Цикл


	Сообщить(СокрЛП(Выборка.Товар) + " " +


	СокрЛП(Выборка.Склад) + " " +


	СокрЛП(Выборка.Количество));


КонецЦикла;



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

Выбрать (<Начало интервала>, <Конец интервала>, <Отбор>, <Порядок>) ,

Назначение параметров метода Выбрать таково:

Начало интервала, Конец интервала

Позволяют задать границы интервала и могут иметь тип «дата», МоментВремени или Граница.

Отбор

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

Приведем пример выборки записей регистра накопления за определенный период по заданному товару:

Нач = Новый МоментВремени(ВыбДатаВремяНачала);
Кон = Новый Граница(ЗыбДатаВремяОкончания,ВидГрачицы.Включая);


Отбор = Новый Структура("Товар",ВыбТовар);


Выборка - РегистрыНакопления.ОстаткиТоваров.Выбрать(Нач,Кон,Отбор);


Пока Выборка.Следующий() Цикл


	Сообщить(СокрЛП(Выборка.Товар) + " " +


	СокрЛП(Выборка.Склад) + " " +


	СокрЛП(Выборка.Количество));


КонецЦикла;