неверно что в 1с предприятие существуют регистры
Что такое регистры 1С:Предприятие и зачем они нужны
Разговор сейчас, в частности, пойдет о регистрах 1С:Бухгалтерии 8. Давайте вкратце выясним, что это такое и зачем оно нужно.
В своём курсе по 1С:Бухгалтерии Предприятия 8 я рассказываю пользователям и о том, как хранятся данные в конфигурации. Конечно, особые подробности тут не нужны, но, тем не менее, необходимо знать, какие виды данных присутствуют в 1С Бухгалтерии 8 и как с ними «управляться». Это важно ещё и потому, что далеко не всегда можно полагаться на то, что в программе есть абсолютно всё, что вам нужно.
Что такое регистры 1С Бухгалтерии и зачем они нужны
Движение документа по регистрам — это записи, вносимые документом в регистры при проведении, называются.
Виды регистров 1С Бухгалтерии
На самом деле, регистры в 1С:Бухгалтерии используются не только для хранения проводок документов, но и для других различных целей. В связи с этим существует несколько видов регистров:
[нажмите на картинку для увеличения]
Справка: как сохранять фото с сайтов
А вот то же самое на примере 1С:Бухгалтерии 8.3:
[нажмите на картинку для увеличения]
Справка: как сохранять фото с сайтов
Просмотр регистров 1С Бухгалтерии
Любой из регистров можно открыть с помощью форм, приведенных мной выше. То есть из общего списка регистров определенного типа. Для примера приведу самый известный регистр — регистр бухгалтерии. Впрочем, это название больше техническое, поскольку для пользователя он называется Журнал проводок.
[нажмите на картинку для увеличения]
Справка: как сохранять фото с сайтов
При открытии любого регистра данные там отображаются «в общей куче». Их можно отфильтровать по необходимым вам параметрам в точности также, как это можно сделать с документами.
Внесение изменений в регистры
Если вы еще раз взглянете на фрагмент содержимого регистра бухгалтерии 1С Предприятие на рисунке выше, то обратите внимание на отсутствие кнопки Добавить. Дело в том, что не во все регистры можно вносить записи напрямую, т.е. открыть его и добавить элементы (строки) вручную, как это можно сделать с документами или справочниками.
Вопрос на засыпку: знаете ли вы, что в некоторые справочники также нельзя вносить данные через всеми любимую кнопку «Добавить». Как думаете, почему?
А вот пример простого регистра сведений, в который записи вручную вносить можно. Использовать такие регистры, конечно, проще.
[нажмите на картинку для увеличения]
Справка: как сохранять фото с сайтов
Если в регистре нет кнопки Добавить, то данные в такие регистры вносятся только так называемыми регистраторами. Смысл понятия регистратор иллюстрирует всё та же картинка с формой регистра бухгалтерии.
Подведём итоги
В регистрах 1С Бухгалтерии хранятся данные, не менее важные, чем записаны в формах документов. Очень важно уметь правильно работать с различными регистрами — это помогает понимать, все ли правильно делает программа (в соответствии с вашими потребностями).
Умение обращаться с регистрами помогает исправлять ошибки в учете.
Особенности разных регистров, внесение в них данных, типы регистраторов, различие между периодическими и непериодическими регистрами, а также многое другое, я рассматриваю в онлайн курсе 1С:Бухгалтерии 8, представленному на данном сайте.
Хранение данных 1С Предприятие 8.3. Регистры 1С. Описание и виды
В этой статье будет описано: Хранение данных 1С Предприятие 8.3. Регистры 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. Эта проводка представляет собой поступление в банк оплаты от покупателя.
Сальдо — это остаток денег на счете, он может быть как положительным, так и отрицательным. Остаток получается сложением всех сумм, которые приходили на счет и которые уходили с него.
Некоторые счета всегда имеют положительный остаток (например, деньги на расчетном счете или в кассе, товары на складе). Такие счета являются активными, и сальдо у них дебетовое.
Некоторые счета всегда имеют отрицательный остаток (например, реализация товаров, на склад товар пришел по одной цене, продался уже с другой, более высокой, т. е. со счета «Реализация товаров» уйдет больше денег, чем придет на него). Такие счета являются пассивными, и сальдо у них кредитовое.
Наконец, часть счетов может иметь положительное сальдо, а может и отрицательное (например, какой-либо контрагент может задолжать нам, а можем и мы ему). Такие счета называются активно-пассивными.
Если сложить сальдо по всем счетам, сумма обязательно должна быть равна нулю. Если это так, то бухгалтерский баланс сходится.
Остаток по счетам позволяет нам видеть итоговую картину: сумму товаров на складах, сумму денег на расчетных счетах и в кассе, задолженность перед поставщиками и т. д. Однако этого недостаточно. Нам также важно видеть сумму не в общем, а по конкретному складу или даже товару, задолженность не перед всеми поставщиками, а перед конкретными. Для этого используются единицы аналитического учета, которые называются субконто. Например, для счета 28.1 (товары на складе) может иметься два субконто: «Номенклатура» (т. е. товары) и «Склады».
Итак, самая различная информация, как для оперативного учета, так и для бухгалтерского, внесенная документами, может храниться в регистрах.
Немного о регистрах в 1с
В любой конфигурации 1с 8.2 можно увидеть такой вид объектов, как регистры. Основное их предназначение — оптимизация получения данных для отчетов. Существует четыре вида реистров: регистры сведений, регистры накоплений, регистры бухгалтерии и регистры расчета. И хотя предназначены эти виды для решения разных задач, уже по тому, что они все называются «регистрами» можно догадаться, что они имеют и нечто общее.
Во-первых, как уже упоминалось, как объекты конфигурации они нужны для более быстрого считывания информации из базы данных, например в запросах. Регистры можно сравнить с каталогом книжной библиотеки (раньше их составляли на бумажных карточках). То есть это не только хранение информации (данных), но и ее систематизация (создание определенной структуры), когда в конкретный регистр попадают данные (например, из документов разного вида) и при необходимости ее можно достаточно быстро оттуда извлечь и вывести, например, в отчет или обработать иным образом. В общем случае основное использование регистров в 1с можно изобазить следующей схемой: «Документ — Регистр — Отчет», хотя существуют и исключения.
В-третьих, регистры имеют табличную структуру, но она отличается от структуры объектных таблиц. Так что вы не найдете таких классов, как РегистрСсылка или РегистрОбъект. Состав таблицы регистра зависит от его свойств.
В-четвертых, данные в регистры записываеются в виде наборов записей. Каждый набор состоит из одной или нескольких записей. При этом на запись в наборе нельзя сослаться или обратиться к ней. А также ни набор записей, ни запись в наборе не могут иметь состояния «пометка на удаление».
В-пятых, при обращении в запросах к регистрам для получения данных существует возможность обратиться не только к физическим таблицам регистра, но и к виртуальным таблицам, которые представляют из себя вложенный запрос, получающий данные по определенным параметрам. Параметры виртуальной таблицы задаются в зависимости от конкретных потребностей по получению данных из таблиц регистров.
Терперь поговорим об особенностях каждого вида регистров:
1. Регистры сведений
Пожалуй, самый простой вид регистра. В отличие от регистров другого вида, его ресурс может имень не только числовое значение, но и другой тип данных.
Имеет особое свойство, не используемое в других видах регистров — периодичность.
Может не иметь регистратора, то есть быть независимым, в этом случае записи производятся непосредственно в регистр, минуя регистрирующий документ (то самое исключение из общей схемы использования регистров в 1с). Тогда как остальные виды регистров должны иметь хотя бы один документ-регистратор.
Кроме того, данный вид регистра имеет автоматический контроль уникальности записей по периоду (периодичность, указанная в свойствах регистра) и измерениям. То есть среди записей регистра не может быть более одной записи с одинаковыми показателями период+измерение+регистратор(если он есть). Уникальность записей в других видах регистров осуществляется по регистратору.
2. Регистры накоплений
Предназначен для накопления числовых покателей (ресурсов) и делится на два подвида — Остатки и Обороты. Отличие между ними заключается в том, что Регистр накопления Остатки предназначен для получения информации о состоянии «на момент времени», а Обороты — информации о данных «за период».
Данные регистра накопления хранятся в БД в виде двух таблиц — таблица движений и таблица итогов. Обращение напрямую возможно только к таблице движений.
3. Регистры бухгалтерии
Похож на регистр накопления, но предназназначен для систематизации данных о бухгалтерских проводках. Впрочем он может использоваться не только для бухгалтерского, но и для любого другого вида учета.
4. Регистры расчета
Этот вид регистра предназначен не только для хранения, накопления и систематизации данных, но и для реализации сложных механизмов периодческих расчетов. Для этого в свойствах регистра расчета необходимо определить еще один объект 1с — план видов расчета. То есть работа регистра этого вида невозможна без определения для него конкретного плана видов расчета.
Можно сказать, что регистр расчета используется и для хранения информации о видах расчета, и для хранения результатов расчетов, и для промежуточных значений расчетов. Основное его предназначение в конфигурациях 1с — это расчеты начислений, например, заработной платы и других выплат сотрудникам. И для реализации этих задач при определении параметров регистра расчета, в нем возможно указать связь с графиком времени, что позволяет производить расчеты в зависимости от того времени, которое задано в этом графике. Сам график времени должен быть определен с помощью соответствующего регистра сведений.
Таким образом, можно сказать, что регистр расчета имеет в итоге самую сложную структуру по сравнению с другими видами регистров в 1с.
Неверно что в 1с предприятие существуют регистры
Документы – суть ведения учета в 1С. Каждый документ имеет результат, например пришло товаров +10 шт.
Отчеты – позволяют смотреть результаты. Суммируют эти результаты и показывают пользователю.
Однако документов много и если бы приходилось суммировать их результаты, то это было бы слишком сложно. Поэтому придуман лучший способ!
Документы записывают свои результаты (называют «движения») в специальные таблицы – регистры 1с, которые сами суммируют результаты, чтобы отчет просто отобразил заранее посчитанные итоги.
Сегодня мы поговорим про регистры 1С и их использование.
Регистр 1с – это таблица, такая же как и в Excel, каждый документ пишет в регистр 1с одну или несколько строк своих движений (результатов) с каким-либо знаком – плюс или минус. Это значит, что итого регистра 1С изменилось на соответствующую цифру.
Документ, который записал движения в регистр 1С, называют Регистратор. Дата и время движения равны (в 99% случаев) дате документа. Дату движения называют Период.
Каждый регистр 1С учитывает обычно движения какого нибудь одного справочника. Например, регистр 1С Товары на складах – движения товаров (в терминах 1С «номенклатуры») – сколько поступило товаров на склад, сколько убыло. Регистр 1С Взаиморасчеты с контрагентами (покупателями и поставщиками) – движения договоров с контрагентами – сколько нам стал должен контрагент после покупки или сколько мы ему должны после оплаты. Справочник, в разрезе которого ведется регистр называют основным измерением (аналитикой) регистра 1С.
Конечно же никто не делает одно основное измерение к у регистра 1С. Ведь если мы учитываем движения товаров, то нам интересно не только какой товар уменьшился или прибавился, но и например, по какому складу. Поэтому всегда есть три-пять дополнительных измерений «на всякий случай», которые можно назвать дополнительной аналитикой регистра 1С.
Как документ проводится по регистрам?
Движения документа по регистрам 1С
Посмотрим как работают регистры 1С. Вот у нас есть документ поступления товаров, в котором мы видим, что поступил товар Масло на склад Главный.
С точки зрения логики и математики этот документ имеет результат:
Масло кремлевское, Главный склад +10 (шт)
Проверим – так ли это?
Этот пункт меню покажет нам все движения документа, которые он сделал по регистрам. Как мы видим, документ сделал движения по целой куче регистров 1С, в каждый из которых он записал разную информацию (в соответствии с назначением регистра 1С). По регистру 1С Товары на складах он сделал ту проводку, которую мы с Вами рассчитали.
Как же это выглядит в регистре 1С? Откроем регистр 1С через меню Операции.
Открылся регистр 1С. Данных в нем много. Сделаем отбор только по нашему документу.
В результате мы видим движение нашего документа по регистру 1С. Оно ровно совпадает с тем, что мы рассчитали вручную:
Если мы поставим отбор не по документу, а по номенклатуре (точно таким же образом), то мы увидим движения всех документов, которые трогали эту номенклатуру. Один документ – мы купили товар. Другой – продали. Итого естественно сам регистр 1С не показывает – для этого нужно использовать отчет или запрос.
Регистры 1С бывают разные (ниже мы обсудим это). Проводки по разным регистрам 1С выглядят тоже по разному. Мы сейчас смотрели проводки по регистру накопления 1С. Вот так выглядят проводки нашего этого же документа по бухгалтерскому регистру 1С, который работает на основании бухгалтерского (налогового) плана счетов 1С.
Зачем нужны регистры 1С
Регистры 1С бывают разных видов. Цель использования регистра 1С зависит от его вида.
Регистр накопления 1С с видом «Остатки» обозначает, что будут хранится движения (приходы и расходы, которые также называют «Обороты») и дополнительно будут автоматически рассчитываться итоги (которые называют «Остатки»).
Регистр оборотов 1С ничем не отличается от регистра остатков, за исключением того, что у него не рассчитываются автоматически остатки.
Регистр оборотов 1С используют в том случае, когда у справочника логически не может быть остатка. Если нам надо учитывать продажи товаров, то мы будем использовать регистр оборотов.
Таблица движений в разрезе видов расчета и периодов. Используется в начислении заработной платы (называют Сложные периодические расчеты).
Где находятся регистры 1С
Когда мы с Вами обсуждали справочники и документы, то мы говорили, что они обычно расположены в тех или иных меню.
Регистры 1С – это внутренний, программистский объект 1С. Пользователи с ним не работают. Пользователи смотрят результаты в отчетах. Поэтому никакие регистры 1С в интерфейс пользователя обычно не выведены и их через меню открыть нельзя.
Конечно же это не касается двух программистских меню. В толстом клиенте меню Операции (в интерфейсе пользователя с административными правами):
В тонком клиенте меню Все функции, которое аналогично меню Операции, но по умолчанию спрятано (см. пункт меню Сервис, чтобы его включить):
В конфигураторе регистры расположены в соответствующих ветках.
Как происходит работа с регистрами 1С
Как мы уже обсудили только что – документ «проводится» по регистрам 1С. Понятие процесса «проведение» — имеется ввиду запись документом в регистры 1С своих результатов. Как не сложно догадаться – если документ не проведен, то он ничего не записал в регистр 1С. Это используется для создания черновиков документов.
В списке документов в первой колонке отображается статус документа. Зеленая галочка – документ проведен. В следующих колонках отмечено по каким типам регистров 1С проведен документ (наличие этих колонок зависит от конфигурации). «У» управленческий учет – регистры накопления 1С. «Б» и «Н» бухгалтерский и налоговый учет – бухгалтерские регистры 1С.
Чтобы провести документ, нажмите на него в списке правой кнопкой и нажмите Провести.
Или в самом документе кнопки проведения. Также кнопка ОК записывает и проводит документ.
Проведение документа бывает оперативное (когда дата проводимого документа больше чем дата существующих документов) и неоперативное (дата меньше, например, вчера), последнее еще называют «работа задним числом». Подробнее об этом мы обсуждали в уроке про даты в 1С.
Проведение документа в коде (в программе) прописывается программистом. Для этого откройте модуль объекта любого документа (как это сделать мы обсуждали в уроке про модули 1С). Найдите строку вида «Процедура ОбработкаПроведения(». Раскройте крестик и Вы видите программу проведения этого документа.
- Настройка проведения документа происходит следующим образом:
После этого нажмите кнопку Конструктор движений. Эта кнопка генерирует код (программу) для указанной выше процедуры ОбработкаПроведения(). Поэтому Вы должны использовать или эту кнопку или писать код вручную, так как эта кнопка затирает написанный вручную код.
Задача проста – Вы видите справа вверху реквизиты документа, слева внизу реквизиты регистра 1С. Нужно заполнить какой реквизит документа попадет в какой реквизит регистра 1С. Помочь в этом может кнопка «Заполнить выражения».
Настройка и разработка Регистров 1С
Основные особенности Регистров 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 же наследование и полиморфизм реализованы в общем случае, что делает ее значительно более универсальной и применимой в большем количестве случаев. Фактически, в ней можно реализовать любую логику регистров, ведь они отличаются исключительно способом расчета вычисляемых свойств на основе данных из этих регистров.