Чем отличается регистр сведений от регистра накопления

от admin

Использование основных объектов конфигурации

Наша учебная конфигурация уже имеет все основные блоки, необходимые для организации учета OOO «На все руки мастер».

Мы уже описали предметы учета, отразили факты движения этих предметов, накопили некоторую информацию о движениях и представили эту информацию в виде некоторой выходной формы. Поэтому все дальнейшее изложение, будет посвящено тому, как «приблизить» эту систему учета к реальным потребностям 000 «На все руки мастер».

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

Объект конфигурации регистр сведений

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

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

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

Периодичность регистра сведений можно определить одним из следующих значений:

в пределах секунды,

в пределах месяца,

в пределах квартала,

в пределах года.

в пределах регистратора (если установлен режим записи — «Подчинение регистратору»)

Периодический регистр сведений всегда содержит служебное поле «Период», добавляемое системой автоматически. Оно имеет тип Дата, и служит для указания факта принадлежности записи к какому-либо периоду. При записи данных в регистр, платформа всегда приводит значение этого поля к началу того периода, в который он попадает. Например, если в регистр сведений с периодичностью в пределах месяца записать данные, в которых период указан как 08.04.2004, то регистр сохранит эти данные со значением периода равным 01.04.2004.

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

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

Если продолжать сравнение с регистром накопления, то можно сказать, что регистр сведений предоставляет больше свободы в редактировании хранимых данных. Наряду с тем, что регистр сведений может использоваться в режиме подчинения регистратору (когда записи регистра сведений «привязаны» к документу-регистратору), регистр сведений может использоваться и в независимом режиме, в котором пользователю предоставляется полная свобода интерактивной работы с данными регистра. Регистр сведений, не использующий подчинение регистратору, называют независимым регистром сведений.

Создание периодического регистра сведений Цены

Приступим к созданию периодического регистра сведений, который будет хранить развернутые во времени розничные цены материалов и стоимости услуг, оказываемых нашим OOO «На все руки мастер».

Откроем конфигуратор и создадим новый объект конфигурации Регистр сведений. Назовем его «Цены». Установим периодичность этого регистра в пределах секунды.

Перейдем на закладку «Данные» и создадим измерение регистра «Номенклатура» с типом СправочникСсылка.Номенклатура. Укажем, что это измерение будет ведущим.

Создадим измерение «Номенклатура» и укажем, что оно будет ведущим.

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

После этого создадим новый ресурс «Цена», тип Число, длина 15, точность 2, неотрицательное.

Теперь запустим 1С:Предприятие в режиме отладки и посмотрим, как работает наш периодический регистр сведений Цены.

Зададим стоимость услуг нашего 000 «На все руки мастер» следующим образом:

После этого зададим розничные цены на материалы:

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

Теперь посмотрим, как можно использовать заданные нами цены в Документе «ОказаниеУслуги».

Создание функции РозничнаяЦена()

Сначала мы создадим функцию, которая будет возвращать нам актуальную розничную цену номенклатуры. Откроем конфигуратор, в ветке Общие — Общие модули создадим новый объект конфигурации Модуль и назовем его «РаботаСоСправочниками».

Разместим в нем следующий текст:

Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт

//создать вспомогательный объект Отбор

Отбор = Новый Структура(«Номенклатура»,ЭлементНоменклатуры);

//получить актуальные значения ресурсов регистра

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

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

Для получения розничной цены мы будем передавать в функцию два параметра:

АктуальнаяДата — параметр типа Дата, который будет определять точку на оси времени, на которую нас интересует значение розничной цены.

ЭлементНоменклатуры — ссылка на элемент справочника «Номенклатура», для которого мы хотим получить розничную цену.

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

Во второй строке мы обращаемся к менеджеру регистра сведений «Цены» (РегистрыСведений.Цены) и выполняем метод ПолучитьПоследнее(), который возвращает нам значения ресурсов наиболее поздней записи регистра, которая соответствует передаваемой дате («АктуальнаяДата») и значениям измерений регистра («Отбор»).

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

Теперь проверим, как работает эта функция.

Автоматическое заполнение цены в документе ОказаниеУслуги

Итак, задача, которая перед нами стоит, заключается в следующем. При создании документа «ОказаниеУслуги» нам необходимо обеспечить автоматическое заполнение поля «Цена» после того, как пользователь выберет услугу. Причем цена услуги должна определяться исходя из даты создаваемого документа.

Найдем в конфигураторе документ «ОказаниеУслуги» и откроем его форму «ФормаДокумента». Откроем свойства поля ввода, расположенного в колонке «Номенклатура» и внизу списка найдем событие «При изменении». Нажмем на кнопку с лупой и в открывшейся заготовке обработчика события напишем следующий текст:

ПроцедураПереченьНоменклагурыНоменклатураПриИзменении(Элемент)

//получить текущую строку табличной части

