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