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

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

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

В 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.3. Регистры 1С. Описание и виды

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

Измерения и ресурсы. Описание

С регистром непосредственно связаны такие понятия, как измерения и ресурсы.

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

Можно сказать так, что к каждому измерению регистра относится некоторое количество ресурсов.
Например, к каждому складу (склад — это измерение) относится некоторое количество (количество — это ресурс) товара (товар — это тоже измерение).

Виды регистров 1С. Регистры: сведений, накопления, бухгалтерии, расчетов

Регистры бывают разных видов.

  • Регистры сведений 1С — таблицы для хранения различной информации, наподобие таблиц MS Excel. В регистрах сведений можно, например, хранить информацию о ценах и скидках номенклатуры по разным прайс-листам или информацию о курсах валют.
  • Регистры накопления 1С — таблицы, в которых хранятся остатки, обороты и накапливаемые итоги. Например, если у нас было некоторого товара 20 штук и 3 штуки были проданы, то итоговый остаток, 17 штук, будет храниться в регистре накопления.
  • Регистры бухгалтерии 1С — таблицы, основанные на бухгалтерских планах счетов. Такие таблицы используются для ведения бухгалтерского учета, именно в регистры бухгалтерии записываются бухгалтерские проводки.
  • Регистры расчетов 1С — таблицы, основанные на планах видов расчетов. Такие таблицы служат для ведения учета по начислению заработной платы.

В системе «1С:Предприятие 7.7» регистры и проводки являли собой различные объекты дерева метаданных.
В системе «1С:Предприятие 8.3» бухгалтерские проводки записываются в один из видов регистров: регистры бухгалтерии.

Принципы построения бухгалтерского учета и структура бухгалтерских проводок

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

Основные задачи бухгалтерского учета

Основными задачами бухгалтерского учета являются:

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

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

Бухгалтерский счет

Бухгалтерский счет — это способ группировки и отражения в учете отдельных видов средств, их источников и хозяйственных процессов. То есть, объект бухгалтерской аналитики. Совокупность таких объектов, охватывающая все сферы деятельности предприятия и установленная законодательно, представляет собой план счетов.
Разумеется, в деятельности отдельно взятого предприятия весь план счетов никогда не используется. Кто-то занимается производством и торговлей, кто-то — оказанием услуг, а кто-то — выращиванием нутрий. В каждом отдельно взятом случае будет задействован не весь план счетов, а лишь часть его.
Каждому бухгалтерскому счету присвоен свой номер и название, установленные законодательством.
В плане счетов выделяются и группируются экономически однородные счета — например, счета учета основных средств (10), подразделяющиеся на 10.1 (земельные участки), 10.2 (капитальные затраты по улучшению земель), 10.3 (дома и сооружения), 10.4 (машины и оборудование) и т. д., или, например, 36 (расчеты с покупателями и заказчиками), подразделяющиеся на 36.1 (расчеты с отечественными покупателями), 36.2 (расчеты с иностранными покупателями) и т.д.
В конфигурациях, использующих планы счетов, они доступны в меню Операции | Планы счетов. В конфигурации «Управление торговлей», которую я взял в качестве примера, планы счетов не используются, поэтому в списке планов счетов пусто.
Движение денежных средств между бухгалтерскими счетами называется проводкой и может быть записано, например, следующим образом: Д31.1/К36.1. Эта проводка представляет собой поступление в банк оплаты от покупателя.

  • Д31.1 означает «дебет 31.1» — деньги пришли на счет 31.1 (текущие счета в национальной валюте), т. е. дебет проводки — это счет, на который приходят деньги.
  • К36.1 означает «кредит 36.1» — деньги пришли со счета 36.1 (расчеты с отечественными покупателями), т. е. кредит проводки — это счет, с которого приходят деньги.

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

Некоторые счета всегда имеют положительный остаток (например, деньги на расчетном счете или в кассе, товары на складе). Такие счета являются активными, и сальдо у них дебетовое.
Некоторые счета всегда имеют отрицательный остаток (например, реализация товаров, на склад товар пришел по одной цене, продался уже с другой, более высокой, т. е. со счета «Реализация товаров» уйдет больше денег, чем придет на него). Такие счета являются пассивными, и сальдо у них кредитовое.
Наконец, часть счетов может иметь положительное сальдо, а может и отрицательное (например, какой-либо контрагент может задолжать нам, а можем и мы ему). Такие счета называются активно-пассивными.
Если сложить сальдо по всем счетам, сумма обязательно должна быть равна нулю. Если это так, то бухгалтерский баланс сходится.
Остаток по счетам позволяет нам видеть итоговую картину: сумму товаров на складах, сумму денег на расчетных счетах и в кассе, задолженность перед поставщиками и т. д. Однако этого недостаточно. Нам также важно видеть сумму не в общем, а по конкретному складу или даже товару, задолженность не перед всеми поставщиками, а перед конкретными. Для этого используются единицы аналитического учета, которые называются субконто. Например, для счета 28.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

Ссылка на основную публикацию