СтрокаТабличнойЧасти = ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;

//установить цену

СтрокаТабличнойЧасти.Цена = РозничнаяЦена (Дата, Элемент.Значение);

//пересчитать сумму строки

РассчитатьСумму(СтрокаТабличнойЧасти);

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

Прокомментируем содержимое обработчика.

Первая строка обработчика вам уже знакома — мы получаем текущую строку табличной части документа, так как она нам понадобится в дальнейшем.

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

В заключение мы вызываем нашу процедуру «РассчитатьСумму» из общего модуля «РаботаСДокументами» для того, чтобы она пересчитала итоговую сумму в строке нашего документа.

Проверим, как теперь работает наш документ. Запустим 1С:Предприятие в режиме отладки и откроем регистр сведений «Цены». Для транзистора Philips добавим следующим числом новую цену:

Теперь откроем документ ОказаниеУслуги №1. Как вы помните, этим документом мы как раз «израсходовали» один такой транзистор.

Установим дату документа равной той дате, когда было задано первое значение цены транзистора, и повторим выбор транзистора в колонке «Номенклатура» табличной части документа. Автоматически установится первое значение цены:

Теперь изменим дату документа на следующий день и снова повторим выбор транзистора. Будет установлено новое значение цены:

Таким образом, в документ подбирается актуальная, на момент создания документа, цена услуги.

Name already in use

1c-interprise-8-3 / Ответы на вопросы.txt

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink

1 contributor

Users who have contributed to this file

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Как могли бы выглядеть регистры в 1С при наличии ООП

image

В 1С одним из ключевых элементов системы являются регистры. Этот термин имеет свой аналог в английском языке — ledger. Он первоначально появился в бухгалтерской практике, но со временем его логика начала использоваться и в других сферах.

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

Регистр — это набор записей, каждая из которых отражает некоторое изменение состояния для некоторого множества субъектов (или измерений).

В 1С различают 4 вида регистров:

Регистры накоплений

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

Для этого объявим абстрактный класс SkuLedger:

CLASS ABSTRACT SkuLedger ‘Регистр изменения остатка товара’ ;

Формально, один экземпляр которого будет отражать единичное изменение остатка по заданному товару и заданному складу на определенное количество (положительное или отрицательное).

Зададим у него измерения как абстрактные свойства типов Sku (товар) и Stock (склад) соответственно. Их нужно будет реализовать при наследовании конкретных классов от класса регистра:

sku ‘SKU’ = ABSTRACT Sku (SkuLedger);
stock ‘Склад’ = ABSTRACT Stock (SkuLedger);
dateTime ‘Дата/время’ = ABSTRACT DATETIME (SkuLedger);
quantity ‘Кол-во’ = ABSTRACT NUMERIC [ 14 , 2 ] (SkuLedger);
balance (Stock st, Sku sk) ‘Остаток’ = GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk;

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

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

CONSTRAINT balance(Stock st, Sku sk) < 0
MESSAGE ‘Остаток по товару на складе должен быть положительным’ ;

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

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

balance (Stock st, Sku sk, INTEGER year) =
GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk AND extractYear(dateTime(l)) = year MATERIALIZED ;

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

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

balance ‘Остаток на время’ (Stock st, Sku sk, DATETIME dt) =
GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk AND dateTime(l) <= dt;
balance ‘Остаток на время’ (Stock st, Sku sk, DATETIME dt) =
currentBalance(sk, st) (-) ( GROUP SUM quantity(SkuLedger l) IF stock(l) = st AND sku(l) = sk AND dateTime(l) > dt);
INDEX dateTime(SkuLedger l);

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

Теперь покажем, как проводить по регистру документы. Предположим у нас объявлен документ поступления товаров на склад:

CLASS ReceiptDetail ‘Строка поступления на склад’ ;
receipt ‘Поступление’ = DATA Receipt (ReceiptDetail) NONULL DELETE ;

sku ‘SKU’ = DATA SKU (ReceiptDetail);

EXTEND CLASS ReceiptDetail : SkuLedger;

stock(ReceiptDetail d) += stock(receipt(d));

Количество и товар мы подставляем непосредственно из строки, а время и склад из документа.

Рассмотрим более сложный случай, когда объявлен документ перемещения со склада на склад:

fromStock ‘Склад (откуда)’ = DATA Stock (Transfer);
toStock ‘Склад (куда)’ = DATA Stock (Transfer);

CLASS TransferDetail ‘Строка отгрузки со склада’ ;
transfer ‘Поступление’ = DATA Transfer (TransferDetail) NONULL DELETE ;

sku ‘SKU’ = DATA SKU (TransferDetail);

dateTime(TransferDetail d) += dateTime(transfer(d));

stock(TransferDetail d) += fromStock(transfer(d));

Так как это расходная операция, то количество берем с минусом, а в качестве склада подставляем склад отправителя.

