Регистры сведений и регистры накопления в 1с чем отличается
Немного о регистрах в 1с
В любой конфигурации 1с 8.2 можно увидеть такой вид объектов, как регистры. Основное их предназначение — оптимизация получения данных для отчетов. Существует четыре вида реистров: регистры сведений, регистры накоплений, регистры бухгалтерии и регистры расчета. И хотя предназначены эти виды для решения разных задач, уже по тому, что они все называются «регистрами» можно догадаться, что они имеют и нечто общее.
Во-первых, как уже упоминалось, как объекты конфигурации они нужны для более быстрого считывания информации из базы данных, например в запросах. Регистры можно сравнить с каталогом книжной библиотеки (раньше их составляли на бумажных карточках). То есть это не только хранение информации (данных), но и ее систематизация (создание определенной структуры), когда в конкретный регистр попадают данные (например, из документов разного вида) и при необходимости ее можно достаточно быстро оттуда извлечь и вывести, например, в отчет или обработать иным образом. В общем случае основное использование регистров в 1с можно изобазить следующей схемой: «Документ — Регистр — Отчет», хотя существуют и исключения.
В-третьих, регистры имеют табличную структуру, но она отличается от структуры объектных таблиц. Так что вы не найдете таких классов, как РегистрСсылка или РегистрОбъект. Состав таблицы регистра зависит от его свойств.
В-четвертых, данные в регистры записываеются в виде наборов записей. Каждый набор состоит из одной или нескольких записей. При этом на запись в наборе нельзя сослаться или обратиться к ней. А также ни набор записей, ни запись в наборе не могут иметь состояния «пометка на удаление».
В-пятых, при обращении в запросах к регистрам для получения данных существует возможность обратиться не только к физическим таблицам регистра, но и к виртуальным таблицам, которые представляют из себя вложенный запрос, получающий данные по определенным параметрам. Параметры виртуальной таблицы задаются в зависимости от конкретных потребностей по получению данных из таблиц регистров.
Терперь поговорим об особенностях каждого вида регистров:
1. Регистры сведений
Пожалуй, самый простой вид регистра. В отличие от регистров другого вида, его ресурс может имень не только числовое значение, но и другой тип данных.
Имеет особое свойство, не используемое в других видах регистров — периодичность.
Может не иметь регистратора, то есть быть независимым, в этом случае записи производятся непосредственно в регистр, минуя регистрирующий документ (то самое исключение из общей схемы использования регистров в 1с). Тогда как остальные виды регистров должны иметь хотя бы один документ-регистратор.
Кроме того, данный вид регистра имеет автоматический контроль уникальности записей по периоду (периодичность, указанная в свойствах регистра) и измерениям. То есть среди записей регистра не может быть более одной записи с одинаковыми показателями период+измерение+регистратор(если он есть). Уникальность записей в других видах регистров осуществляется по регистратору.
2. Регистры накоплений
Предназначен для накопления числовых покателей (ресурсов) и делится на два подвида — Остатки и Обороты. Отличие между ними заключается в том, что Регистр накопления Остатки предназначен для получения информации о состоянии «на момент времени», а Обороты — информации о данных «за период».
Данные регистра накопления хранятся в БД в виде двух таблиц — таблица движений и таблица итогов. Обращение напрямую возможно только к таблице движений.
3. Регистры бухгалтерии
Похож на регистр накопления, но предназназначен для систематизации данных о бухгалтерских проводках. Впрочем он может использоваться не только для бухгалтерского, но и для любого другого вида учета.
4. Регистры расчета
Этот вид регистра предназначен не только для хранения, накопления и систематизации данных, но и для реализации сложных механизмов периодческих расчетов. Для этого в свойствах регистра расчета необходимо определить еще один объект 1с — план видов расчета. То есть работа регистра этого вида невозможна без определения для него конкретного плана видов расчета.
Можно сказать, что регистр расчета используется и для хранения информации о видах расчета, и для хранения результатов расчетов, и для промежуточных значений расчетов. Основное его предназначение в конфигурациях 1с — это расчеты начислений, например, заработной платы и других выплат сотрудникам. И для реализации этих задач при определении параметров регистра расчета, в нем возможно указать связь с графиком времени, что позволяет производить расчеты в зависимости от того времени, которое задано в этом графике. Сам график времени должен быть определен с помощью соответствующего регистра сведений.
Таким образом, можно сказать, что регистр расчета имеет в итоге самую сложную структуру по сравнению с другими видами регистров в 1с.
Регистр сведений и регистр расчета. Просто о сложном
В система 1С существует 4 вида регистров:
Первые два регистра мы разбирали в предыдущей статье. Вспомним, для чего они нужны.
Регистр накопления — это таблица данных, которая «накапливает» информацию из документов. Такие регистры составляют основу механизма учета движения средств: денег, товаров, материалов и так далее.
Регистр бухгалтерии используется в механизме бухгалтерского учета и позволяет вести многоуровневый и многомерный аналитический учет, учет по нескольким планам счетов; ведение количественного, суммового и валютного учета по отдельным разрезам аналитики и т. д. Однако стоит отметить, что данный регистр можно использовать не только для ведения бухгалтерского учета, но и для ведения управленческого учета, учета МСФО и многих других. Имея несколько регистров бухгалтерии, вы можете обеспечить себе параллельный учет.
По своей структуре этот регистр напоминает регистр накопления и состоит из измерений, в разрезе которых хранятся произвольные данные ‒ ресурсы и реквизиты для хранения дополнительной информации.
Хоть регистр сведений и похож на другие регистры по структуре, но есть в нем некая особенность, которая отличает его от всех других: записи в регистр сведений может делать не только документ.
Есть два подвида регистра сведений:
подчинен регистратору: документ делает записи при проведении;
не подчинен регистратору: запись осуществляется не при проведении документа.
Но и это еще не все. Есть еще одна особенность, которая отличает регистр сведений от других регистров: он может быть периодическим и непериодическим.
Регистры сведений, информация которых изменяется во времени, называются Периодическими. Если информация изменяется иначе, эти регистры называют непериодическими. Периодичность может быть разной: может быть периодичность в секунду, минуту, час и т.д., максимум — год.
Возьмем для примера опять регистр сведений «Курсы валют». Данный регистр является периодическим, так как информация в нем изменяется каждый день, т.е. на каждый день мы получаем новый курс.
Исходя из всего вышенаписанного, структура регистра сведений выглядит следующим образом:
При этом мы понимаем, что наличие столбцов «Период» и «Регистратор» зависит от типа регистра.
Период, регистратор и измерения составляют ключ уникальности записей в регистре. Это говорит о том, что в одной таблице не может быть несколько записей с одинаковым периодом, регистратором и измерениями.
Например, в регистре «Курсы валют» мы не можем встретить за один день по одной и той же валюте разные курсы. Такое состояние таблицы введет в ступор как самого пользователя, так и машину с ее алгоритмами.
Регистры сведений применяются для хранения различной информации, которая может использоваться в прикладных задачах. Информация в регистре сведений хранится в определенных разрезах, которые называются измерениями, а еще она может изменяться во времени. Записи в регистры сведений могут делать не только документы.
Из очевидных областей применения регистров расчета можно выделить следующие: расчет заработной платы, расчет квартплаты, расчет арендной платы.
По своей структуре регистры расчета похожи на регистры накопления или регистры сведений. Они так же, как и регистры накопления имеют измерения, ресурсы, реквизиты. Но принцип действия регистров расчета абсолютно другой. Структура и принцип работы данного регистра тесно связаны с Планом видов расчета.
План видов расчета (ПВР) — объект метаданных конфигурации, хранящий в себе сведения о типах видов расчетов и определяющий влияние разных расчетов друг на друга
Один план видов расчета может использоваться в нескольких регистрах расчета, но один регистр расчета не может использовать несколько планов видов расчета одновременно.
Регистр расчета является таблицей, в которой хранятся рассчитанные данные. А в плане видов расчета хранятся алгоритмы расчета этих данных.
Данный регистр является периодическим. Каждая запись относится к определенному периоду времени. Параметр периода может быть:
Исходя из всего написанного выше, структура регистра расчета выглядит следующим образом:
Как уже говорилось, большая часть алгоритма расчета указывается в плане видов расчета. Рассмотрим, на что мы с вами можем повлиять на примере самого распространенного вида начисления «Оплата по окладу».
Сам план видов расчета чем-то напоминает справочник и выглядит следующим образом:
Открываем «Оплата по окладу» и на первой вкладке видим следующее:
Именно на этой вкладке мы указываем формулу для расчета этого показателя, говорим системе с какой периодичностью он должен рассчитываться и не только. Это тот случай, когда мы сами можем создать и изменить алгоритм расчета показателей и тем самым повлиять на результат записей в регистре.
Так как регистр расчета является периодическим, прослеживается зависимость не только от времени, но и от его вида. Что это значит? Это значит, что мы можем настроить разные виды времени, которые будут влиять на сам расчет показателей. Например работа в выходные оплачивается в двойном размере.
Также, мы можем указать некоторые зависимости, например, от территориального расположения: районный коэффициент влияет на конечный результат.
Мы с вами понимаем, что помимо оплаты по окладу, мы начисляем сотруднику командировочные, отпускные, больничные и т.д. И чтобы не произошло наложения одного вида расчета на другой, указывается их приоритет. Например, сотрудник с 1 по 10 число был в отпуске, мы ему начислили и выплатили отпускные, зарплату должны ему начислить теперь за период с 11 по 31 число, так как у отпуска приоритет выше и он «вытесняет» нашу оплату по окладу.
Кроме того, мы можем повлиять на следующее: будут ли рассчитываться НДФЛ и различные взносы, а также как отразить данный вид начисления в бухгалтерском учете.
Стоит понимать, что для создания своего плана видов расчетов вам необязательно делать его именно таким же. Все эти вкладки, поля и логика работы были созданы программистами компании 1С. Вы можете создать нечто свое.
Итак, как же выглядит наша таблица регистра расчета
Из всего вышенаписанного можно сделать вывод, что регистр расчета, помимо того, что хранит в себе некую информацию, еще и рассчитывает ее, основываясь на предыдущих записях и привязанного к нему плана видов расчета.
Мы прошли с Вами цикл от документов к регистрам. Как бы сложно это не звучало, документы и регистры являются подготовительным этапом для формирования отчетности. Они помогают собрать и накопить всю информацию, чтобы отчеты смогли использовать ее в своих нуждах. Именно про отчеты мы и поговорим в следующей статье.
Хотите узнавать о новых публикациях и быть в курсе наших новостей?Подпишитесь
Как могли бы выглядеть регистры в 1С при наличии ООП
В 1С одним из ключевых элементов системы являются регистры. Этот термин имеет свой аналог в английском языке — ledger. Он первоначально появился в бухгалтерской практике, но со временем его логика начала использоваться и в других сферах.
В отличие от 1С, где регистры являются одним из встроенных типов, в самой платформе lsFusion такого понятия нет. Зато в ней есть наследование, полиморфизм и агрегации, что, в частности, позволяет реализовать аналогичную логику регистров. В этой статье на примерах я покажу как именно.
Регистр — это набор записей, каждая из которых отражает некоторое изменение состояния для некоторого множества субъектов (или измерений).
В 1С различают 4 вида регистров:
Регистры накоплений
Любую запись в регистре можно рассматривать как объект некоторого абстрактного класса. Предположим нужно реализовать простой регистр, который рассчитывает остаток по товару на складе.
Для этого объявим абстрактный класс SkuLedger:
Формально, один экземпляр которого будет отражать единичное изменение остатка по заданному товару и заданному складу на определенное количество (положительное или отрицательное).
Зададим у него измерения как абстрактные свойства типов Sku (товар) и Stock (склад) соответственно. Их нужно будет реализовать при наследовании конкретных классов от класса регистра:
| 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) |
| 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); |
Весь код по созданию одного такого регистра логично положить в отдельный модуль, который затем подключать по мере необходимости.
Теперь покажем, как проводить по регистру документы. Предположим у нас объявлен документ поступления товаров на склад:
| CLASS Receipt ‘Поступление на склад’ ; dateTime ‘Дата/время’ = DATA DATETIME (Receipt); stock ‘Склад’ = DATA Stock (Receipt); |
CLASS ReceiptDetail ‘Строка поступления на склад’ ;
receipt ‘Поступление’ = DATA Receipt (ReceiptDetail) NONULL DELETE ;
sku ‘SKU’ = DATA SKU (ReceiptDetail);
| dateTime(ReceiptDetail d) += dateTime(receipt(d)); |
stock(ReceiptDetail d) += stock(receipt(d));
sku(ReceiptDetail d) += sku(d);
quantity(ReceiptDetail d) += quantity(d);
Количество и товар мы подставляем непосредственно из строки, а время и склад из документа.
Рассмотрим более сложный случай, когда объявлен документ перемещения со склада на склад:
| CLASS Transfer ‘Перемещение со склада на склад’ ; posted ‘Проведен’ = DATA BOOLEAN (Transfer); dateTime ‘Дата/время’ = DATA DATETIME (Transfer); |
fromStock ‘Склад (откуда)’ = DATA Stock (Transfer);
toStock ‘Склад (куда)’ = DATA Stock (Transfer);
CLASS TransferDetail ‘Строка отгрузки со склада’ ;
transfer ‘Поступление’ = DATA Transfer (TransferDetail) NONULL DELETE ;
sku ‘SKU’ = DATA SKU (TransferDetail);
| EXTEND CLASS TransferDetail : SkuLedger; |
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)); |
| dateTime(TransferSkuLedger d) += dateTime(transfer(transferDetail(d))); |
stock(TransferSkuLedger d) += toStock(transfer(transferDetail(d)));
sku(TransferSkuLedger d) += sku(transferDetail(d));
quantity(TransferSkuLedger d) += quantity(transferDetail(d));
Пользуемся тем, что у вновь созданного класса есть ссылка на исходный, который его породил.
К слову, в 1С с этим есть определенные проблемы, так как строка документа может порождать только одну запись в регистре:
Система обеспечивает контроль уникальности записей, хранящихся в регистре накопления. Благодаря этому в регистре накоплений не может находиться двух записей, относящихся к одной и той же строке одного и того же документа.
Также важным отличием является то, что вся логика задается декларативно, а не императивно на проведении документа. Это позволяет более эффективно обновлять регистр при изменениях в документе, не требует полного распроведения и проведения документов. Если изменилась только одна запись в документе, то обновления в регистре затронут только одну запись.
Регистр сведений
В отличие от регистра накоплений, регистр сведений рассчитывает не сумму показателя, а последнее значение действующее на определенное время.
Объявление такого регистра абсолютно идентично логике регистра накоплений. Построим для примера регистр изменения цены поступления:
| CLASS ABSTRACT PriceLedger ‘Регистр изменения цены поступления’ ; |
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) BY stock(l), sku(l); |
В индекс и в порядок добавляется сам регистр, так как, в отличие от 1С, в lsFusion могут быть записи с одинаковым временем. В этом случае, в качестве дополнительного выражения будет использоваться внутренний код записи регистра.
Проведение по регистру сведений идет также, как и в регистре накоплений:
| EXTEND CLASS ReceiptDetail : PriceLedger; |
dateTime(ReceiptDetail d) += dateTime(receipt(d));
stock(ReceiptDetail d) += stock(receipt(d));
sku(ReceiptDetail d) += sku(d);
price(ReceiptDetail d) += price(d);
Заключение
Схема регистров в 1С позволяет делать то, что в обычном программировании реализуется при помощи наследования и композиции (там регистр был бы просто интерфейсом). Тем самым, они пытаются в частном случае решить проблему отсутствия этих механизмов в 1С платформе. Хотя, фактически, регистр является интерфейсом, который может реализовывать либо сама строка документа, либо некий агрегированный объект (композиция), созданный на ее основе.
В lsFusion же наследование и полиморфизм реализованы в общем случае, что делает ее значительно более универсальной и применимой в большем количестве случаев. Фактически, в ней можно реализовать любую логику регистров, ведь они отличаются исключительно способом расчета вычисляемых свойств на основе данных из этих регистров.
Что такое регистры 1С:Предприятие и зачем они нужны
Разговор сейчас, в частности, пойдет о регистрах 1С:Бухгалтерии 8. Давайте вкратце выясним, что это такое и зачем оно нужно.
В своём курсе по 1С:Бухгалтерии Предприятия 8 я рассказываю пользователям и о том, как хранятся данные в конфигурации. Конечно, особые подробности тут не нужны, но, тем не менее, необходимо знать, какие виды данных присутствуют в 1С Бухгалтерии 8 и как с ними «управляться». Это важно ещё и потому, что далеко не всегда можно полагаться на то, что в программе есть абсолютно всё, что вам нужно.
Что такое регистры 1С Бухгалтерии и зачем они нужны
Для примера предположим, что данные будут браться из документов. В таком случае каждый раз при формировании любого программе понадобилось бы перебрать все документы, извлечь из них данные и только потом на основании этих данных составить затребованный отчет.
Регистры 1С — это просто таблицы, содержащие колонки и строки. Принцип тот же самый, что и у таблиц Excel или обычных «» таблиц.
Движение документа по регистрам — это записи, вносимые документом в регистры при проведении, называются.
Виды регистров 1С Бухгалтерии
На самом деле, регистры в 1С:Бухгалтерии используются не только для хранения проводок документов, но и для других различных целей. В связи с этим существует несколько видов регистров:
А вот то же самое на примере 1С:Бухгалтерии 8.3:
Просмотр регистров 1С Бухгалтерии
Никогда не помешает знать, где именно находятся в программе те или иные регистры и зачем каждый из них нужен. Ну хотя бы потому, что однажды (и очень даже запросто!) может потребоваться их просмотреть с целью поиска и исправления ошибок в учете (типичная задача при ).
Любой из регистров можно открыть с помощью форм, приведенных мной выше. То есть из общего списка регистров определенного типа. Для примера приведу самый известный регистр — регистр бухгалтерии. Впрочем, это название больше техническое, поскольку для пользователя он называется Журнал проводок.
При открытии любого регистра данные там отображаются «в общей куче». Их можно отфильтровать по необходимым вам параметрам в точности также, как это можно сделать с документами.
Внесение изменений в регистры
Если вы еще раз взглянете на фрагмент содержимого регистра бухгалтерии 1С Предприятие на рисунке выше, то обратите внимание на отсутствие кнопки Добавить. Дело в том, что не во все регистры можно вносить записи напрямую, т.е. открыть его и добавить элементы (строки) вручную, как это можно сделать с документами или справочниками.
Вопрос на засыпку: знаете ли вы, что в некоторые справочники также нельзя вносить данные через всеми любимую кнопку «Добавить». Как думаете, почему?
А вот пример простого регистра сведений, в который записи вручную вносить можно. Использовать такие регистры, конечно, проще.
Если в регистре нет кнопки Добавить, то данные в такие регистры вносятся только так называемыми регистраторами. Смысл понятия регистратор иллюстрирует всё та же картинка с формой регистра бухгалтерии.
Подведём итоги
В регистрах 1С Бухгалтерии хранятся данные, не менее важные, чем записаны в формах документов. Очень важно уметь правильно работать с различными регистрами — это помогает понимать, все ли правильно делает программа (в соответствии с вашими потребностями).
Умение обращаться с регистрами помогает исправлять ошибки в учете.
Особенности разных регистров, внесение в них данных, типы регистраторов, различие между периодическими и непериодическими регистрами, а также многое другое, я рассматриваю в онлайн курсе 1С:Бухгалтерии 8, представленному на данном сайте.
