Регистр накопления в 1С 8.3

Курс

Для чего нужен регистр накопления

Представим, что есть некое торговое предприятие, которое автоматизировано на платформе 1С. В конфигурации есть два документа: приход товара и расход товара. В каждом документе есть табличная часть с товарами, количеством и суммой. При поступлении товара оформляется приход товара, при продаже — расход товара.

После одного рабочего дня директору нужно узнать: сколько на оптовом складе стульев и на какую сумму были продажи за сегодня? Чтобы посчитать сколько стульев на складе нужно сложить все количество стульев из приходных документов на оптовый склад, потом сложить все количество стульев из расходных документов с оптового склада, а потом вычесть из общего прихода общий расход. Для получения оборота продаж за один день нужно сложить сумму всех расходных документов за этот день. Так как предприятие отработало всего один день, то такие расчеты будут выполняться не очень долго. Но что будет после недели, месяца, года? А если за один день создается по миллиону документов? Такие расчеты могут выполняться по несколько минут, а то и часов.

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

Для решения этой проблемы предназначен регистр накопления.

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

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

Виды регистров накопления:

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

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

Создание регистра накопления

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

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

Это регистр накопления остатков.

Перейдем на закладку Данные. Здесь можно создать измерения и ресурсы регистра накопления. Ресурсы — это то что будет накапливаться в регистре. Для ресурса доступен только один тип данных — число. Измерения — это то, в разрезе чего нужно хранить ресурсы. Тут уже можно выбрать как примитивные, так и ссылочные типы данных.

В нашем примере измерениями регистра накопления будут Товар и Склад. А ресурс — Количество. Типы СправочникСсылка.Товары, СправочникСсылка.Склады и Количество (15, 3):

Измерения и ресурсы регистра накопления

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

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

В результате в базе данных будет создана следующая таблица:

ПериодРегистраторНомер строкиВид движенияСкладТоварКоличество

В колонке Период хранится дата записи. В колонке Регистратор — ссылка на документ-регистратор. В колонке Номер строки — уникальный номер записи в пределах одного регистратора, заполняется автоматически. В колонке Вид движения — значение системного перечисления ВидДвиженияНакопления, возможны два значения: приход или расход. В колонках Склад, Товар и Количество будут храниться значения измерений и ресурсов регистра накопления.

Это таблица движений регистра накопления. При проведении документы будут добавлять сюда записи.

Текущие итоги

Также в базе данных будет создана таблица итогов регистра накопления. Для регистра накопления остатков в ней будут храниться рассчитанные итоги каждого ресурса в разрезе всех измерений на дату 01.11.3999 г. Это текущие итоги регистра накопления остатков.

ПериодСкладТоварКоличество

Добавим в обработку проведения документов код для формирования движений в регистре накопления:

Проведем один документ Приход товара с двумя товарами. В результате в таблицу движений будут добавлены следующие строки:

Таблица движений регистра накопления

Зеленый плюс в начале означает, что это вид движения Приход.

Сразу после записи таблицы движений будет пересчитана таблица итогов. Она будет выглядеть следующим образом:

ПериодСкладТоварКоличество
01.11.3999ОсновнойКровать2
01.11.3999ОсновнойШкаф3

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

Таблица движений регистра накопления

Снова будет пересчитана таблица итогов, изменится колонка Количество:

ПериодСкладТоварКоличество
01.11.3999ОсновнойКровать6
01.11.3999ОсновнойШкаф9

Проведем еще один приход, за апрель:

Таблица движений регистра накопления

Таблица итогов:

ПериодСкладТоварКоличество
01.11.3999ОсновнойКровать6
01.11.3999ОсновнойШкаф9
01.11.3999ОсновнойТумбочка5

Была добавлена новая строка с тумбочкой.

Теперь проведем расход товара от 1 июня:

Таблица движений регистра накопления

В таблицу движений были добавлены три строки с типом Расход. А также была пересчитана таблица итогов, общее количество было уменьшено:

ПериодСкладТоварКоличество
01.11.3999ОсновнойКровать5
01.11.3999ОсновнойШкаф8
01.11.3999ОсновнойТумбочка4

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

Промежуточные итоги

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

  1. платформа получит текущие итоги по кровати (5 штук)
  2. к полученному количеству прибавит все записи таблицы движений с типом расход, которые расположены между датами 1 июня и самой последней записью (5 + 1 = 6)
  3. вычтет все записи таблицы движений с типом приход , которые расположены между датами 1 июня и самой последней записью (6 — 4 = 2)
  4. и вернет полученный результат (2 кровати).

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

Чтобы в таблице итогов появились промежуточные итоги нужно установить период итогов. Для этого в пользовательском режиме в функциях технического специалиста (во всех функциях для старых версий платформы) в группе Стандартные нужно выбрать обработку Управление итогами:

Управление итогами

В открывшейся обработке внизу нужно переключиться на полные возможности:

Управление итогами

Затем нужно выделить нужный регистр накопления, нажать кнопку Установить период итогов, в открывшемся окне в поле Максимальный хранимый период итогов для регистров накопления ввести 30.06.2021 и нажать ОК:

Установить период итогов

После этого таблица итогов примет следующий вид:

ПериодСкладТоварКоличество
01.05.2021ОсновнойТумбочка5
01.06.2021ОсновнойТумбочка5
01.06.2021ОсновнойКровать2
01.06.2021ОсновнойШкаф3
01.07.2021ОсновнойТумбочка4
01.07.2021ОсновнойКровать8
01.07.2021ОсновнойШкаф5
01.11.3999ОсновнойТумбочка4
01.11.3999ОсновнойКровать5
01.11.3999ОсновнойШкаф8

