Инструменты пользователя

Инструменты сайта


1c:объекты:регистр_накоплений

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

Общее описание

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

Получение остатков на определенную дату

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

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

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

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

Запись в регистр накопления

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

  1. Обработка проведения
    Движения.ОстаткиНаСкладах.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
     
    Для Каждого ТекСтрокаТовары Из Товары Цикл
    	Движение = Движения.ОстаткиНаСкладах.Добавить();
    	Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    	Движение.Период = Дата;
    	Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
    	Движение.Склад = Склад;
    	Движение.Количество = ТекСтрокаТовары.Количество;
     
    	Движение = Движения.Продажи.Добавить();
    	Движение.Период = Дата;
    	Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
    	Движение.Склад = Склад;
    	Движение.Продавец = Продавец;
    	Движение.Количество = ТекСтрокаТовары.Количество;
    	Движение.СуммаБезСкидки = ТекСтрокаТовары.Сумма;
    	Движение.Сумма = ТекСтрокаТовары.Итого;		
    	Движение.ДисконтнаяКарта = ДисконтнаяКарта;		
    КонецЦикла;
  2. Откуда угодно
    НаборВРегистр = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
    НаборВРегистр.Отбор.Регистратор.Значение = НовыйДок;
    НаборВРегистр.Загрузить(ДвиженияВДокумент.Скопировать(,"Период,Регистратор,Активность,ВидДвижения,Склад,Номенклатура,Качество,Количество"));
    НаборВРегистр.Записать();
Только авторизованные участники могут оставлять комментарии.
1c/объекты/регистр_накоплений.txt · Последнее изменение: 2014/12/25 07:25 — admin