Базовые положения
Общие объекты
Общие метаданные
Прикладные объекты
Базовые положения
Общие объекты
Общие метаданные
Прикладные объекты
Задача регистра накопления максимально быстро вернуть остатки или обороты за указанный период. Регистр накопления должен обязательно иметь, ресурс и регистратор – документ который будет являться основанием для записей регистра. Структура хранения остатков следующая: итоги регистров накопления остатков хранят рассчитанные остатки отдельно, на каждый месяц. Итоги регистров оборотов хранят обороты за предыдущий месяц на первое число каждого месяца. В отдельной таблице хранятся актуальные(текущие) остатки по каждому регистру накопления. Следовательно: самым быстрым является получение текущих остатков.
Система берет остатки на начало ближайшего месяца, и исходя из движений за период от нужной даты до рассчитанной вычисляет правильное значение. Например если нам нужны остатки товара на 10.03 система возьмет готовые итоги на 01.03 и прибавит к ним движения которые были за период с 01.03 по 10.03. Таким образом вычислив правильные остатки на 10.03 с минимальным количеством действий.
При записи документа задним числом системе придется пересчитать итоги, с даты документа, по текущую дату рассчитанных итогов. Поэтому массовое перепроведение документов задним числом, может оказать сильное влияние производительность системы. Причем, чем "старше" будут документы, тем выше будет нагрузка на систему.
В связи с тем, что при записи данных в регистр, система пишет одновременно в три таблицы: таблицу регистра, таблицу итогов регистра, и таблицу текущих итогов по регистру. Запись в три таблицы происходит немного дольше, чем просто запись в таблицу регистра.
Если происходит массовое перепроведение документов, или какое то большое добавление записей в регистр, имеет смысл отключить итоги на время записи, потом включить и пересчитать итоги по регистрам которые были отключены.
Запись в регистры накопления, происходит с помощью набора записей с установленным отбором по регистратору. Нужно отметить, что регистр накопления всегда подчинен регистратору, то есть свободной записи в регистр накопления быть не может, регистратор обязан быть(правда он может физически отсутствовать в базе, но ссылка на него все равно должна быть). Здесь приводится код записи в регистр. Запись может происходить как в обработке проведения документа, так и в любом другом месте, главное условие: наличие ссылки над записанный документ регистратор. Следующий код добавляет записи в регистр накопления:
Движения.ОстаткиНаСкладах.Записывать = Истина; Движения.Продажи.Записывать = Истина; Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ОстаткиНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаТовары.Количество; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.Склад = Склад; Движение.Продавец = Продавец; Движение.Количество = ТекСтрокаТовары.Количество; Движение.СуммаБезСкидки = ТекСтрокаТовары.Сумма; Движение.Сумма = ТекСтрокаТовары.Итого; Движение.ДисконтнаяКарта = ДисконтнаяКарта; КонецЦикла;
НаборВРегистр = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей(); НаборВРегистр.Отбор.Регистратор.Значение = НовыйДок; НаборВРегистр.Загрузить(ДвиженияВДокумент.Скопировать(,"Период,Регистратор,Активность,ВидДвижения,Склад,Номенклатура,Качество,Количество")); НаборВРегистр.Записать();