Если сейчас понадобится получить остаток на 01.06.2021, то платформа просто возьмет его из таблицы итогов. Если понадобится получить остаток на 25.06.2021, то платформа возьмет остаток на 01.07.2021, прибавит к нему все движения с типом расход между 25.06.2021 и 01.07.2021 и вычтет все движения с типом приход между 25.06.2021 и 01.07.2021.

Промежуточные и текущие итоги хранятся по всем измерениям и по всем ресурсам, если хотя бы один из ресурсов не равен нулю. Как только все ресурсы по определенному набору измерений становятся равными нулю, такая запись будет удалена из таблицы итогов. Если 01.06.2021 продать все тумбочки с основного склада, то на 01.07.2021 и на 01.11.3999 остаток будет равным нулю. Нет смысла хранить такие записи в таблице итогов и они будет удалены. Запись на 01.06.2021 останется в таблице итогов, потому что остаток был не нулевой.

Итоги хранятся помесячно. Итоги за май хранятся с датой 01.06.2021, итоги за июнь с датой 01.07.2021 и т.д.

Если сейчас добавить новую запись в таблицу движений за 10.06.2021, то в таблице итогов будут автоматически пересчитаны итоги за июнь и текущие итоги. Если добавить запись за 10.05.2021, то будут пересчитаны итоги за май, за июнь и текущие итоги. Если добавить новую запись за 01.01.2021, то в таблице итогов будут добавлены новые записи за январь, февраль и март. А также будут пересчитаны итоги за апрель, май, июнь и текущие итоги. Однако, если добавить запись за 01.08.2021, то будут пересчитаны только текущие итоги, потому что в обработке управления итогами мы установили максимальный период равным 30.06.2021. Запись с промежуточными итогами за август не будет добавлена.

Алгоритм заполнения таблицы итогов регистра остатков:

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

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

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

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

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

Здесь подойдет регистр накопления оборотов. Добавим новый регистр Продажи, на закладке Основные в поле Вид регистра выберем Обороты:

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

Оборотный регистр накопления почти ничем не отличается от регистра остатков, за исключением нескольких отличий:

  • У регистра оборотов в таблице движений нет поля Вид движения
  • В таблице итогов помесячно хранятся итоговые обороты всех ресурсов.

Если на закладке Данные создать измерение Контрагент и ресурс Сумма:

Измерения и ресурсы регистра накопления

То таблица движений будет выглядеть следующим образом:

ПериодРегистраторНомер строкиКонтрагентСумма

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

В результате при проведении нескольких документов будут сформированы следующие движения:

Таблица движений регистра накопления

Таблица итогов оборотного регистра будет выглядеть следующим образом:

ПериодКонтрагентСумма
01.02.2021ИП Иванов500
01.05.2021ИП Петров700
01.06.2021ИП Иванов4000
01.06.2021ИП Петров1000
01.09.2021ИП Иванов5000

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

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

Для оборотного регистра в свойства измерения можно выключить его использование в итогах:

Использование в итогах

В этом случае колонка с данным измерением будет удалена из таблицы итогов. А если в регистре было только одно измерение, то будет удалена вся таблица итогов.

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

Разделение итогов

Если параллельно одновременно добавить несколько записей в регистр накопления по одному составу измерений, то это не помешает записи в регистр, потому что у записей будет отличаться регистратор. Однако это помешает обновлению итогов регистра, потому что обновляться будет одна запись в таблице итогов. Все параллельные операции будут выстроены в очередь и выполнены одна за другой.

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

Для решения данной проблемы был придуман механизм разделения итогов.

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

Например, если два пользователя одновременно проведут документ Расход товара по одному контрагенту, то в таблице итогов будет добавлено две записи:

ПериодКонтрагентСуммаРазделитель
01.06.2021ИП Иванов1000
01.06.2021ИП Иванов2001

У первого пользователя разделитель = 0, у второго = 1. При следующем обращении к таблице итогов на чтение или при пересчете итогов интерактивно, строки с разными разделителями будут свернуты:

ПериодКонтрагентСуммаРазделитель
01.06.2021ИП Иванов3000

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

Разрешить разделение итогов

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

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

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

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

Форма набора записей

Для регистра накопления можно создать только одну форму — Форма списка или Форма набора записей:

Форма набора записей

Через данную форму можно увидеть таблицу движений регистра:

Таблица движений регистра накопления

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

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

Доступа к таблице итогов нет.

Управление итогами

Рассмотрим обработку Управление итогами:

Управление итогами

С помощью подменю Итоги можно включать/выключать использование итогов для выбранного регистра накопления:

Итоги

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

С помощью подменю Текущие итоги можно включать/выключать использование текущих итогов для выбранного регистра накопления. Данная настройка имеет смысл только для регистров остатков:

Текущие итоги

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

С помощью подменю Разделение итогов можно включать/выключать использование механизма разделения итогов для выбранного регистра накопления:

Разделение итогов

Если у регистра запрещено разделение итогов в конфигураторе на закладке Прочее, то в данной обработке изменение режима разделения итогов будет недоступно. Настройка в конфигураторе влияет на физическое наличие колонки в таблице итогов, настройка в данной обработке только на возможность его использования:

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

Установить период итогов

Данная настройка имеет смысл только для регистра остатков.

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

Пересчет итогов

Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

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