Так как мы не можем один класс наследовать от другого дважды, то для того, чтобы провести по регистру повторно, создадим агрегированный объект нового класса TransferSkuLedger, который затем наследуем от SkuLedger:

CLASS TransferSkuLedger ‘Перемещение на склад (регистр)’ : SkuLedger;
transferSkuLedger = AGGR TransferSkuLedger WHERE stockTo(transfer(TransferDetail transferDetail));

stock(TransferSkuLedger d) += toStock(transfer(transferDetail(d)));

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

К слову, в 1С с этим есть определенные проблемы, так как строка документа может порождать только одну запись в регистре:

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

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

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

Объявление такого регистра абсолютно идентично логике регистра накоплений. Построим для примера регистр изменения цены поступления:

dateTime ‘Дата/время’ = ABSTRACT DATETIME (PriceLedger);

sku ‘SKU’ = ABSTRACT SKU (PriceLedger);
stock ‘Склад’ = ABSTRACT Stock (PriceLedger);

price ‘Цена’ (Stock st, Sku sk, DATETIME dt) =
GROUP LAST price(PriceLedger l)
ORDER dateTime(l), l
WHERE dateTime(l) <= dt
BY stock(l), sku(l);
INDEX stock(PriceLedger l), sku(l), dateTime(l), l;

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

Проведение по регистру сведений идет также, как и в регистре накоплений:

dateTime(ReceiptDetail d) += dateTime(receipt(d));

stock(ReceiptDetail d) += stock(receipt(d));

Заключение

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

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

Регистры

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

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

В базе данных «1С:Предприятия 8» можно по разному хранить информацию. Например, можно её хранить в виде нескольких измерений. Для этого используются регистр сведений, новый объект конфигурации. Он держит периодичность, то есть что информация можно отобразить по позиции документа или по времени. Через меню «Операции Регистры сведений» открывается список любого из регистра сведений.

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

Например, для регистра сведений «ЦеныНоменклатуры», который содержит эту структуру записи, лежащие там данные будут иметь следующий вид.

Название: Цены номенклатуры - описание: Цены номенклатуры: 9 j Цены Номенклатуры L. Измерения ‘. ТипЦен L. Номенклатура L Характеристика Номенклатуры J Ресурсы J Валюта J Цена J Единица Измерения J ПроцентСкидки Наценки J Способ Расчета Цены = Реквизиты [F1 Формы Команды Макеты

Записи, сохраняющиеся в базе данных, будут выглядеть следующим образом:

Название: Записи - описание: Записи сохраняющиеся в базе данных.: Список Цены номенклатуры _ П X Действия - і н Щ. 3 - О 2 Период Регис. Номе. Актив. Тип цен Номенклатура Характ.. Вал. Цена Единиц. Процент ск. Спосс А 1а -1 05.11.2013 Устан. 5 Розничная цена Ф1 Термопринте. грн 3 520.00 шт 1а -1 05.11.201

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

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

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

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

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

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

Регистр накопления являют собой многомерную систему измерений и могут копить данные числовые в нескольких разрезах. Через меню «Операции -> Регистры накопления» можно просмотреть информацию в регистрах накопления. Возможны отборы списках сортировки ирегистров. Клавиша «Enter» открывает документ-регистратор в списке регистра накопления.

Список Взаиморасчеты с контрагентами _ П X Действия - і н Щ. 3 - О 2 Период =. Регистратор Номе.. Активи.. Договор контрагента С. Орг.. Контрагент Сумма вза. Сут А + 06.12.2013 00:00. .. Платежное. / Основной договор ІЗІ. С.МАРТ М. 11 142.00 + 06

Он служит для «накопления» значений чисел, и каждая запись в нем делает изменение ресурсов хранимых, другими словами, отражает движение в регистре. При увеличении ресурса движение увеличивается (значок «+»), при уменьшении ресурса хранимого → запись идет движением расхода («->).

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

Регистры бухгалтерии

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

Просмотр проводок существует в виде списка регистра бухгалтерии. Через меню «Операции → Регистры бухгалтерии» открывается окно выбора регистра (1.3.10), информацию в регистрах бухгалтерии можно лишь просмотреть. В списках регистров есть сортировки и отборы. Клавиша «Enter» открывает документ-реггистратор в списке регистра

Выбор объекта: Регистр бухгалтерии X Журнал проводок бухгалтерский учет I ОК Журнал проводок налоговый учет Отмена

Регистры расчета

Регистры расчета делают регистрацию различных расчетов, в том числе и начислений зарплаты . Их можно вызвать через меню «Операции -* Регистры расчета». Информацию в регистрах расчета лишь просмотреваемая. В списках регистров можно сделать отборы и сортировки . Клавиша «Enter» в списке регистра расчета открывает документ-регистратор.

Читать:
Постоянно работает вентилятор на компьютере что делать

Related Posts